Yolo darknet训练自己的数据集教程(Newest 2016.12.23)
经过两天的折腾终于搞定了Yolo训练自己的数据集的过程,整个过程其实并不繁琐,只是网上一些过时的教程已经不适用了,依照那个反而让大家各种出出错,加之Yolo中文教程过少,因此本大神再次放一个,如果大家有任何问题直接在文章后面评论即可,笔者看到之后给予第一时间回复。
先插一句,Atom中文不能跟随窗口wrap文字的同学,打开settingview,设置soft wrap即可,百度上的答案真的是渣
Yolo简介
在训练数据集之前,相信大家对yolo应该有一些了解,本文所采用的测试环境为:Ubuntu 16.04 + opencv2.4 + cuda8 + cudnn5.1 PLUS GTX1080,当然这个硬件不是必须,在下只是偶尔装一下逼。Yolo基于darknet编写,而编译draknet的时候最好安装一下opencv,因为没有opencv图不会自动弹出,没有那种快感,你懂得,不知道如何安装opencv的同学去我之前写的几个博客中搜寻。均能够找到最新的答案。
yolo之所以快,是因为它的方法和fastrcnn以及其他detect算法不同,而采用了很多ssd的思想,在最新的更新中,yolo也改进了他们的算法,在pascal voc数据集上取得了不错的结果。本文将主要利用yolo来做realtime detect,对自己的数据进行训练和预测。
开始开车
OK,闲话不多说,让我们直接上车,这次是无人驾驶,速度比较快,大家系好安全带。
Step 1 编译darknet,并熟悉目录结构
第一部分没有什么说的,很简单其实,首先clone代码到本地~目录:
cd ~
git clone https://github.com/pjreddie/darknet
cd darknet
make
这个时候我们在home根目录就有了darknet了。直接编译,不需要修改任何参数,当然如何你是土豪,你有GTX1080,像我一样(手动装比)。可以编译一下Makefile里面的参数。为了防止大家出错我还是说一下,直接改标志为:
GPU=1
CUDNN=1
OPENCV=0
DEBUG=0
如果你的cuda没有设置环境变量,nvcc的路径也设置一下:
NVCC=/usr/local/cuda/bin/nvcc
不要想的很复杂其实很简单。ok,现在直接make,编译就可以了。
**Step 2 准备自己的数据集 **
好了我们现在有了darktnet,但是我要那个匡出物体的掉炸天的图怎么搞?莫慌,我们先用darknet自带的测试数据来测试一下。 首先呢,yolo这个网络是训练VOC数据集得来的,20中物体都能识别出来,我们直接下载已经训练好的权重然后来预测一张图片看看:
wget http://pjreddie.com/media/files/yolo.weights
这时候我们就下载好了yolo.weights,在darknet目录下。然后我们就可以用这个权重来预测啦!
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
detect命令意思是,检测,后面还有i一个命令是detector train,后者是训练的命令,预测用detect,cfg/yolo.cfg就是yolo这个网络的结构文件,后面是权重,最后后面是图片。 ok,enter你就可以看到狗和自行车了!~ 这就搞定了darknet,那么问题来了。自己的数据集怎么准备呢? 重点来了重点来了: * images 准备
首先,把你的图片放到一个/images 文件夹下面,文件名的名字要有规律,比如0001.jpg,0002.jpg….0100.jpg;
xml 准备
我相信很多人都需要用图片标注工具来对图片生成标注信息来训练,但是图片标注工具生成的多半是xml的标签信息。darknet需要的label并不是xml格式,而是一张图片一个txt的形式,txt中是你标注的物体方框坐标。后面我会放出几个脚本来处理。
xml 转 darknet label
xml转为darknet需要的label形式,一张图片一个标注信息。
生成图片路径 最后一部我们要生成两个txt文件,一个是train.txt,一个是valid.txt,train.txt包含了你训练图片需要的图片路径,没一行都是一张图片的路径,为了防止出错,后面我放出一个统一的脚本生成这个train.txt。
Step 3 训练之前修改darknet参数
接下来就要修改darknet的参数了,只要修改/cfg/voc.data 文件,因为yolo是为了voc而存在的,为了不修改源代码的情况下来训练我们的数据,建议直接修改voc.data而不是修改voc.data文件名。修改内容如下:
classes= 20
train = /home/pjreddie/data/voc/train.txt
valid = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/pjreddie/backup/
这里,classes就是你数据集的类别,names你的新建一个,在data下面,然后在这里指向它,仿照voc.names 新建即可。 修改train.txt valid.txt的路径,用绝对路径哦,防止出错,因为你darknet和数据可能不再一个目录。 ok,这就setup完了,接着直接训练。 不过训练之前获取一个预处理的权重:
curl -O http://pjreddie.com/media/files/darknet19_448.conv.23
然后,train:
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
对了,如果你上面改了voc.data的文件名,这里也要改,所以说其实改也是可以的。然后yolo-voc.cfg就可以不改了。
Step 4 yolo训练出的模型预测
./darknet detect cfg/yolo-voc.cfg /backup/voc.weights data/sample.jpg
这里不要和直接copy我的代码,cfg/yolo-voc.cfg就是我们训练的网络。后面是训练保存的权重,最后是你要预测的图片。 OK,看看结果咋么样~