将 Yolo V2 用在自己的数据集上

Darknet真是个强大的玩意儿:简洁,几乎没什么依赖,编译一次通过,速度快(貌似)。相比于跑Faster RCNN,这个跳坑算是比较少的。

下面照例写出来各种跳坑的历程。新出的V3和V2用法是一样的。

下载代码和编译

最近魔都Github抽风,给Git挂个梯子就好了。

就这样,就这样……

如果需要使用GPU的话,在Makefile里面设置一下就好了:打开cuda和cudnn。

nvcc的路径,如果是官网下载deb完整包进行安装的话,路径可能是/usr/local/cuda-8.0/bin/

下载训练好的权重

很多……而且因为有 某个很恶心 的东西存在,所以很难下载。同样的,请挂梯子。

如果不想显得那么乱的话,可以统一放到一个文件夹(例如:weights)里。

跑Demo

应该很快就能出结果吧。效果很震撼。

使用自己的数据进行训练

对,这才是重点。

数据准备

我们就使用VOC数据集吧。

Darknet有自己专用的数据格式,好在有数据格式转换脚本,不需要我们自己写。这个脚本可以将VOC的xml数据转成YOLO的TXT数据: 每行一个框框,格式为 Class x y w h

首先,把下载回来的数据集放到script/VOCdevkit里面。之后,运行python voc_label.py

如果你只下载了某年的数据,那么要在voc_label.py里面进行相应的修改。

我们会得到几个类似于2007_train.txt2007_test.txt的文件,将它们放在data/voc/里面吧。把几个train合并一下,形成train.txt文件。

配置文件修改

  1. cfg文件夹,将yolo-voc.cfgvoc.data复制一份(例如,jinyu121.cfgjinyu121.data)。

  2. jinyu121.cfg文件中

    1. 找到region小节的classes=20,改为你的类别数。
    2. 找到最后一个convolutional小节的filters=125,将它改成「(你的类别数+5)×5」。更准确地说,「this depends on the num and coords, i.e. equal to (classes + coords + 1)*num」。
    3. 注意最前面的图片大小不要改,否则就是完全重新训练一个网络了……
  3. jinyu121.data文件中,改成

  4. data文件夹中建立jinyu121.names,里面一行一个类别标签

到这里,数据准备完毕。

代码修改

其实需要修改的地方甚少……

src/detector.c中,将大约373行的voc.2007.test改为data/voc/2007_test.txt

然后重新编译一下。

下载预训练权重

开始跑

一个命令搞定:

呼呼拉拉一堆数字飞过。生成的模型会在backup文件夹里。

单张测试

预测test集

结果统计

统计Recall:

生成VOC的提交结果,使用Matlab评测:

最后那个foo可以不加,是为了凑参数数量用的……

在这里统一说明一下参数

写在最后

这个东西太简洁太强悍了!!!

请收下我的膝盖ORZ……

参考资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注