Faster-RCNN训练时遇到的问题
刚入手写博客时,并未抱有过多期待。为了记录训练Faster-rcnn过程中遇到的各种问题而如此做。因在训练过程中遇到bug时的沮丧与困惑而深感无奈。尽管如此,在真正开始训练的那一刹那却意外地感到生活依然充满希望。
1.环境搭建
rbg大神很周到,需要的东西全都有(从硬件的要求,到需要的各种model)
Faster-rcnn:https://github.com/rbgirshick/py-faster-rcnn(深感感激rbg大神的指导与支持,在此献上膝盖)
2.制作数据
推荐:http://blog.leanote.com/post/wjgaas@126.com/Faster-RCNN-训练
按照这个大神的的方法,很容易做出自己的 数据集。有一些具体注意点。
例如:应避免使用中文作为图片名称;标签名不应含有大写字母;应采用6位数字作为图片名称;图片格式为.jpg。
对此感到担忧的是什么?我依然按照规定行事。毕竟大多数人都会遇到类似的困难。
他没有提供对.xml文档进行批量操作的方法。大神分享了一个源码包让用户来试试看。
推荐:https://saicoco.github.io/object-detection-4/
对于他推荐的软件LabelImg,下面是我自己的小经验。
2.1. LabelImg环境搭建
建议使用Ubuntu系统进行环境搭建。最初尝试在Windows系统上构建环境花了两天时间(但最终未能继续下去)。参考下面的教学指南(在家进行了Mac系统的测试),仅花费了两小时的时间(主要集中在下载环节)。两天后放弃了这个计划)。
学习指南:http://www.linuxdiyf.com/linux/14134.html(致以感谢)(大神的经验分享为我节省了大量时间)
这个教程感觉有点问题哦!链接暂时无法访问,请尝试Google一下:"ubuntu下qt4+pyqt4+eric4快速安装, qt4pyqt4_Python教程 | 帮客之家"

