本帖主要内容:
- 训练过程中的一些思考.
- Faster RCNN在Linux ubuntu 16.04+cpu 环境下的训练过程, 包括配置caffe, 修改py-faster-rcnn环境为cpu环境, 以及如何准备数据集(数据集准备出错会导致训练出错), 准备成Pascal VOC 标准集格式.
- 训练过程中遇到的问题以及解决办法.
当前进度:
用自己的数据集, ZF网络, 训练max_iters = [2000, 1000, 2000, 1000], 有了些成效.
查了资料, 貌似我已经进入黑盒模式, 需要开始调参了. 和博客上一些高手探讨后, 也给出建议, 你应该多试试看, 这个没有固定因素, 多方面因素会影响结果.
影响定位效果有这几个因素: 数据集质量, 训练次数, 网络参数等等
PART 1
对算法的一些思考:
1. 关于ROI POOLING, RoI polling 的目的就是要把不同大小的RoI 调整到固定的尺寸. 但是在原图中一个proposal 不就是对应feature map上一个点吗,那ROI尺度不就是一个点而已,相同的尺度,为什么还需要ROI?
只是9个proposal的中心对应feature map上同一个点,并不是原图上所有的proposal不同的尺度,映射到feature map只是一个点.所以需要RoI.
思考的问题,待解决的问题:
1. 如果只训练一类, 即车牌, 手头只有3200+ 张图片(车牌这一类数据有3200+张), 应该设置多少迭代数量? 目前为了跑通训练过程, 只设置了50,50,50,50, 为了排除训练问题. 目前训练自己数据集跑通了, 但可能训练迭代次数太少了, 效果不佳. 也有可能是因为没有学习到这些数据, 可能数据集出来问题.
后来设置了[2000, 1000, 2000, 1000], 网络上一些跑过faster rcnn的大神还是建议应该再多点训练数量, 跑个60000都不为过.
2. ImageSet/Main 里面 test.txt, trainval.txt, train.txt, val.txt 里面数量应该如何设置? 博主只有3200+ 车牌, 也是总的图片数量. 官方版test占整个数据集50%, trainval占整个数据集剩下的50%, train占trainval的50%, val占trainval剩下的50%. 如果按这样的比例, 那博主用于train 的车牌图片只剩下800张了.
后来设置了, trainval 90%, test 10%. train是trainval的90%, val是trainval的10%.
PART 2
训练过程
待补充...
1.编译caffe
编译前有一点比较重要, 要把roi_pooling_layer.cpp
和 smooth_L1_loss_layer.cpp 替换成CPU版本, 再编译caffe. 参照如下:
https://github.com/neuleaf/faster-rcnn-cpu
2.准备数据集
准备数据集, 要做成PASCAL VOC 格式. 为什么要这么做? 因为官方给出的RGB大师写的代码是用PASCAL VOC标准数据集的格式(PASCAL VOC数据集很常用, 是CV里面最常用的几种数据集之一), 使用xml标注文件进行训练. 如果想使用自己的数据集训练, 一种是把代码改成适应自己的标注文件, 例如博主使用openalpr的plate_tagger进行标注, 生成的是yaml文件. 另一种, 是提取自己标注的数据, 模仿PASCAL VOC, 制成xml的形式, 省下修改代码的很多功夫. 后者比较方便. PASCAL VOC 标注xml文件结构如下: