概述
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