py-faster-rcnn + ZF 实现自己的数据训练与检测(二)

来源:互联网 发布:淘宝和农村淘宝的区别 编辑:程序博客网 时间:2024/06/05 10:00

0.前言

在前面的一篇博客中,介绍了如何实现py-faster-rcnn的配置以及在PASCAL VOC 2007上面的训练,本节,来讲诉如何制作并训练自己的数据集。如果自己使用的是matlab版本的faster rcnn的话,请移步这里:http://blog.csdn.NET/sinat_30071459/article/details/50546891

1.制作自己的数据集

训练模型最头疼的估计就是数据集的整理与标记了,本例中我以人脸识别为例来说明数据集的安排。首先,这里为了方便,我没有更改VOC2007的任何格式,只是将data/VOCdevkit2007/VOC2007/Annotations和ImageSets以及JPEGImages文件夹的内容进行了替换。假设你的数据集已经进行了标记,所做的标记框已经输出到txt文档中,如下所示。

0001.jpg f 67 55 195 2010001.jpg f 339 49 479 206
从左到右依次是图片名称,打框的标签和框的4个坐标

然后是将文档中的数据写入xml文件,如何制作数据可以参考这篇文章http://blog.csdn.net/liumaolincycle/article/details/50540487,这里不在赘述。不过和它不同的是,我为了方便,依然使用原有的数据集名称,只是对相应的文件进行了替换。最后是生成4个txt文档,分别为train.txt  trainval.txt  test.txt 和 val.txt。据我发现,在实验时好像只用到了trainval.txt和test.txt,他们两个构成完整的一个数据集。最后,可以将原有的一些SegmenttationClass和SegmentationObject等文件夹删除,在我的实验中,所需要的完整结构如下所示。

2.训练自己的数据

自己的数据集制作完成之后,就可以着手对文件进行修改以便训练了

(1)prototxt配置文件

file1:models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_rpn_train.pt
file2:models/pascal_voc/ZF/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt
file3:models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_rpn_train.pt
file4:models/pascal_voc/ZF/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt
file5:models/pascal_voc/ZF/faster_rcnn_alt_opt/fast_rcnn_test.pt
修改上面5个pt文件,将类别数量改成自己的类别数量+1(检测时,背景也要作为1类),比如我的是人脸检测,就一个类别,就要将pt文件中的类别改为2,再将bbox预测层改为8(2*4),以stage1_fast_rcnn_train.pt为例

[plain] view plain copy
  1. name: "ZF"  
  2. layer {  
  3.   name: 'data'  
  4.   type: 'Python'  
  5.   top: 'data'  
  6.   top: 'rois'  
  7.   top: 'labels'  
  8.   top: 'bbox_targets'  
  9.   top: 'bbox_inside_weights'  
  10.   top: 'bbox_outside_weights'  
  11.   python_param {  
  12.     module: 'roi_data_layer.layer'  
  13.     layer: 'RoIDataLayer'  
  14.     param_str: "'num_classes': 2"  
  15.   }  
  16. }  
  17. ......  
  18.  layer {  
  19.   name: "cls_score"  
  20.   type: "InnerProduct"  
  21.   bottom: "fc7"  
  22.   top: "cls_score"  
  23.   param { lr_mult: 1.0 }  
  24.   param { lr_mult: 2.0 }  
  25.   inner_product_param {  
  26.     num_output: 2  
  27.     weight_filler {  
  28.       type: "gaussian"  
  29.       std: 0.01  
  30.     }  
  31.     bias_filler {  
  32.       type: "constant"  
  33.       value: 0  
  34.     }  
  35.   }  
  36. }  
  37. layer {  
  38.   name: "bbox_pred"  
  39.   type: "InnerProduct"  
  40.   bottom: "fc7"  
  41.   top: "bbox_pred"  
  42.   param { lr_mult: 1.0 }  
  43.   param { lr_mult: 2.0 }  
  44.   inner_product_param {  
  45.     num_output: 8  
  46.     weight_filler {  
  47.       type: "gaussian"  
  48.       std: 0.001  
  49.     }  
  50.     bias_filler {  
  51.       type: "constant"  
  52.       value: 0  
  53.     }  
  54.   }  
  55. }  
(2)修改lib/datasets/pascal_voc.py,将类别改成自己的类别


[plain] view plain copy
  1. self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)  
  2. self._classes = ('__background__', # always index 0  
  3.                          'face')  
(3)修改py-faster-rcnn/lib/datasets/imdb.py

在使用自己的数据进行训练时,基本上都会报错:assert(boxes[:,2] >= boxes[:,0]).all() ,主要是因为自己的图片数据没有统一整理过而导致的,将该文件加入几行修改如下:

[python] view plain copy
  1. def append_flipped_images(self):  
  2.     num_images = self.num_images  
  3.     widths = self._get_widths()  
  4.     for i in xrange(num_images):  
  5.         boxes = self.roidb[i]['boxes'].copy()  
  6.         oldx1 = boxes[:, 0].copy()  
  7.         oldx2 = boxes[:, 2].copy()  
  8.         boxes[:, 0] = widths[i] - oldx2 - 1  
  9.         boxes[:, 2] = widths[i] - oldx1 - 1  
  10.   
  11.         for b in range(len(boxes)):  
  12.             if boxes[b][2] < boxes[b][0]:  
  13.                boxes[b][0] = 0  
  14.                  
  15.         assert (boxes[:, 2] >= boxes[:, 0]).all()  
  16.         entry = {'boxes' : boxes,  
  17.                  'gt_overlaps' : self.roidb[i]['gt_overlaps'],  
  18.                  'gt_classes' : self.roidb[i]['gt_classes'],  
  19.                  'flipped' : True}  
  20.         self.roidb.append(entry)  
  21.     self._image_index = self._image_index * 2  

如果是在报错之后再修改这个文件的话,记得在修改之后将data/cache/里面的pki文件删除后再重新运行


修改到这里时,训练前的准备工作已经完成了,现在可以直接进行训练。


cd py-faster-rcnn
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

训练完成之后,将output中的最终模型拷贝到data/faster_rcnn_models中,接下来测试训练完成的模型。


3.测试结果

修改./tools/demo.py

和上面的pascal_voc.py一样,将类别改成自己的类别,然后将加载的模型改为自己训练出来的模型。以我的为例

[python] view plain copy
  1. NETS = {'vgg16': ('VGG16',  
  2.                   'VGG16_faster_rcnn_final.caffemodel'),  
  3.         'zf': ('ZF',  
  4.                   'ZF_faster_rcnn_final.caffemodel'),  
  5.         'myzf': ('ZF',  
  6.                   'ZF_faster_rcnn_final_4000.caffemodel')  
  7.                   }  

执行./tools/demo.py --net myzf即可得到如下的训练结果







原创粉丝点击