1.前言
想起上次学FasterRCNN的时候,已经离现在有4个月了,那时候的确看的我云里雾里的(和很多初学者一样),我的深度学习是从keras之父肖奈的《python深度学习》开始的,的确那本书是深度学习初学者的福音,可以浅层地了解到深度学习的相关知识,并且也能够使用keras框架搭建一些简单的深度学习模型。但是,想学习深度学习,那本书还是不够的。比如FasterRCNN框架,开源的有caffe和tensorflow等版本的(我学的就是tensorflow)版本的。如果仅仅掌握Keras框架,看FasterRCNN代码还是比较吃力的,所以我这四个月开始了Tensorflow框架的学习。(什么?一个tensorflow框架学了四个月?)说起来惭愧,我作为一个刚踏入研究生生活的大学生,除了导师项目、论文和课程,挤出来学习的时间还是有限的。所以在上个月结束了tensorflow的学习,推荐的书就是那本《Tensorflow实战google深度学习框架》。
这是我的第一篇帖子,没有像其他大佬一样从深度学习基础开始讲,但是还是希望我总结的经验能够对初学者(就像前不久前的我)的学习有一定的帮助。
好了,进入主题!本次解读的对象就是FasterRCNN,是目标检测two-stage的经典之作,也是现在众多模型的基础。我相信多数初学者和我一样,看网上别人的贴子,看的似懂非懂的,什么anchor,什么RPN,什么ROIS,说懂吧,是理解了点皮毛,但是问深一点就懵了,别担心,跟着我走,一起突破FasterRCNN。
2. 打标签和训练
(不是说fasterRCNN的解读吗?怎么突然跳到训练呢)各位别急,我的顺序是针对性的,也是我自己学FasterRCNN的顺序。说实话,如果能够先把一个程序跑起来,再去了解原理,这种感觉还是挺奇妙的不是吗?
曾经作为初学者的我,不知道训练其实只要换个文件夹这么简单的事,可废了我好多时间。使用FasterRCNN模型时,输入到模型的无非就是图片集和XML文件集。那具体的文件放在哪儿呢?不妨从代码中进行了解。
在train.py文件中,以下代码获取图片集。
self.imdb, self.roidb = combined_roidb("voc_2007_trainval")
我们跳进去,跳到函数combined_roidb中去了,在函数combined_roidb中我们只关注函数get_roidb,接着进入该函数中。很明显啦,他根据上面的名字"voc_2007_trainval",创建了一个imdb,他是一个poscal_voc类,具体代码如下:
for
接着我们进入pascal_voc类(lib/dataset/pascal_voc.py文件)中。(我的天,代码怎么这么长?)莫慌,通过我的解读,只需几步修改就行。
self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
这个地址嘞,其实就是
Faster-RCNN-TensorFlow-Python3.5-masterdataVOCdevkit2007 VOC2007
突然秒懂,原来后面的图片和XML集要放在这个文件夹下。(没错,就是这么简单!)具体怎么放,接着看下面。
莫慌,还要修改一些东西。比如self._classes,没错,就是你自己定义的类别(注意你的顺序,不能少了'__background__'哦!)
举个例子,不妨我们要做一个动漫(fairly tail,其实是fairy tail, 妖精的尾巴,之前一直搞错了,现在也懒得改了啊哈哈 )人物识别的模型。我们在上面的_data_path文件夹中加入一个文件夹叫做fairly_tail。
( Faster-RCNN-trainabledataVOCDevkit2007VOC2007fairly_tail)
然后在fairly_tail文件夹中加入两个文件夹,如图1
显然,annotation文件夹中加入xml文件,jpeg文件夹中加入图片,(需要注意的是xml文件和jpeg文件的前缀名一样的,如frame1.jpg和frame1.xml),我们要改哪些呢?
先来看看self._classes:
self
接着修改后面函数image_path_from_index,修改里面的image_path,指向JEPG文件夹
def
后面还有函数_load_image_set_index(),改一下image_path到annotation文件夹(或者JPEG文件夹),就是枚举一下需要参与训练的前缀名。
def
然后转到函数_load_pascal_annotation中,改一下当中的filename地址,他是对xml文件进行解析,所以这个地址别错了。
def
做到这里就做好了图片image和标签文件XML的索引了,如果主程序train.py没有问题的话,是可以进行直接训练的了。
最后看看效果图,还是很amazing的!