本文是一个总结,参考了网上的众多资料,汇集而成,以供自己后续参考。
一般说来,训练自己的数据,有两种方法:第一种就是将自己的数据集完全改造成VOC2007的形式,然后放到py-faster-rcnn/data 目录下,然后相应地改变相应模型的参数,比如种类等。 data目录下存放的数据如下:
VOCdevkit2007
└── VOC2007
├── Annotations
│ └── *.xml
│
├── ImageSets
│ └── Main
│ ├── train.txt
│ └── test.txt
└── JPEGImages
└── *.jpg
这样做最省事。
第二种,基本上也是改造成VOC2007的形式,然后放到py-faster-rcnn/data 目录下,但是允许Annotations不按照xml的形式。可以是自己的形式
YOUR_DATASET_devkit
└── data
├── Annotations
│ └── *.txt
│
├── ImageSets
│ ├── train.txt
│ └── test.txt
└── JPEGImages
└── *.jpg or *.png
关于第二种,可以参考如下文章:
1. deboc/py-faster-rcnn 这个代码是py-faster rcnn的拷贝,实现了二分类模型。里面的data组织如下:
INRIA_Person_devkit/
|-- data/
|-- Annotations/
|-- *.txt (Annotation files)
|-- Images/
|-- *.png (Image files)
|-- ImageSets/
|-- train.txt
按照教程:
https://github.com/deboc/py-faster-rcnn/blob/master/help/Readme.md 可以训练行人检测。
另外《Fast RCNN 训练自己数据集 (2修改数据读取接口)》 也实现了自己的数据读取。
下面重点说一下第一种。
具体的细节可以参考: http://blog.csdn.net/Gavin__Zhou/article/details/52052915
需要注意的是 根据文章<解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()的问题> 我们对lib/datasets/imdb.py,append_flipped_images()函数修改如下:
def append_flipped_images(self):
num_images = self.num_images
widths = self._get_widths()
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
boxes[:, 2] = widths[i] - oldx1 - 1
for b in range(len(boxes)):
if boxes[b][2]< boxes[b][0]:
boxes[b][0] = 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
我们说一说其他的,
- 关于数据标注: 强烈推荐工具:labelImg :https://github.com/tzutalin/labelImg 这是个图形化界面操作,可以很方便地标注boundingbox,且生成xml格式。
- VOC2007数据集地址: https://pjreddie.com/projects/pascal-voc-dataset-mirror/
- 图片重命名像VOC2007那样: http://blog.csdn.net/sinat_30071459/article/details/50723212
- 根据XML文件生成test.txt(测试集),train.txt(训练集),val.txt(验证集),trainval.txt(训练和验证集),trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。将这四个txt放在ImageSets\Main中,参考:http://blog.csdn.net/sinat_30071459/article/details/50723212
- 另外你不想手动地更改那些参数,可以使用这个:https://github.com/Microos/py-faster-rcnn-data-interface-generator
其他参考文档:
5. 将数据集做成VOC2007格式用于Faster-RCNN训练 (很重要)
6. Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
7. Training'R CNNs'of'various'velocities 训练faster rcnn的官方文档1
9. Faster-RCNN+ZF用自己的数据集训练模型(Matlab版本)
10. Py-faster-rcnn实现自己的数据train和demo (很重要)