Darknet 真是个强大的玩意儿:简洁,几乎没什么依赖,编译一次通过,速度快(貌似)。相比于跑 Faster RCNN,这个跳坑算是比较少的。
下面照例写出来各种跳坑的历程。新出的 V3 和 V2 用法是一样的。
下载代码和编译
最近魔都 Github 抽风,给 Git 挂个梯子就好了。
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
就这样,就这样……
如果需要使用 GPU 的话,在 Makefile
里面设置一下就好了:打开 cuda 和 cudnn。
nvcc 的路径,如果是官网下载 deb 完整包进行安装的话,路径可能是/usr/local/cuda-8.0/bin/
下载训练好的权重
很多……而且因为有 某个很恶心 的东西存在,所以很难下载。同样的,请挂梯子。
wget http://pjreddie.com/media/files/yolo.weights
如果不想显得那么乱的话,可以统一放到一个文件夹(例如:weights)里。
跑 Demo
./darknet detector test cfg/voc.data cfg/yolov2.cfg weights/yolo.weights data/dog.jpg
应该很快就能出结果吧。效果很震撼。
使用自己的数据进行训练
对,这才是重点。
数据准备
我们就使用 VOC 数据集吧。
Darknet 有自己专用的数据格式,好在有数据格式转换脚本,不需要我们自己写。这个脚本可以将 VOC 的 xml 数据转成 YOLO 的 TXT 数据: 每行一个框框,格式为 Class x y w h
。
首先,把下载回来的数据集放到 script/VOCdevkit
里面。之后,运行 python voc_label.py
。
如果你只下载了某年的数据,那么要在 voc_label.py
里面进行相应的修改。
我们会得到几个类似于 2007_train.txt
、2007_test.txt
的文件,将它们放在 data/voc/
里面吧。把几个 train 合并一下,形成 train.txt
文件。
配置文件修改
- 到
cfg
文件夹,将yolo-voc.cfg
和voc.data
复制一份(例如,jinyu121.cfg
和jinyu121.data
)。 在
jinyu121.cfg
文件中- 找到
region
小节的classes=20
,改为你的类别数。 - 找到最后一个
convolutional
小节的filters=125
,将它改成「(你的类别数+5)×5
」。更准确地说,「this depends on the num and coords, i.e. equal to(classes + coords + 1)*num
」。 - 注意最前面的图片大小不要改,否则就是完全重新训练一个网络了……
- 找到
- 在
jinyu121.data
文件中,改成classes= 你的类别数 train = data/voc/train.txt valid = data/voc/2007_test.txt names = data/jinyu121.names backup = backup
- 在
data
文件夹中建立jinyu121.names
,里面一行一个类别标签
到这里,数据准备完毕。
代码修改
其实需要修改的地方甚少……
在 src/detector.c
中,将大约 373 行的 voc.2007.test
改为 data/voc/2007_test.txt
然后重新编译一下。
下载预训练权重
curl -O http://pjreddie.com/media/files/darknet19_448.conv.23
开始跑
一个命令搞定:
./darknet detector train cfg/jinyu121.data cfg/jinyu121.cfg weights/darknet19_448.conv.23
呼呼拉拉一堆数字飞过。生成的模型会在 backup
文件夹里。
单张测试
./darknet detector test cfg/jinyu121.data cfg/jinyu121.cfg backup/jinyu121_final.weights your_own_image.png
预测 test 集
./darknet detector valid cfg/jinyu121.data cfg/jinyu121.cfg backup/jinyu121_final.weights
结果统计
统计 Recall:
./darknet detector recall cfg/jinyu121.data cfg/jinyu121.cfg backup/jinyu121_final.weights foofoofoofoo
生成 VOC 的提交结果,使用 Matlab 评测:
./darknet detector test cfg/jinyu121.data cfg/jinyu121.cfg backup/jinyu121_final.weights foofoofoofoo
最后那个 foo 可以不加,是为了凑参数数量用的……
在这里统一说明一下参数
./darknet 模块名称 动作 data 配置文件 cfg 配置文件 权重文件 文件列表
写在最后
这个东西太简洁太强悍了!!!
请收下我的膝盖 ORZ……
另外多一嘴,AlexeyAB 的这个版本比原作者的质量要稍微高一点。如果某些地方被原作者坑了好久的话,可以试试这个版本。
发表回复