在Faster RCNN上运行自己的数据集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lxh19920114/article/details/50929503

找了好久都没有如何使用Faster RCNN的资料,只能自己摸索,不过还好花了一个多星期还真成功了,下面我就分享一下我修改的过程,一来是记录下来,以防止后面忘记,二来也希望给需要的朋友一点帮助。

本文主要是以matlab版本的faster rcnn(网址是https://github.com/shaoqingren/faster_rcnn)做实验,测试我自己的数据集,还有一个python的版本,该版本主要是需要在linux下运行,本人对linux还没有深入的了解,同时本人对python也不甚熟悉,因此没有使用该版本,python版本的网址是:https://github.com/rbgirshick/py-faster-rcnn

对于该版本的配置,如果想比较快速、简单的配置成功的话,就一定一定一定要安装CUDA 6.5版本,安装其他版本还需要编译caffe接口,后面我可以回想一下步骤,再写一篇博客关于如何编译,这个还是等一等。。。

言归正传,要想跑自己的数据集,比较快速的方法是先跑一下PASCAL VOC 2007,然后按照PASCAL VOC 2007的数据集格式(具体格式如下)制作自己的数据集,当然首先还是要自己做一个标注的小工具,这里就不再赘述,不管是用什么语言来写都可以。

<annotation>
	<folder>VOC2007</folder>
	<filename>000002.jpg</filename>
	<source>
		<database>The VOC2007 Database</database>
		<annotation>PASCAL VOC2007</annotation>
		<image>flickr</image>
		<flickrid>329145082</flickrid>
	</source>
	<owner>
		<flickrid>hiromori2</flickrid>
		<name>Hiroyuki Mori</name>
	</owner>
	<size>
		<width>335</width>
		<height>500</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>train</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>139</xmin>
			<ymin>200</ymin>
			<xmax>207</xmax>
			<ymax>301</ymax>
		</bndbox>
	</object>
</annotation>
第一步 配置Faster RCNN

这个大家可以先根据https://github.com/shaoqingren/faster_rcnn来配置,具体的编译我后面再回忆回忆。。

第二步 修改Faster RCNN

这里主要还是有很多文件需要处理,首先需要下载Pascal VOC2007开发工具(http://download.csdn.net/detail/lxh19920114/9466239),读取数据就靠它了,是官方提供的,不太好找,我放到CSDN上了,方便大家下载,下载完成之后,记得放对地方,切记切记,不然运行的时候会提示找不到VOCcode,当然出错了也会知道该放哪了。。

下面首先需要修改的就是VOCcode里面的VOCinit.m文件,找到VOC2007的类别定义,如下图所示,将类别改为自己数据集的类别即可,改之前记得备份,改好后记得保存。。。


接下来我们要改Faster RCNN网络模型了,主要是因为类别数不一定与VOC2007相同,VOC2007的类别数为20个,我的类别数为14个,这里我使用ZF模型,主要需要修改以下两个文件夹下的文件,一个是train_val.prototxt还有一个是test.prototxt,将这两个文件中的84(84=(20+1)*4)改为你自己的,比如我的14类就是(14+1)*4=60,为什么要加一呢,是因为有个默认类别是背景(background),要一个一个手动修改注意,千万不要一键替换!!!!,因为还有的是384,这个就不需要改,我如果一键替换就变成360了,当然运行不一定会出问题,但是总归别人实验那么多次选择这么一个数总归是有道理的)。

再接着就需要告诉程序训练用哪些图片,测试用哪些图片了,这些都在下面目录里面的文件中修改。主要修改两个文件,一个是train_val.txt,还有一个是test.txt。


从下图可以看到,这两个文件的原始内容是一个个字符串,代表着图片的名称,图片的默认格式是.jpg,所以就不包含扩展名,你可以将这两个文件内的内容改成你自己的图片名称,具体的名称格式最好别有空格,其他的我还没有发现,实在不行也可以按照数字来命名,train_val.txt里面规定了训练数据,test.txt里面规定了测试数据。修改前注意备份!!!


改好了之后,可以先试一下,如果数据集不够大的话(VOC2007跑就不会有错误,我目前的数据集只有它的九分之一,就有问题了。。)可能会报错,一个很典型的错误就是发生在下面,提示randperm的第一个参数要大于第二个参数,val_iters的原始值为500,而我的length(shuffled_inds_val)才100多。这时你可以选择将第二个参数改小,也可以选择不使用validation,因为这是在准备validation数据时出错的,不过我还是建议不要关闭validation。



一般情况下来讲,这个错误会报两次,因为在使用script_faster_rcnn_VOC2007_ZF()跑的时候,有stage 1和stage 2,两步都需要validation,分别在不同的文件中,一个是在fast_rcnn_train,还有一个是proposal_train,这都改好了就可以跑程序了,wish you good luck!!!


最后,如果你修改过某些文件,想重新训练的话,记得要删除output和cache下的所有文件,然后才会重新训练,不然都只会读取之前的缓存。



展开阅读全文

没有更多推荐了,返回首页