在windows上配置py-faster-rcnn和调参经验

概述

update:

可以用我整理的[这份代码](https://github.com/zchrissirhcz/py-faster-rcnn/tree/rbg-windows),下载后只需要自行编译caffe即可。

以下是原文:

Faster R-CNN是流行的目标检测算法,性能优良,值得使用。Faster R-CNN算法有MATLAB和Python两个版本的代码,Python代码更适合实际工程使用,并且提供了end2end这种更快的训练方式,py-faster-rcnn代码是很好的选择。鉴于windows良好的图形显示水平和容易操作特点,本文给出在windows下配置py-faster-rcnn的教程。

配置py-faster-rcnn,使得能把demo跑起来、能执行训练,需要这几方面的工作:

- 配置cuda、cudnn

- 配置caffe

- 配置lib

- 配置数据集

- 其他注意项

1.配置cuda、cudnn

这个不多说,强烈建议在有Nvidia中高端显卡的机器上配置。cuda7.5+cudnn5或者cuda8.0+cudnn5都是可以的。cudnn能加速计算,节省显存,值得配置。

2.配置caffe

2.1获取caffe源码和初步修改

py-faster-rcnn的官方readme里面给的`caffe-fast-rcnn`不能直接在windows下使用,而且已经很久没有更新了。考虑到R-FCN系列工作是在Faster R-CNN算法的基础上进行的,他们的代码一脉相承,不妨把R-FCN所依赖的caffe拿过来,少量修改即可使用。

下载caffe-rfcn:http://github.com/daijifeng001/caffe-rfcn (rfcn的matlab代码所依赖的caffe),重命名为caffe-rfcn-cudnn5(我们在py-faster-rcnn中使用这个目录的caffe)

下载caffe-BVLC http://github.com/BVLC/caffe (caffe官方最新代码),重命名为caffe-BVLC

用caffe-BVLC源码的以下文件替换掉faster rcnn 的对应文件

include/caffe/layers/cudnn_relu_layer.hpp, src/caffe/layers/cudnn_relu_layer.cpp, src/caffe/layers/cudnn_relu_layer.cu

include/caffe/layers/cudnn_sigmoid_layer.hpp, src/caffe/layers/cudnn_sigmoid_layer.cpp, src/caffe/layers/cudnn_sigmoid_layer.cu

include/caffe/layers/cudnn_tanh_layer.hpp, src/caffe/layers/cudnn_tanh_layer.cpp, src/caffe/layers/cudnn_tanh_layer.cu


用caffe源码中的这个文件替换掉faster rcnn 对应文件:

include/caffe/util/cudnn.hpp

将 faster rcnn 中的 src/caffe/layers/cudnn_conv_layer.cu 文件中的所有

cudnnConvolutionBackwardData_v3 函数名替换为 cudnnConvolutionBackwardData

cudnnConvolutionBackwardFilter_v3函数名替换为 cudnnConvolutionBackwardFilter

2.2用vs2013编译caffe

请先确保安装了vs2013和Python。建议使用anaconda2这一无痛安装方式,它安装了Python本身和常见的numpy、scipy等包。

打开caffe-rfcn-cudnn5/windows/CommonSettings.props,开启python和cudnn的选项。cuda默认是7.5的。Python安装路径改成自己的,比如我是`D:\soft\Anaconda2`。

确保安装了vs2013的前提下,双击打开caffe-rfcn-cudnn5/windows/Caffe.sln。

编译选项选择Release模式。所有项目都做:右键->属性-C/C++->常规->将警告视为错误->选择“否”(对于中文语言的操作系统,这一步是需要的,否则编译报错)

在工程列表中,先编译libcaffe。vs2013这个大块头会根据nuget的配置去下载依赖的各种开源库,下载位置是caffe-rfcn-cudnn5同级的NugetPackages目录。这里建议使用nuget的国内代理(比如博客园的),可以参考这篇博客的做法:http://www.cnblogs.com/zjutzz/p/5964300.html

libcaffe的编译大概要十几分钟。然后编译pycaffe。如果你想使用C++接口,那么tools等工程也都去编译好了。tools/caffe.cpp编译出来的caffe.bin就是经典的caffe使用的命令行接口程序。

3.配置lib

请确保vs的编译器cl.exe所在的路径(默认是C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin)加入到了系统PATH中。

找到`proposal_layer.py`中相应的行,改成`param_str`(去掉最后的下划线);

找到`proposal_layer.py`中另一个修改:

```python

#cfg_key = str(self.phase) # either 'TRAIN' or 'TEST'

cfg_key = str('TRAIN' if self.phase == 0 else 'TEST')

```

`lib/rpn和lib/roi_data_layer.py`下的其他的文件,能找到`param_str_`的,都换成`param_str`。

还有就是lib目录代码编译的问题。最后可以用的是这样得到的:

取py-faster-rcnn的lib代码;根据rockie-cz博客里(http://blog.csdn.net/chenzhi1992/article/details/52618386)提供的两个脚本newsetup.py和`setup_cuda.py`进行安装。

记得先在命令行(cmd.exe)里面执行这句(临时起作用,因为我们编译成功后就用不到这个配置了):

SET VS90COMNTOOLS=%VS120COMNTOOLS%

会提示`gpu_nms.cu`找不到,这个从github上的https://github.com/MrGF/py-faster-rcnn-windows/这里下载,然后是`python newsetup.py install; python setup_cuda.py install`。接下来把生成的`.pyd`文件拷贝过去:

```

D:\lib\py-faster-rcnn\lib\build\lib.win-amd64-2.7这里的三个目录nms,pycocotools, utils

-> 【copy to】 D:\lib\py-faster-rcnn\lib

```

4.配置数据集

py-faster-rcnn默认使用pascal voc 2007数据集做fine tune的,请下载它,并放到正确的目录。

注意,如果你是自己的数据集,并且也打算使用voc2007的格式(个人觉得这样最方便),那么推荐你在py-faster-rcnn\data\VOCdevkit2007\VOC2007目录下创建schemes目录,各种数据集先转换为voc2007的格式然后都放在schemes目录下,用到哪个就把哪个方案下的Annotations、ImageSets、JPEGImages目录剪切过来。

5.其他注意项

可能会提示python包没有安装的错误,比如protobuf cython easydict这几个。用pip装一下好了,记得pip最好要先配置一下它的下载来源,可以使用国内比如阿里云的镜像。

使用自己的数据集,还需要注意图片后缀(jpg or png,在lib/datasets/pascal_voc.py)、类别名称和数量(lib/dataset/pascal_voc.py),以及对应到prototxt中也要进行类别相关参数的修改,一个比较trick的方法是直接搜索VGG16的prototxt中21和84的字段,21表示20+1,20个类别+1个背景,84则表示21个类别x4个坐标位置。

再进一步,可以修改anchor了,包括长宽比和base_size的大小。这个不仅要在代码中修改,也要在prototxt中修改。

更进一步,换网络模型,比如用alexnet或者resnet作为后端网络,那么将rpn相关的层、RCNN相关的层、输入数据层、输出层进行插入、修改即可。

在执行训练和测试脚本时,experiment/scritps目录下的.sh脚本文件,在git bash中可以执行,这需要提前安装了git。这种执行方式优点是能打印log到文件。缺点是一旦发生错误中途停止,很可能看不到错误信息。另一种方式是把相关的shell脚本改成bat脚本执行,确保错误信息都输出到屏幕上。缺点是log不能打印到日志了。建议先使用后者,确保网络能跑起来后,再使用第一种做完整训练。

6.enjoy playing!

在cmd和git bash中都可以执行训练和测试了!!

以下是我用`VGG_CNN_M_1024`网络,使用默认的参数(70000次迭代,pascalvoc2007,等),(git bash)跑出来的结果:

```

Evaluating detections

Writing aeroplane VOC results file

Writing bicycle VOC results file

Writing bird VOC results file

Writing boat VOC results file

Writing bottle VOC results file

Writing bus VOC results file

Writing car VOC results file

Writing cat VOC results file

Writing chair VOC results file

Writing cow VOC results file

Writing diningtable VOC results file

Writing dog VOC results file

Writing horse VOC results file

Writing motorbike VOC results file

Writing person VOC results file

Writing pottedplant VOC results file

Writing sheep VOC results file

Writing sofa VOC results file

Writing train VOC results file

Writing tvmonitor VOC results file

VOC07 metric? Yes

AP for aeroplane = 0.6388

AP for bicycle = 0.7123

AP for bird = 0.5643

AP for boat = 0.4522

AP for bottle = 0.3315

AP for bus = 0.6778

AP for car = 0.7442

AP for cat = 0.7216

AP for chair = 0.4077

AP for cow = 0.6321

AP for diningtable = 0.6011

AP for dog = 0.6671

AP for horse = 0.7736

AP for motorbike = 0.7351

AP for person = 0.6695

AP for pottedplant = 0.3445

AP for sheep = 0.5850

AP for sofa = 0.5518

AP for train = 0.6946

AP for tvmonitor = 0.6360

Mean AP = 0.6070

~~~~~~~~

Results:

0.639

0.712

0.564

0.452

0.331

0.678

0.744

0.722

0.408

0.632

0.601

0.667

0.774

0.735

0.670

0.345

0.585

0.552

0.695

0.636

0.607

~~~~~~~~

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

Results computed with the **unofficial** Python eval code.

Results should be very close to the official MATLAB eval code.

Recompute with `./tools/reval.py --matlab ...` for your paper.

-- Thanks, The Management

你可能感兴趣的:(在windows上配置py-faster-rcnn和调参经验)