------------------配置环境 Windows7x64 Matlab2014Ra VS2013 Opencv2.49 CUDA6.5 GTX970----------
https://github.com/ShaoqingRen
红色圈中为必须下载的文件。 注意fast-rcnn/faster-rcnn区别!!
下载CUDA6.5,1中的caffe_mex是在cuda6.5下编译的,所以需要额外安装cuda6.5,不用卸载已经安装的cuda7.5。
安装,自定义选择安装 cuda6.5中的 compute tookit 跟samples就可以,samples可以安装到别的文件夹节省空间。
编译,打开.\CUDA V6.5 samples中的Samples_vs2013.sln,切换为releaseX64开始编译,可以不用bug编译。。
测试,打开.\samples\bin\win64\Release,将queryDevice拖到cmd窗口,显示 GPU信息和cuda版本号,有7.5和6.5两个版本。
解压faster-rcnn-master为程序根目录.\ (eig F:\FasterR-CNN-Master)
解压caffe_mex到根目录下的.\external 中
解压model_ZF到根目录下的.\models中
解压faster_rcnn_final_model到根目录下,得到output文件夹,以及测试图片
在根目录下新建.\data\selective_search_data文件夹,将selective_search_data解压进去(训练用到)
---------编译------------
在根目录下运行,function faster_rcnn_build(),若出错且提示“无法打开 nms_gpu_mex.o”,则找到.\functions\nms\nvmex.m 文件,修改VS的安装路径到你自己的路径,默认安装在C盘。再重新编译..即可
在根目录下运行startup.m,配置搜索路径...
-----------测试---------------
一定要在根目录下运行,function script_faster_rcnn_demo(),子目录下运行会提示“cd错误,无法更改xx文件夹”
另一个解决办法是在 此函数最开始加上cd操作。
在Initial Model分割线下选择要测试的model。测试vgg,matlab容易崩溃,只测试zf,测试结果见图, 78ms/每张。
下载VOC数据集,并解压,将对应数据整理成以下三个文件夹(如下图所示,分别为VOC2007devikt/test/trainval),放在根目录.\datasets中。 注意此处没有按原教程中的方法将全部数据放在一个VOCdevkit2007文件夹中,而是分开放置,否则后续训练会Bug,Bug显示数据集读取错误...,根本原因是使用了VOC自带的VOCinit.m脚本来配置VOCopts参数。 该函数位置在“VOC2007devkit\VOCcode\VOCinit.m”。
本文将VOC中的 devkit,trainval, test三个部分分开放置,并重新写了3个数据初始化函数voc2007_initX(),voc2007_dataX(),get_voc_optsX()。运行时替换掉原程序对应函数即可。
voc2007_dataX()指向刚才整理好的VOC数据集三个文件的地址,相当于源程序中的voc2007_devkit();
voc2007_initX()从VOC中读取信息,相当于原始的VOCinit.m脚本。
get_voc_optsX()返回VOC数据的配置结果,即VOCopts,相当于原来的get_voc_opts();
所以三个函数的作用分别是 “定位到数据集→读取数据信息→返回数据配置结果”
修改后提取出的VOCopts如下,如果使用原脚本VOCinit.m,则train和test情况下,红框部分都为VOC2007,导致路径重复从而数据读取冲突。此外VOCopts中多了deviktdir,用于替换需要临时addpath(deviktdir,VOCcode)为搜索路径的情况(目前发现只有一处)。
faster-cnn原程序包中缺少.\data这个文件夹,需要到fastr-cnn版本中去下载,下载完拷贝过来即可,否则训练fastr-cnn时会找不到ROI...
------训练---------------
在.\experments中找到下面训练函数,一个faster版本,一个fast版本。。分别训练,以下是训练结果
function script_faster_rcnn_VOC0712_ZF(),
function script_fast_rcnn_VOC2007_ZF() ,
// 数据集定位函数,放在目录 F:\FasterR-CNN-Master\experiments\+Dataset\private
function path = voc2007_dataX() path = './datasets'; <span style="white-space:pre"> </span> % 可以将数据集存放到其他位置以节省空间,比如 '=G:\VOC2007' end
function VOCopts = get_voc_optsX(path, varargin) tmp = pwd; cd(path); if(nargin==1) addpath('VOCcode'); % 原始数据配置方式下,VOCinit.m数据配置脚本的路径 VOCinit; elseif(nargin==2) image_set = varargin{1}; VOCopts = voc2007_initX(image_set); % 更改之后的数据配置函数voc2007_initX()函数,该函数已在.\datasets中 else error(sprintf('too much params for get_voc_opts()...')); end cd(tmp);
// 数据集初始化函数, 放在目录 F:\FasterR-CNN-Master\datasets,或者自定义的数据集存放路径下
function VOCopts = voc2007_initX(image_set) clear VOCopts % 注意此函数必须放置在VOC2011/orVOC2007/orVOC2006数据集目录下 % use VOC2006 or VOC2007 data VOC2006=false; % set true to use VOC2006 data % dataset if VOC2006 VOCopts.dataset='VOC2006'; else VOCopts.dataset='VOC2007'; end % get current directory with forward slashes cwd=cd; cwd(cwd=='\')='/'; % change this path to point to your copy of the PASCAL VOC data VOCopts.datadir=[cwd '/']; % .datesets/ VOCopts.devkitdir=[VOCopts.datadir,'VOC2007devkit/']; % .datesets/ % change this path to a writable directory for your results VOCopts.resdir=[VOCopts.datadir 'VOC2007devkit/results/' VOCopts.dataset '/']; % change this path to a writable local directory for the example code VOCopts.localdir=[VOCopts.datadir 'VOC2007devkit/local/' VOCopts.dataset '/']; % initialize the test set VOCopts.testset='val'; % use validation data for development test set % VOCopts.testset='test'; % use test set for final challenge % initialize main challenge paths setname=strcat(VOCopts.dataset,image_set); %setdir: VOC2007trainval,VOC2007test VOCopts.annopath=[VOCopts.datadir setname '/Annotations/%s.xml']; VOCopts.imgpath=[VOCopts.datadir setname '/JPEGImages/%s.jpg']; VOCopts.imgsetpath=[VOCopts.datadir setname '/ImageSets/Main/%s.txt']; VOCopts.clsimgsetpath=[VOCopts.datadir setname '/ImageSets/Main/%s_%s.txt']; VOCopts.clsrespath=[VOCopts.resdir 'Main/%s_cls_' VOCopts.testset '_%s.txt']; VOCopts.detrespath=[VOCopts.resdir 'Main/%s_det_' VOCopts.testset '_%s.txt']; % initialize segmentation task paths VOCopts.seg.clsimgpath=[VOCopts.datadir setname '/SegmentationClass/%s.png']; VOCopts.seg.instimgpath=[VOCopts.datadir setname '/SegmentationObject/%s.png']; VOCopts.seg.imgsetpath=[VOCopts.datadir setname '/ImageSets/Segmentation/%s.txt']; VOCopts.seg.clsresdir=[VOCopts.resdir 'Segmentation/%s_%s_cls']; VOCopts.seg.instresdir=[VOCopts.resdir 'Segmentation/%s_%s_inst']; VOCopts.seg.clsrespath=[VOCopts.seg.clsresdir '/%s.png']; VOCopts.seg.instrespath=[VOCopts.seg.instresdir '/%s.png']; % initialize layout task paths VOCopts.layout.imgsetpath=[VOCopts.datadir setname '/ImageSets/Layout/%s.txt']; VOCopts.layout.respath=[VOCopts.resdir 'Layout/%s_layout_' VOCopts.testset '_%s.xml']; % initialize the VOC challenge options if VOC2006 % VOC2006 classes VOCopts.classes={... 'bicycle' 'bus' 'car' 'cat' 'cow' 'dog' 'horse' 'motorbike' 'person' 'sheep'}; else % VOC2007 classes VOCopts.classes={... 'aeroplane' 'bicycle' 'bird' 'boat' 'bottle' 'bus' 'car' 'cat' 'chair' 'cow' 'diningtable' 'dog' 'horse' 'motorbike' 'person' 'pottedplant' 'sheep' 'sofa' 'train' 'tvmonitor'}; end VOCopts.nclasses=length(VOCopts.classes); VOCopts.poses={... 'Unspecified' 'SideFaceLeft' 'SideFaceRight' 'Frontal' 'Rear'}; VOCopts.nposes=length(VOCopts.poses); VOCopts.parts={... 'head' 'hand' 'foot'}; VOCopts.maxparts=[1 2 2]; % max of each of above parts VOCopts.nparts=length(VOCopts.parts); VOCopts.minoverlap=0.5; % initialize example options VOCopts.exannocachepath=[VOCopts.localdir '%s_anno.mat']; VOCopts.exfdpath=[VOCopts.localdir '%s_fd.mat'];
------------------------任意图片上的测试效果----------------------------------------------