FastR-CNN / FarsterR-CNN 目标检测

欢迎访问人工智能社区   studyai.com

FastR-CNN / FarsterR-CNN 目标检测_第1张图片


------------------配置环境   Windows7x64   Matlab2014Ra   VS2013   Opencv2.49  CUDA6.5    GTX970----------


1.下载 FasterR-CNN程序包   

    https://github.com/ShaoqingRen
    红色圈中为必须下载的文件。 注意fast-rcnn/faster-rcnn区别!!

    FastR-CNN / FarsterR-CNN 目标检测_第2张图片    

     

2. 配置 CUDA6.5 

  下载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两个版本。    

   FastR-CNN / FarsterR-CNN 目标检测_第3张图片 FastR-CNN / FarsterR-CNN 目标检测_第4张图片FastR-CNN / FarsterR-CNN 目标检测_第5张图片


      


3. 编译并测试 Faster-RCNN

   解压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,配置搜索路径...

   FastR-CNN / FarsterR-CNN 目标检测_第6张图片

   -----------测试---------------

   一定要在根目录下运行,function script_faster_rcnn_demo(),子目录下运行会提示“cd错误,无法更改xx文件夹”

   另一个解决办法是在 此函数最开始加上cd操作,强制cd到根目录,见下图。

   在Initial Model分割线下选择要测试的model。测试vgg,matlab容易崩溃,只测试zf,测试结果见图, 78ms/每张。

    FastR-CNN / FarsterR-CNN 目标检测_第7张图片 FastR-CNN / FarsterR-CNN 目标检测_第8张图片


4. 配置VOC2007训练Faster-RCNN

   下载VOC数据集,并解压,将对应数据整理成以下三个文件夹(如下图所示,分别为VOC2007devikt/test/trainval),放在根目录.\datasets中。 注意此处没有按原教程中的方法将全部数据放在一个VOCdevkit2007文件夹中,而是分开放置,否则后续训练会Bug。Bug显示数据集读取错误...,根本原因是使用了VOC自带的VOCinit.m脚本来配置VOCopts参数,配置完之后得到的路径信息无法区分train/val/set数据集,所以会报错。 该函数位置在“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(); 

    这三个函数的作用分别是 “定位到数据集→配置数据信息→返回数据配置结果”。


    训练前,要找到对应的m文件,对相应函数进行替换,注意只替换函数名,并传入相应参数即可,函数=号左边变量名称不变。

    ------------------------------------------------------------------------------------------

    比如运行训练文件 script_faster_rcnn_VOC2007_ZF.m 之前, 要做如下修改:

    在voc2007_trainval.m/voc2007_trainvaltest.m中,要修改devkit=voc2007_devkit()为 devkit = voc2007_dataX()。

    在imdb_from_voc.m中,要修改VOCopts=get_voc_opts(root_dir)为VOCopts=get_voc_optsX(root_dir,image_set)。(正是这里多加了image_set参数,所以可识别train/val/test)

    在roidb_from_voc.m中,要修改第75行和135行。将这2处的addpath(VOCopts.datadir)替换为addpath(VOCopts.deviktdir,VOCcode)。否则会报错。这是因为修改之后的VOCopts数据配置信息中多了deviktdir,在此2处需要将其添加至临时搜索路径。

        FastR-CNN / FarsterR-CNN 目标检测_第9张图片FastR-CNN / FarsterR-CNN 目标检测_第10张图片

    修改后提取出的VOCopts如下,如果使用原脚本VOCinit.m,则train和test情况下,红框部分都为VOC2007,导致路径重复从而数据读取冲突。    

     FastR-CNN / FarsterR-CNN 目标检测_第11张图片FastR-CNN / FarsterR-CNN 目标检测_第12张图片

    faster-cnn原程序包中缺少.\data这个文件夹,需要到fastr-cnn版本中去下载,下载完拷贝过来即可,否则训练fastr-cnn时会找不到ROI...

    ------训练---------------

    在.\experments中找到下面训练函数,一个faster版本,一个fast版本。。分别训练,以下是训练结果

     function script_faster_rcnn_VOC0712_ZF(),

     function script_fast_rcnn_VOC2007_ZF() ,

     FastR-CNN / FarsterR-CNN 目标检测_第13张图片FastR-CNN / FarsterR-CNN 目标检测_第14张图片


5. VOC2007配置函数

// 数据集定位函数,放在目录 F:\FasterR-CNN-Master\experiments\+Dataset\private     

function path = voc2007_dataX()
    path = './datasets';     	       % 可以将数据集存放到其他位置以节省空间,比如 '=G:\VOC2007'
end


// 数据集配置函数,放在目录 F:\FasterR-CNN-Master\imdb

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'];


   ------------------------任意图片上的测试效果----------------------------------------------

FastR-CNN / FarsterR-CNN 目标检测_第15张图片


备注:cd错误,无法打开xxx,一般是由路径配置错误导致的。


训练过程。。。。。。。

FastR-CNN / FarsterR-CNN 目标检测_第16张图片   



——————————————————————————————————————————

本博客内所有案例,需要源码 或者希望帮忙解决少量运行安装BUG的童鞋 可以加AI技术交流Q群  625691515!


     




你可能感兴趣的:(深度学习-CNN)