我用的Faster-RCNN是tensorflow版本,fork自githubFaster-RCNN_TF
参考
http://www.cnblogs.com/CarryPotMan/p/5390336.html
1、按照Faster-RCNN_TF中的步骤,先在本地完成编译。
1.1、环境配置
按照该项目中的README.md ,将需要的几个依赖cython, python-opencv, easydict都安装好,并确保本地计算机中有tensorflow,没有的话自行安装;
1.2、克隆工程:在本地计算机的终端输入
git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git
下载下来的内容都在目录 Faster-RCNN_TF 下;
1.3、编译Cython模块
cd $FRCN_ROOT/lib # 首先进入目录Faster-RCNN_TF/lib
make #编译
编译成功之后,目录Faster-RCNN_TF/lib/nms 和 Faster-RCNN_TF/lib/roi_pooling_layer/ 和Faster-RCNN_TF/lib/utils下面会出现一些.so文件。
注意:如果在这时候,你将该工程原封不动的连带着.so文件一起移植到了另一台电脑上,想重新运行程序的时候,记住,要先删除这几个.so文件,并重新进行编译。因为编译生成的文件是只适应本台计算机的,换一台计算机之后,用原来的.so文件,就行不通了,程序会出错。并且,必须要先删除旧的.so文件,否则就会调用旧的.so文件,而不生成新的.so文件。
2、介绍一下pascal_voc数据集的数据读写接口
工程Faster-RCNN_TF中读取数据的接口都在目录Faster-RCNN_TF/lib/datasets下。
原工程提供了5种数据来训练网络,并分别给出了各自的数据读写接口。
5种数据分别是pascal_voc,coco,kitti,nissan,nthu,各自的数据读写接口分别是Faster-RCNN_TF/lib/datasets 中的pascal_voc.py,coco.py,kitti.py,nissan.py,nthu.py。
我们可以看到Faster-RCNN_TF/lib/datasets目录下还有一些.py文件,分别是:
factory.py:是个工厂类,用类生成imdb类并且返回数据库供网络训练和测试使用
imdb.py:是数据库读写类的基类,分装了许多db的操作,具体的一些文件读写需要继承继续读写
我们要用自己的数据进行训练,就得编写自己数据的读写接口,下面参考pascal_voc.py来编写。
2.1、首先说明一下pascal_voc数据集的格式
以VOC2007为例,数据都放在一个叫做VOCdevkit的目录中,我们来看一下目录VOCdevkit的结构:
VOCdevkit/
VOCdevkit/VOC2007/
VOCdevkit/VOC2007/Annotations #所有图片的XML文件,一张图片对应一个XML文件,XML文件中给出的图片gt的形式是左上角和右下角的坐标
VOCdevkit/VOC2007/ImageSets/
VOCdevkit/VOC2007/ImageSets/Layout #里面有三个txt文件,分别是train.txt,trainval.txt,val.txt,存储的分别是训练图片的名字列表,训练验证集的图片名字列表,验证集图片的名字列表(名字均没有.jpg后缀)
VOCdevkit/VOC2007/ImageSets/Main
VOCdevkit/VOC2007/ImageSets/Segmentation
VOCdevkit/VOC2007/JPEGImages #所有的图片
VOCdevkit/VOC2007/SegmentationClass #segmentations by class
VOCdevkit/VOC2007/SegmentationObject #segmentations by object
Faster-RCNN_TF工程主要用到的是目录Annotations中的XML文件、目录JPEGImages中的图片、目录ImageSets/Layout中的txt文件。
2.2、然后解释一下pascal_voc.py中每个的函数的作用
主函数 if name == ‘main’在文件pascal_voc.py的最下面
if __name__ == '__main__':
from datasets.pascal_voc import pascal_voc
d = pascal_voc('trainval', '2007') #pascal_voc是一个类
res = d.roidb
from IPython import embed; embed()
类 pascal_voc中的函数:
class pascal_voc(imdb):
def init(self, image_set, year, devkit_path=None)在文件pascal_voc.py的最上面
是初始化函数,对应着的是pascal_voc的数据集访问格式
(我会按照这个初始化函数里面用到的子函数的顺序来介绍每个子函数的作用,这样看比较直观。在这个初始化函数init中用到的每个子函数我都会有一个标号,方便介绍。)
'''
是初始化函数,对应着的是pascal_voc的数据集访问格式
:param image_set: 是一个str,值是'train'或者'test'或者'trainval'或者'val',表示的意思是用(训练集)或者(测试集)或者(训练验证集)或者(验证集)里面的数据;
:param year: 是一个str,是VOC数据的年份,值是'2007'或者'2012'
:param devkit_path: pascal_voc数据集所在的路径
'''
'''
以下的image_set都以train为例
year都以2007为例
'''
def __init__(self, image_set, year, devkit_path=None):
imdb.__init__(self, 'voc_' + year + '_' + image_set) # 继承了类imdb的初始化函数__init__(),传进去的参数是voc_2007_train。类imdb在Faster-RCNN_TF_R2/lib/datasets/imdb.py里面被定义
self._year = year