Faster-RCNN训练自己的数据集

就目前我在了解到的资料来看,训练RCNN系列,一般有两种思路:

  • 修改CNN的工程代码,适应自己的数据集格式
  • 将自己的数据格式做成VOC2007形式的数据集

从工作量来看,无疑后者更容易一些,本文的思路也是如此。

  1. 首先是图片的命名格式,虽然图片的命名理论上不会影响训练。因为训练的数据都是从txt文件中读取图片的名称。但是为了统一数据集,仍然建议批量、有规律的命名数据图片。

    我的数据集是jpg格式,和PASCAL_VOC2007一样。将图片置于同一个文件夹中,然后运行一段python代码即可。

    代码见文末

  2. 命名之后,就可以进行标注了。我借用了一个网上的标注工具,windows7下运行良好,可惜没放出源码,无法学习交流。

    • 标注工具得到了一份标注的集合的txt文件,记录图片和标注信息

      Faster-RCNN训练自己的数据集_第1张图片

  3. 上述都是准备工作,然后就可以制作VOC格式的数据集了。总体来看,VOC格式的数据集格式如下:

    ---VOC2007
    ------Annotations
    ------ImagesSet
    ---------Main
    ------JPEGImages
    • Annotations中存放的是.xml文件,文件中记录描述每张图片的信息

      Faster-RCNN训练自己的数据集_第2张图片

    • ImagesSet\Main中存放txt文件,每个文件中写入训练和测试所用的数据(也就是图片名称的集合)
      这里写图片描述

    • JPEGImages中存放的是数据集中的图片

    关于VOC数据集格式,不清楚的可以下载一份VOC2007数据集,看一下就明白了。

  4. 搞明白了数据集包含哪些内容之后就可以制作数据集了。首先是Annotations中的xml文件,这些文件是根据标注信息得到的txt文件生成的。我参考了网上的一些代码,自己写了一份python脚本,运行良好。只需要读入txt文件和遍历图片即可。

    代码见文末

    因为JPEGImages中只是存放图片,所以我在生成Annotations时,同时拷贝了每张图片到JPEGImages中,也就完成了这两个文件夹的内容。

    【注意】: xml文件中很多标签内容不一定要一样,可以自己定义,比如作者什么的,我是根据VOC的xml内容来修改的,大家也可以自己修改。

  5. 制作Main中的四个txt文件

    txt内容即是图片名字,所以遍历一遍JPEGImages或者Annotations都行,我遍历了Annotations。

    • test.txt是测试集,大概是整个数据集的50%;
    • trainval是训练和验证数据集,也就是整个数据集的剩余的50%
    • train.txt是训练集,是trainval的50%
    • val.txt是验证集,trainval剩余的50%

    代码见文末

  6. 这样就完成VOC2007格式的数据集的制作。如果想要训练faster-RCNN,还需要进入faster-RCNN中修改网络的一些参数。请参考:

    Faster-RCNN训练自己的数据集python版本

  7. 因为标注过程中,可能存在标注的目标框太靠近边缘或者自己没注意,导致标注的数据在训练时产生了异常,通常是

    assert(boxes[:,2]>=boxes[:,0]).all()

    这行代码报错。(反正我中招了。。。)

    原因和解决办法看这里

    解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()的问题

    亲测前两步即可解决


以上即是简单的Faster-RCNN训练自己的数据集教程,整个教程涉及的代码(均为python)可以在github上下载,感谢参考的两篇博文!

你可能感兴趣的:(CNN)