按照教程第五步进行的一次性安装。 安装完毕后,在Faster-rcnn官网运行其提供的演示脚本可能会缺少一个model。 网上查找该错误的相关解决方案会有许多教学资源可用。 只需一条命令即可解决问题。
作为一个新手,在搭建环境中确实会遇到诸多挑战。搭环境的过程非常繁琐且令人厌烦。起初安装的是 Ubuntu 14 操作系统,在这个过程中一切进展顺利。然而为了安装 TeamView 12 软件,在升级系统后发现待机时网络连接出现问题。经过排查发现问题源于 Dell 设备对 Ubuntu 16 版本的不兼容性,在此之后网络连接一直无法正常建立。(无奈的表情)
3.修改代码
推荐:
咸鱼大神的博客通俗易懂。此外,在训练过程中遇到的问题也有解答。(5星好评)
到这里,如过没出错,已经能训练了。
4.自己碰到的问题(5个)
一.
完成第3步以后,我在跑
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
这句话的时候,报了个很稀奇的错,而且网上没找到答案。
AssertionError: The path is invalid: /home/dl-box/wei/py-faster-rcnn/data/VOC Devkit 2015/VOC 2017/JPEGImages/
无法直接定位到该路径;然而实际上我的文件位于正确的位置;并且当我执行cd命令时能够进入相应的文件夹;并可成功打开对应的.jpg文件。
可能有两个原因:
1.没有权限对文件操作
解决:chmod -R 777 /home/dl-box/wei/py-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages/
2.可能是编码问题,要改成utf-8的格式
处理:在该文件路径中的pascal_voc.py中的_load_image_set_index函数存在错误
将 image_index = [x.decode('utf-8-sig').strip() for x in f.readlines()] 改成 image_index = [x.decode('utf-8-sig').strip() for x in f.readlines()] 就好了
如果出现编码问题,则还需对另一个部分进行相应调整以避免测试失败。
解决:py-faster-rcnn/lib/datasets/voc_eval.py这个文件
将imagenames变量赋值为对每个元素进行解码和去除前后空白的操作
二.
我没有为多少个标签进行过计划(同时考虑到背景因素),标记了98个项目的情况下,在添加这些标签时可能存在遗漏的情况。
就会报
KeyError:’漏掉的标签‘
这个错
修复:在py-faster-rcnn/lib/datasets/pascal_voc.py中补全缺失的内容就好了。
三.
在运行过程中再次出现了缺少模型错误:ZF.v2.caffemodel未被找到。(由于我采用了ZF进行训练工作,导致未能获取到所需的ZF.v2.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文件夹,则建议自行创建该目录。(亲手完成即可)
四.
训练的最后完事后,遇到个错误
无法从层 'cls_score' 复制参数组 0 的权重,并存在形状不匹配的问题。源参数形状为21×4096(86,016),而目标参数形状为2×4,096(8,192)。建议从头学习该层参数而非复制已保存网络,并重新命名该层以避免冲突。
如果出现这个错误,则表明ZF_faster_rcnn_final.caffemodel文件中的类别数目与当前正在训练的模型类别数目不符。
在我训练自己的数据之前尝试使用了rbg大神的作品来运行演示文稿,在此之后我发现这是一个属于他的.caffemodel文件,并且其中标注的重点区域包括21个类别。
后面绿色的是你自己的类的数目。
*咸鱼大神的博客在 9.测试 这里原话是
将训练后生成的py-faster-rcnn\output\faster_rcnn_alt_opt***_trainval中的ZFcaffemodel复制至py-faster-rcnn\data\faster_rcnn_models(如无此文件夹,则创建)
运行演示程序时会包含该文件夹及其.caffemodel文件。初学者千万别认为ZF_faster_rcnn_final.caffemodel是由faster-rcnn生成的(虽然它的名字看起来一样)。误以为是由自动生成工具生成导致出现了一个错误。
五.
都实现了运行完成的情况吗?运行中未显示预览图框吗?目前时间紧迫吗?截止日期临近吗?自己的DEMO尚未完成调试吗?
浪费了一天,后来突发奇想解决了。
为了解决这个问题,在py/data/faster_rcnn_models文件夹中发现了一个阻碍模型训练进程的VGG16_faster_rcnn_final.caffemodel模型文件。将该模型文件移除即可解决问题。
我也忘记了具体是什么时候将这个文件夹放到这里的。也许是在为rbg大神的演示文稿运行的时候?也有可能是在搭建开发环境的过程中?
*越南小哥给我的一个建议:(节省时间的小技巧)
为了省时间,先运行几条数据试试水。
随后发现,时间与迭代次数之间存在关联,而与数据量的关系似乎不大。因此对迭代次数进行了调整。
迭代次数可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:
- max_iters = [80000, 40000, 80000, 40000]
包括rpn第一阶段、fast rcnn第一阶段、rpn第二阶段以及fast rcnn第二阶段在内的四个不同阶段的迭代步数。建议您按照实际需求进行调整为符合您需求的迭代次数
若调整这些参数设置,则应相应地对模型中对应的solver配置文件(共四个)进行重置,并使其实验阶段的学习率设置低于当前调整幅度。
我改的比较极端[40,20,40,20],一路跑下来到最后的时候会有另一个错。
该文件属于/vhome/dl-box/wei/py-faster-rcnn/tools/../lib/datasets/voc_eval.py类中的第149行。
BB = BB[sorted_ind, :]
IndexError: too many indices for array
这个错误表明我没有学到东西。
我尝试使用[4K×4K]的超分网络模型进行训练后仍未能达到预期效果。
经过测试发现,在处理更大规模的数据集时计算时间显著增加。
为了加快速度并减少资源消耗,
我选择了[8小时×5张图]的小规模训练方案,
而之前的方案需要[16小时×1341张图]。
显然,
这可能与训练迭代次数相关。
到这是我经历的各种坑。一个小白的心路历程,希望大家不要再踩了。(捂脸)
*还有个我自己的小技巧:有没有什么任务不是用心去做就能完成的?这个小技巧就是靠坚持每天晚上十一点半都会醒了之后就去实验室工作。这两天晚上十一点半都会醒了接着穿上衣服就去了研究室。
这是我的一个项目(我仅使用了50张训练样本来区分两个类别:samurai和背景。经过实验后发现结果并不令人满意:检测框的尺寸偏大。这可能与训练数据量不足有关)。

这是我的结果

