第一次写博客,没想太多。只是想记录一下训练Faster-rcnn是遇见的一些问题。因为在我训练出bug的时候有点绝望,怀疑人生。不过在看到开始训练的一瞬间又觉得活着挺好的。
1.环境搭建
rbg大神很周到,需要的东西全都有(从硬件的要求,到需要的各种model)
Faster-rcnn:https://github.com/rbgirshick/py-faster-rcnn(在此感谢rbg大神,献出我的膝盖)
2.制作数据
推荐:http://blog.leanote.com/post/[email protected]/Faster-RCNN-%E8%AE%AD%E7%BB%83
按照这个大神的的方法,很容易做出自己的 数据集。有一些具体注意点。
!比如:图片命名不要用中文;标签不要有大写字母;图片命名要6位数字;图片格式.jpg。
不知道这些有什么后果,我还是听话的改了,毕竟大家踩过的坑绕道比较节省时间。
但是他没给.xml文件批量更改的方法。下面的大神给了个源码,无脑运行就好了。笑
推荐:https://saicoco.github.io/object-detection-4/
对于他推荐的软件LabelImg,下面是我自己的小经验。
2.1. LabelImg环境搭建
推荐在ubuntu系统下搭建环境。(开始的时候在windows上搭了2天的环境,最后还是放弃了。而在ubuntu系统下根据下面的教程。只用了2小时,基本上是在下载。在家里实验了mac,15年那款pro,2天放弃。。。。)
教程:http://www.linuxdiyf.com/linux/14134.html(在此感谢大神分享经验,省了不少时间)
(这个教程好像,链接打不开。可以谷歌一下:“ubuntu下qt4+pyqt4+eric4快速安装,qt4pyqt4_Python教程| 帮客之家”)
我用的是教程中的 5.一次性安装 。安装完成后,运行Faster-rcnn官网上的demo,会缺少个model,在网上直接把那个错误打出来搜一下有很多教程。(一句命令就可以能好)
注意:作为个新手,不推荐在其他系统下搭建环境。搭环境真的很烦。还有个坑,一开始装的ubuntu 14,东西装的很顺利。但是为了下teamview12,好像是升级了下以后,待机后发现连不上网了。查了下原因,好像说是因为dell电脑不支持ubuntu 16。之后就再也连不上网了。(悲伤的表情)
3.修改代码
推荐:http://blog.csdn.net/sinat_30071459/article/details/51332084
咸鱼大神的博客简单易懂。并且对于一些训练时出现的问题给出了解答。(5星好评)
到这里,如过没出错,已经能训练了。
4.自己碰到的问题(5个)
一.
完成第3步以后,我在跑
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
这句话的时候,报了个很稀奇的错,而且网上没找到答案。
AssertionError: Path does not exist: /home/dl-box/wei/py-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages/000001.jpg
找不到这个路径,但是我的文件确实放对了地方,而且当我用cd命令的时候可以进入这个文件夹,打开对应的.jpg文件。
可能有两个原因:
1.没有权限对文件操作
解决:chmod -R 777 /home/dl-box/wei/py-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages/
2.可能是编码问题,要改成utf-8的格式
解决:在这个文件中py-faster-rcnn/lib/datasets/pascal_voc.py的_load_image_set_index下
将 image_index = [x.strip() for x in f.readlines()] 改成 image_index = [x.decode('utf-8-sig').strip() for x in f.readlines()] 就好了。
如果有编码问题的话可能你还要修改另一个地方,要不test的时候会报错。
解决:py-faster-rcnn/lib/datasets/voc_eval.py这个文件
将imagenames = [x.strip() for x in lines]改成imagenames = [x.decode('utf-8-sig').strip() for x in lines]
二.
由于没有计划多少个标签(加上背景,我标了98个,捂脸),这个py-faster-rcnn/lib/datasets/pascal_voc.py添加标签的时候可能有漏掉的。
就会报
KeyError:’漏掉的标签‘
这个错
解决:在这个py-faster-rcnn/lib/datasets/pascal_voc.py下添加漏掉的标签就好了。
三.
运行时又报了个缺少model : ZF.v2.caffemodel 的错。(我用的是ZF训练,所以缺少这个caffemodel ,其他训练的话应该是其他的)
解决:https://people.eecs.berkeley.edu/~rbg/faster-rcnn-data/ (rbg大神的官网什么都有)
下这个imagenet_models.tgz,然后解压找到ZF.v2.caffemodel 放到py-faster-rcnn\data\faster_rcnn_models下就好了。*如果data文件夹下没有faster_rcnn_models文件夹,自己建一个就好了。(自己动手,丰衣足食)
四.
训练的最后完事后,遇到个错误
Cannot copy param 0 weights from layer 'cls_score'; shape mismatch. Source param shape is21 4096 (86016); target param shape is2 4096 (8192). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.
如果出这个错,说明ZF_faster_rcnn_final.caffemodel这个东西和你现在训练的模型的类别数不匹配。
因为我在训练自己的数据前用过rbg大神的来跑demo,所以这个是他的.caffemodel,就是标注的红色部分21各类。
后面绿色的是你自己的类的数目。
*咸鱼大神的博客在 9.测试 这里原话是
将训练得到的py-faster-rcnn\output\faster_rcnn_alt_opt\***_trainval中ZF的caffemodel拷贝至py-faster-rcnn\data\faster_rcnn_models(如果没有这个文件夹,就新建一个)
*跑demo的话会有这个文件夹和这个.caffemodel。新手的一定不要以为是faster-rcnn自动生成了ZF_faster_rcnn_final.caffemodel,名字是一样的。我以为是自动生成的就出现了上面的这个错。
五.
都能好了,demo能跑完,但是不出结果。没有跑rbg大神demo时候的图片框出现。(有点急,后天就要交稿了,自己的demo还没跑出来)
浪费了一天,后来突发奇想解决了。
解决:py/data/faster_rcnn_models文件夹下,还有个VGG16_faster_rcnn_final.caffemodel东西导致机器学不出来。把它移走就可以了。
(我也忘了是什么时候放到这个文件夹下的了。可能是之前跑rbg大神的demo的时候,也可能是之前搭环境的时候。)
*越南小哥给我的一个建议:(节省时间的小技巧)
为了省时间,先运行几条数据试试水。
后来发现,时间跟迭代次数有关,跟数据多少关系好像不大。所以就修改了迭代次数。
迭代次数可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:
- max_iters = [80000, 40000, 80000, 40000]
分别为4个阶段(rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段)的迭代次数。可改成你希望的迭代次数。
如果改了这些数值,最好把py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt里对应的solver文件(有4个)也修改,stepsize小于上面修改的数值。
我改的比较极端[40,20,40,20],一路跑下来到最后的时候会有另一个错。
File "/home/dl-box/wei/py-faster-rcnn/tools/../lib/datasets/voc_eval.py", line 149, in voc_eval
BB = BB[sorted_ind, :]
IndexError: too many indices for array
这个错是说没有学习到东西,我用了[4000,2000,4000,2000]试了一下也不行。不过能看到这个错误,如果你的数据集做的没有问题的话,用[80000,40000,80000,40000](亲测大概16小时,1341张图)运行你自己的数据集就没问题了。为了省时间我用的是[40000,20000,40000,2000](大概8小时,50张图)。这个时间好像与图片大小和图片数量关系不大。感觉只与迭代次数有关。
到这是我经历的各种坑。一个小白的心路历程,希望大家不要再踩了。(捂脸)
*还有个我自己的小技巧:没有什么事是上心了还做好的。这两天,睡觉5点都会惊醒,然后穿上衣服直奔研究室。
这是我做的数据(我只用了50张训练2个类,samurai和背景。最后的结果不是很理想,框子有点大。可能是数据不够的原因)
这是我的结果