前几天Shaoqing Ren放出了Faster-Rcnn的代码,可以在他的Github上下载得到,上面也有详细的配置说明。
我下载下来,在自己的虚拟机上测试了一下,速度上确实比之前的Fast-Rcnn有提高。
SPP-Net,Fast-Rcnn,Faster-Rcnn都是在Ross Girshick2014年发布的RCNN上面的改进与提高,其中SPP-Net,Faster-Rcnn都是Shaoqing Ren的作品,当然其中还有Kaiming He以及Ross Girshick等微软亚研院研究员的贡献。Shaoqing Ren也是个牛人啊,可以去他的个人主页看看他做的一些工作,ICCV,CVPR,ECCV三大会,PAMI都发过论文,今年Faster-Rcnn还发表在了NIPS上,是我的奋斗目标!
Faster-Rcnn相对于Fast-Rcnn的改进在于将Object Proposal利用CNN网络实现,并与Detection的CNN网络结合实现了一个端到端的Object Detection框架。之前Fast-Rcnn的Proposal是利用Selective Search实现的,SS方法虽然得到的Proposal相对于其他方法是较好的,但是其速度比较慢,更不用说跟利用GPU进行加速的Detection步骤相比,由此Proposal的产生便成为了一个瓶颈。
而Faster-Rcnn便解决了这个问题,不单单是加速了Proposal的产生,还将两个网络结合进行优化,于是原本跟Detection任务分离的Proposal步骤被结合了起来,Detection的结果好坏会通过梯度的回传影响到Proposal网络的参数,Faster-Rcnn实现优化的思路采用的是常见的固定一个更新另一个的策略,固定Proposal网络,更新Detection网络,再固定Detection网络,更新Proposal网络。
参考Shaoqing Ren的配置说明:
(1) 安装Matlab 2014a
(2) 下载源代码
sudo git clone --recursive https://github.com/ShaoqingRen/faster_rcnn.git注意一定要这样从github上下载代码,而不是采用直接下载的方法,那样得到的代码不全。
(3)配置Caffe
将你之前配置过的CaffeMakefile.config
拷贝至./faster-rcnn/external/caffe
,记得修改Matlab接口,接着编译就可以了。
sudo make -j$(nproc) sudo make matcaffe -j$(nproc)
sudo make -j4
sudo make matcaffe -j4
(4) 运行Faster-Rcnn
A. 在faster-rcnn路径下打开Matlab,或者直接打开Matlab再切换到faster-rcnn路径,运行faster_rcnn_build.m
,没有GPU的话在Compiling nms_gpu_mex
时会出错,但其他是能够正常编译的,所以没有关系。
B. 运行startup.m
,会加入其所需路径。
C. 运行fetch_data/fetch_faster_rcnn_final_model.m
,下载所需模型。推荐在作者Github上找百度云盘的下载链接,速度会快上不少,下载完将output
文件夹解压至./faster-rcnn
目录下。
D. 打开experiments/script_faster_rcnn_demo.m
测试文件,没有GPU不要直接运行,其代码默认是用GPU进行测试的,因此在CPU模式下会出错。
修改下代码,不使用GPU即可:
修改前:
%% -------------------- CONFIG -------------------- opts.caffe_version = 'caffe_faster_rcnn'; opts.gpu_id = auto_select_gpu; active_caffe_mex(opts.gpu_id, opts.caffe_version); opts.per_nms_topN = 6000; opts.nms_overlap_thres = 0.7; opts.after_nms_topN = 300; opts.use_gpu = True; opts.test_scales = 600;
修改后:
%% -------------------- CONFIG -------------------- opts.caffe_version = 'caffe_faster_rcnn'; %opts.gpu_id = auto_select_gpu; %active_caffe_mex(opts.gpu_id, opts.caffe_version); opts.per_nms_topN = 6000; opts.nms_overlap_thres = 0.7; opts.after_nms_topN = 300; opts.use_gpu = false; opts.test_scales = 600;
E.运行该测试文件
默认载入的模型是VGG16网络,如果运行过程中出现kill,那就把模型换成ZF的好了。
VGG16网络比较大,可能会出现内存不足,所以在虚拟机或者内存较小的机器上推荐使用小模型ZF来进行测试。
%% -------------------- INIT_MODEL -------------------- %model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_vgg_16layers'); %% VGG-16 model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_ZF'); %% ZF proposal_detection_model = load_proposal_detection_model(model_dir);
F.测试结果
我的CPU是I5-4460,测试速度是比Fast-Rcnn更快的。
fast_rcnn startup done 001763.jpg (500x375): time 3.675s (resize+conv+proposal: 2.754s, nms+regionwise: 0.921s) 004545.jpg (500x375): time 4.640s (resize+conv+proposal: 2.887s, nms+regionwise: 1.753s) 000542.jpg (500x375): time 3.654s (resize+conv+proposal: 3.019s, nms+regionwise: 0.634s) 000456.jpg (500x375): time 4.502s (resize+conv+proposal: 2.959s, nms+regionwise: 1.543s) 001150.jpg (500x375): time 4.026s (resize+conv+proposal: 2.930s, nms+regionwise: 1.097s) mean time: 4.099s Cleared 0 solvers and 2 stand-alone nets