将 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……

另外多一嘴,AlexeyAB 的这个版本 比原作者的质量要稍微高一点。如果某些地方被原作者坑了好久的话,可以试试这个版本。

参考资料

发表评论

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