Caffe: Faster RCNN训练模型(Windows)

来源:互联网 发布:mac 外置显卡 编辑:程序博客网 时间:2024/06/05 00:15

环境:VS2013,CUDA8.0,CuDNN 5.0,Win10
前提:已正确搭建Faster RCNN运行环境,成功运行Demo。教程可见这篇文章。

一、准备工作

1. 下载VOC2007数据集

下载地址:
官网:http://host.robots.ox.ac.uk/pascal/VOC/voc2007/,同时下载训练集+测试集
这里写图片描述
或者http://academictorrents.com/details/c9db37df1eb2e549220dc19f70f60f7786d067d4
或者别人提供的网盘:https://pan.baidu.com/s/1mhMKKw4

下载完成后,解压至py-faster-rcnn\data路径下,并将文件夹名称改为:VOCdevkit2007,如图:
这里写图片描述
这样我们就可以使用VOC2007的数据组织形式完成训练了。其中:

VOCdevkit2007/VOC2007/JPEGImages里是训练&测试数据图片
VOCdevkit2007/VOC2007/Annotations里是对图片的标注,XML格式,即说明图片的哪一坐标范围内是哪一类物体
VOCdevkit2007/VOC2007/ImageSets/Main里的txt记录了哪些图片是作为训练or测试使用

2.(非必要)下载预训练模型

地址:https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz
如果想利用Finetune技术重新训练模型什么的,可以进行下载。不然可以跳过。

3.移动之前build的文件

将py-faster-rcnn\lib\build\lib.win-amd64-2.7下的三个文件夹,复制到py-faster-rcnn\lib下。

二、训练VOC2007

我们可以先通过VOC2007的数据练练手,默认程序的训练参数是基于它的,所以不需要改什么地方就能够进行训练。希望尝试用自己数据训练的可以跳至下节。

1.训练模型

我们使用end2end的形式进行训练,CMD打开至py-faster-rcnn目录下,运行如下命令:

SET VS90COMNTOOLS=%VS120COMNTOOLS%python .\tools\train_net.py --gpu 0 --solver .\models\pascal_voc\ZF\faster_rcnn_end2end\solver.prototxt --imdb=voc_2007_trainval --iters=90000 --cfg=.\experiments\cfgs\faster_rcnn_end2end.yml

其中:
solver确定使用哪一个网络的训练设置(文件),顺便确定使用哪个网络。这里我们用的是程序自带的ZF网络;
iter确定训练迭代次数,自设;
cfg确定训练中的faster rcnn配置,这里我们用的仍是自带的end2end配置。

另:如果希望对某个模型进行再训练,只要再加上:–weight=caffemodel路径即可。

训练完成后,模型默认保存在:
py-faster-rcnn\output\faster_rcnn_end2end\voc_2007_trainval

2.测试模型

然后我们可以试试模型效果,首先修改demo.py:
demo.py
这里写图片描述

myzf是自己起的网络名称,最后则是训练得到的模型名。

然后我们将之前output文件夹下训练得到的模型,移至py-faster-rcnn\data\faster_rcnn_models路径下(没有就新建)。

最后CMD打开到py-faster-rcnn\tools路径下,运行

SET VS90COMNTOOLS=%VS120COMNTOOLS%python demo.py --net myzf

三.训练自己的数据

那么如何使用自己的数据训练呢?

1.仿照VOC2007数据格式,创建数据集

VOC2007中:
JPEGImages存放图片文件,且命名规则为6位数字;
Annotations存放用于标注的XML,且名称与图像保持一致;
ImageSets/Main中的txt确定哪些用于训练,哪些测试,每行是一个文件名。

所以如果不想过多改动程序,我们只要把原本JPEGImages等文件夹内的东西删掉,再替换成我们自己的、具有相同形式的数据就可以了。

注意:一旦数据发生过改变,在开始训练前需要删除py-faster-rcnn\data下的cache文件夹,否则数据集的修改不会生效。py-faster-rcnn\data\VOCdevkit2007下的annotations_cache最好也同时删掉

图片的标注可以考虑使用opencv+tinyxml,标注图片并生成对应的xml,txt的生成也不复杂。总之这里是需要个人实现的,如果不想体会编程的快感——那就上网搜吧XD

2.修改网络结构

我们自己数据集包含的种类肯定与VOC不同,这就需要修改网络模型中,有关分类个数的地方。以ZF网络为例,其prototxt文件在:
pascal_voc\ZF\faster_rcnn_end2end

train.prototxt

layer {  name: 'input-data'  type: 'Python'  top: 'data'  top: 'im_info'  top: 'gt_boxes'  python_param {    module: 'roi_data_layer.layer'    layer: 'RoIDataLayer'    param_str: "'num_classes': 3" #类别数+1  }}
layer {  name: "cls_score"  type: "InnerProduct"  bottom: "fc7"  top: "cls_score"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {    num_output: 3        #类别数+1    weight_filler {      type: "gaussian"      std: 0.01    }    bias_filler {      type: "constant"      value: 0    }  }}
layer {  name: "bbox_pred"  type: "InnerProduct"  bottom: "fc7"  top: "bbox_pred"  param { lr_mult: 1.0 }  param { lr_mult: 2.0 }  inner_product_param {    num_output: 12  #(类别数+1)*4    weight_filler {      type: "gaussian"      std: 0.001    }    bias_filler {      type: "constant"      value: 0    }  }}

test.prototxt

同上,只有后两个地方需要改,即cls_score和bbox_pred。

网络结构修改完毕,我们还需要修改训练配置,包括:

py-faster-rcnn\lib\datasets\pascal_voc.py

self._classes = ('__background__',  # always index 0                 'classname1','classname2') # 类别名

至此有关类别的部分已经修改完毕。由于有时训练过程中会碰到bbox越界的问题,我们最好把下面这个文件中的这个函数修改成下头这个样子:
py-faster-rcnn\lib\datasets\imdb.py

def append_flipped_images(self):        num_images = self.num_images        widths = [PIL.Image.open(self.image_path_at(i)).size[0]                  for i in xrange(num_images)]        for i in xrange(num_images):            boxes = self.roidb[i]['boxes'].copy()            oldx1 = boxes[:, 0].copy()            oldx2 = boxes[:, 2].copy()            boxes[:, 0] = widths[i] - oldx2 - 1            # add            for b in range(len(boxes)):                if boxes[b][2] < boxes[b][0]:                    boxes[b][0] = 0            print boxes[:, 0]            boxes[:, 2] = widths[i] - oldx1 - 1            print boxes[:, 0]            assert (boxes[:, 2] >= boxes[:, 0]).all()            entry = {'boxes': boxes,                     'gt_overlaps': self.roidb[i]['gt_overlaps'],                     'gt_classes': self.roidb[i]['gt_classes'],                     'flipped': True}            self.roidb.append(entry)        self._image_index = self._image_index * 2

3.训练

执行训练的语句一样。再次提醒只要数据集发生了变动,记得先删cache再训练

SET VS90COMNTOOLS=%VS120COMNTOOLS%python .\tools\train_net.py --gpu 0 --solver .\models\pascal_voc\ZF\faster_rcnn_end2end\solver.prototxt --imdb=voc_2007_trainval --iters=90000 --cfg=.\experiments\cfgs\faster_rcnn_end2end.yml

假如使用的其它名称的prototxt,记得在–solver中修改即可。

测试模型前,记得将demo.py中的类名处进行修改:
demo.py

CLASSES = ('__background__',           'classname1','classname2')

注:觉得CMD写的累?写成.bat吧,记得注意路径。

原创粉丝点击