faster rcnn 使用自己的数据集

/py-faster-rcnn/data/VOCdevkit2007/VOC2007/下有

  • JPEGImages
  • Annotations
  • ImageSets/Main
    JPEGImages —> 存放你用来训练的原始图像

Annotations —> 存放原始图像中的Object的坐标信息,XML格式

ImageSets/Main —> 指定用来train,trainval,val和test的图片的编号

JPEGImages

这个没什么,直接把你的图片放入就可以了,但是有三点注意:

  • 编号要以6为数字命名,例如000034.jpg
  • 图片要是JPEG/JPG格式的,PNG之类的需要自己转换下
  • 图片的长宽比(width/height)要在0.462-6.828之间,就是太过瘦长的图片不要

如果你的图片都是0.jpg这种命名的,如何用python代码改成000000.jpg呢?

import os
file_names = os.listdir('./JPEGImages')
for filename in file_names:
	var = filename.split('.')[0]
	var = var.zfill(6)
	os.rename('./JPEGImages'+filename,'./JPEGImages/%s.jpg'%(var))

Annotations

faster rcnn训练需要图像的bounding box信息作为监督(ground truth),所以你需要将你的所有可能的object使用框标注,并写上坐标,最终是一个XML格式的文件,一个训练图片对应Annotations下的一个同名的XML文件
参考官方VOC的Annotations的格式:

<annotation>
    <folder>VOC2007</folder> #数据集文件夹
    <filename>000105.jpg</filename> #图片的name
    <source> #注释信息,无所谓有无
        <database>The VOC2007 Database</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
        <flickrid>321862192</flickrid>
    </source>
    <owner> #注释信息,无所谓有无
        <flickrid>Eric T. Johnson</flickrid>
        <name>?</name>
    </owner>
    <size> #图片大小
        <width>500</width>
        <height>333</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object> #多少个框就有多少个object标签
        <name>boat</name> #bounding box中的object的class name
        <pose>Frontal</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>22</xmin> #框的坐标
            <ymin>1</ymin>
            <xmax>320</xmax>
            <ymax>314</ymax>
        </bndbox>
    </object>
    <object>
        <name>person</name>
        <pose>Frontal</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>202</xmin>
            <ymin>71</ymin>
            <xmax>295</xmax>
            <ymax>215</ymax>
        </bndbox>
    </object>
    <object>
        <name>person</name>
        <pose>Frontal</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>170</xmin>
            <ymin>107</ymin>
            <xmax>239</xmax>
            <ymax>206</ymax>
        </bndbox>
    </object>
</annotation>

这里有一个非常好用的工具VOC框图工具,可以自动帮你生成需要的XML格式,实际中发现格式基本无误,只有小的地方需要改动下,大家对比下就知道怎么改了,我是在Linux下借助sed修改的,这个不难

但是,如果你已经有一个txt文件,存放目标以及框:filename objectname xmin ymin xmax ymax,那么该怎么用python生成xml文件呢?参考(2)提供代码

训练

参考(3)修改文件。

训练时可能遇到问题:
TypeError numpy.float64 object cannot be interpreted as an index
解决方法:
把numpy的版本由1.12.0降为.1.11.0既能解决
sudo pip install -U numpy=1.11.0

File "/home/meng/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 111, in append_flipped_images
assert (boxes[:, 2] >= boxes[:, 0]).all()
AssertionError

解决办法:
参考(3)

测试

参考(3)修改文件
执行
./tools/demo.py --net zf
出现问题:
File "./tools/demo.py", line 89, in demo
cls_scores = scores[:, cls_ind]
IndexError: index 6 is out of bounds for axis 1 with size 6
查看了一下demo.py的文件,原来是代码中subadult_males多写了
'''python
CLASSES = ('background',
'adult_males','subadult_males','subadult_males','adult_females','juveniles','pups')
'''

参考:(1)使用Faster-Rcnn进行目标检测(实践篇)
(2)提供把自己的图像处理成voc数据格式的代码
(3)指导在训练自己的数据时应该修改哪些文件
(4)指导如何把自己的数据变为VOC格式

posted on 2017-10-24 23:08  MissSimple  阅读(2108)  评论(0编辑  收藏  举报

导航