一、背景
首先描述下问题背景,博主选的一门课程需要完成一个课程大作业,题目提供了一批医学图像数据,数据简单来说分为三部分,第一部分图像上无神经区域,第二部分图像上有神经区域,第三部分是在第二部分图像的基础上将神经区域圈出而成,博主想使用Faster-RCNN训练这些数据,使得给定一张图像,能够判断上面是否有神经区域,有的话将神经区域标出。欲套用rbg大神已写好的基于Caffe的Faster-RCNN代码,就要将自己的数据制作成VOC的数据格式,并修改相应的接口进行训练。
二、制作数据集
详细参考:http://blog.youkuaiyun.com/sinat_30071459/article/details/50723212
1. 获得bounding box(ground truth)信息
由于题目提供的图像数据,神经区域的标注是不规则的形状,而Faster-RCNN训练要求的ground truth信息是矩形,故需要将原不规则标注信息转化为矩形框标注。博主使用了两种思路,第一种是通过将第三部分图像与第二部分图像做差获得只有不规则标注信息的图片,然后在MATLAB上通过regionprops函数获得对应的矩形标注框;第一种的问题是题目提供的第二部分数据与第三部分数据并不是完全匹配的,存在一些图像不匹配而无法使用,所以博主开始思考第二种方法,博主发现图像上标注信息的像素值是固定的,可与医学图像的像素分离,从而可在不用做差的情况下获得只有标注信息的图片,再通过regionprops函数同样可获得对应的矩形标注框。
此部分实现的平台为MATLAB,图片命名通过处理已保存为六位数字形式,最后的输出为.txt文件,文件中每一行为“图片名+类别标签+ground truth”
具体实现代码见https://github.com/juntawu/make_xml_file/blob/master/box_batch_dif.m,懒得整理跟注释了,将就看吧,囧~~~
【注:事实上图片命名不一定非得是六位数字命名,图片格式也不一定非得是jpg格式,只要保证Annotation中的每一个xml文件与ImageJPEG下的一张图像对应即可】
2. 通过1中获得的.txt文档生成xml文件
VOC标准数据集中Annotation文件夹下,存放的是描述每一张训练图片的ground truth(可能有多个)及其对应的物体类别信息,因此我们要为每一张图像生成一个xml文件,来描述其信息(每一个xml文档与ImageJPEG下的一张图像对应)。
具体实现代码见https://github.com/juntawu/make_xml_file/blob/master/create_xml.m
3. 划分训练集与测试集,生成相关的txt文档
博主将90%的数据作为训练验证集,将10%的数据作为测试集,其中训练验证集中80%作为训练集,剩下的作为验证集,博主参考前文所述博客编写了MATLAB程序按比例对数据进行划分(乱序),并生成trainval.txt,train.txt, val.txt, test.txt,文档中列出的是相应用途的图片名。
具体实现代码见https://github.com/juntawu/make_xml_file/blob/master/create_txt.m
三、编译py-faster-rcnn及训练
详细参考:http://blog.youkuaiyun.com/sinat_30071459/article/details/51332084
https://github.com/rbgirshick/fast-rcnn
1. 下载编译py-faster-rcnn
参考上述教程,从github上clone工程py-faster-rcnn,按照教程进行编译(有空的话不妨测试下demo.py)。
2. 下载VOC2007数据集
将数据集放在py-faster-rcnn\data下,并用(二)制作的数据集替换相应的VOC2007中相应数据
3. 下载ImageNet数据集下训练的模型参数
在Faster-RCNN训练的过程中会使用这些模型参数初始化
博主下载的时候慢的快吐血了,所以慢慢等吧~~~
4. 修改接口
参考前文所述博客教程,根据自己的训练类别修改相应文件,然后就可以就可以开始训练了!!!很激动吧
哎,说得轻巧,但是按照教程修改了文件,开始训练还是会出现各种问题,尤其是训练了很长时间之后跳出个错误提示,之前的训练时间都白瞎了,汗!博主把遇到的一部分问题汇总在(四)中,希望有所帮助,如何没有涵盖到的,各位就Google、百度吧!!!
四、问题汇总:
1.No such file, Check Failure, Aborted cores等类似错误
原因与解决方法:多数是路径设置问题,千万注意配置文件中相对路径与绝对路径的设置,以及程序运行的当前路径。
2. KeyError:no “0”
原因与解决方法:博主的列别标签中有"0"这个标签,但相应文件中的类别标签没有改动,修改“py-faster-rcnn/lib/datasets/pascal_voc.py”里面的标签信息,除了'__background__'不用管之外,其他的都要保持一致,问题得以解决。
3.AssertionError:
in append_flipped_images
assert (boxes[:, 2] >= boxes[:, 0]).all()
AssertionError
原因与解决方法:ground truth 出现坐标为零的情况,在训练过程中,又有坐标减1的操作,导致出错,解决方法参考http://blog.youkuaiyun.com/xzzppp/article/details
4.TypeError: 'numpy.float64' object cannot be interpreted as an index
原因与解决方法:Numpy版本不兼容的问题,index为float64类型在1.11版本是运行的,但在1.12及以后版本不被支持了
使用“sudo pip -U install numpy=1.11.0” 卸载掉当前1.13版本,安装上1.11版本,TypeError的问题解决了,但又出现numpy版本没有更新到最新出现的问题:
ImportError: numpy.core.multiarray failed to import
简直奇葩!!!于是,参照以下两个网址上的讨论,并不断尝试训练(将迭代次数设成较小数值),根据错误提示“TypeError: slice indices must be integers or None or have an index method”,将“lib/roi_data_layer/minibatch.py”文件中所有涉及到index为float64类型的地方做数据类型转化,强制转换为int型
https://github.com/rbgirshick/py-faster-rcnn/issues/13
https://github.com/rbgirshick/py-faster-rcnn/issues/87
问题最后得以解决!