YOU ONLY LOOK ONCE
相关链接:http://guanghan.info/blog/en/my-works/train-yolo/
本文是在宁广涵博客的基础上,添加一些自己在训练中遇到的问题及解决方式,仅供学习与参考,同时也通过这样的方式把训练过程记录下来,方便自己下次训练。
宁广涵已将Gihub上的源文件做了一些修改,可以点击下载Darknet。
配置环境:Ubuntu 14.04, CPU;
1. 采集样本和注释
i. 录制一段视频,并利用Opencv对帧进行保存,这样很快就能采集上千张样本;
ii. 标记图片中目标的坐标,利用Bbox-Label-Tool比较方便;
2. 以Darknet的格式创建注释
在这一步骤,我们会产生一个darknet注释文件和一个训练列表,txt
经过BBox-Label-Tool产生的注释文件格式如下:
Class_number
Box1_x1 Box1_y1 Box1_width Box1_height
Box2_x1 Box2_y1 Box2_width Box2_height
......
经过convert.py转换之后的注释格式变为:
Class_number Box1_x1_ratio Box1_y1_ratio Box1_width_ratio Box1_height_ratio
Class_number Box2_x1_ratio Box2_y1_ratio Box2_width_ratio Box2_height_ratio
请注意,每个图片都有一个注释文件,但我们只需要一个图像的训练列表,为了方便,将images和labels两个文件夹放到darknet-master/data/下;
为了方便理解,链接是生成的文件的格式示例:
Q:运行convert.py的时候会遇到这样的错误
A:将lines = txt_file.read().split('\t\n')改成lines = txt_file.read().split('\n'),主要因为linux和windows的读取方式不同,不过windows下改成这个格式也只能在图中标记一个物体,如何更好的修改这段代码,之后有时间再做调整;
3. 修改一些代码
i. 在src/yolo.c 中改变class num 和class name,还需要修改其中的读取训练列表的路径等等;
如果想要训练新的类别,为了显示正确的png标签文件,我们还需要运行data/labels/make_l abels.py 以生成新的标签,并加入到labels文件夹下;
ii. 在 ctg/yolo.cfg 文件,改变output为(5x2+number of classes)x7x7,例如,一个类别的话改为539,并且修改222行的classes为1(要训练的类别)
iii. 还需要一个pre-trained weights文件
4. 可以开始训练了,
进入darknet-master根目录,先sudo make编译一下,然后运行:
./darknet yolo train cfg/yolo.cfg extraction.conv.weights
如果幸运,你就可以开始训练了!
不过,我还是遇到了一些些问题:
深陷在这个bug里找不到出路,最后终于在vim 训练列表文件的时候发现了:
咦,什么时候后面多了一个^M?真是其他编辑器都没有发现这个问题,只有vim显示出来了,怪不得图片加载不了...
vim下 :%s/^M//g 或者 :1,$s/^M//g 均可
补充一点: ^M是使用 "CTRL-V CTRL-M" 而不是字面上的 ^M
最后,可以开始训练了,因为刚刚训练上就敲了这篇文档,只是中间个效果成截图:
我也很紧张,不知道最后能不能训练出模型,不过听说没有GPU的情况下要训练很久,不过就当是熟悉一下配置训练过程啦...把训练过程及时记录下来,方便下次的训练...小编是菜鸟,一周的努力才调通这个训练过程...不过