官网: http://pjreddie.com/yolo/
相关文章: http://arxiv.org/abs/1506.02640
源代码: https://github.com/pjreddie/darknet.git
以上都是V2,V2比V1占显存少,训练更快,指标更好,论文还没有出来,代码里面也有V1的相关文件可以直接用。官网的教程写得挺好,首先要仔细看了再看其他教程。
教程:目前所有的教程都是针对V1的
http://guanghan.info/blog/en/my-works/train-yolo/
这个教程的作者是众多教程作者里最懂yolo的,下面的评论也提供了很多问题的解决思路,但是作者提供的convert.py文件写得不好懂,教程里关于这部分也没多加说明,下面我会说明数据处理的思路,最好是自己写个脚本来转换数据格式。
http://blog.csdn.net/fffupeng/article/details/52910902?locationNum=13&fps=1
虽然格式不是那么系统,但思路和要点都说到了
3)http://blog.csdn.net/qq_30401249/article/details/51564871
这个教程对于数据处理的阐述有不正确的地方,我就在这里卡了好久……
YOLO的安装:yolo的安装相对于caffe等环境非常简便,主要按照官网上去做http://pjreddie.com/darknet/install/
数据格式转换:
1)每张图片一个annotation,所有训练图片一个路径list。
2)annotation文件:数据要转换成darknet格式,作者提供了对voc数据的转换,但是别的数据就需要自己写脚本了,不建议用convert.py的脚本
转换算法:
坐标格式为:label x y w h
其中label为标签,x ,y为box的中心坐标/图片的宽度,高度。同理w,h为box的宽度和高度/图片的宽度,高度,数据不用截断。label标签这里需要特别注意,前面教程3)里这部分是有问题的。类标应该是从0开始,如果一类就是0,不用和文件夹名称对应,需要的是labels的.png文件名称和放图片的文件夹以及放annotation的文件夹名称对应。另外,教程中没有提到annotation生成之后放在哪里,事实上路径是默认在train.txt的路径其中的JPEGImages改成labels,路径的其余部分不变。
若用ning的convert.py的代码中,需要修改类别以适应不同类别的label
""" Configure Paths"""
mypath = "labels/stopsign_original/" # 改
outpath = "labels/stopsign/" #改
cls = "stopsign" # 改
if cls not in classes:
exit(0)
cls_id = classes.index(cls) # 本来就是对的,NGY教程改得不对
wd = getcwd()
list_file = open('%s/%s_list.txt'%(wd, cls), 'w') # 存储图片绝对位置信息
注意:
(1)原坐标信息文件每行结束不能只是换行,还要空格再换行才能与下一行分割开
(2)不过convert.py文件本身数据部分是对的,但是读写文件部分写的难以看懂,我跑出来出来的结果也不对
3)生成标签文件:无论是作者的代码还是ning改的make_labels.py都不能成功,出来sh: 1: convert: not found,解决方法:直接在终端输入python make_labels.py,显示>之后没了反应,中断它,因为这说明是这个命令有问题,输入convert(命令出错时可以直接试一试在终端输入,可能是没有安装这个命令),会显示包含在哪个包里,下载它!再运行make_labels.py,显示:convert.im6: unable to read font `futura-normal' @ warning/annotate.c/RenderType/853.是因为没有这个字体,在/usr/share/fonts/truetype/里的确找不到,所以随便改成一个系统自带的字体就好,注意用全路径(如*.ttc,*.ttf),比如:-font /usr/share/fonts/truetype/arphic/ukai.ttc,如果labels包含有中文,则需添加utf-8编码
in a word,在ubunbut下生成标签名的图片时,即文字转图片,报错, convert : unable to read font
脚本:make_label.py
成功范本:
# -*- coding: utf-8 -*-
import os
l=["rabbit", "fish", "deer", "tiger", "cat", "兔子"]
for word in l:
os.system("convert -fill black -background white -bordercolor white -border 4 -font /usr/share/fonts/truetype/arphic/ukai.ttc -pointsize 18 label:\"%s\" \"%s.png\""%(word, word))
3.修改代码:
1)yolo_kernel.cu
行62:draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, CLS_NUM);
2)yolo.c
行13:char *voc_names[] = {"text"};#改成自己的标签名
行17:char *train_images = "/media/zqh/_E/darknet2/scripts/train.txt";#改成自己的train.txt清单所在路径
char *backup_directory = "/media/zqh/_E/darknet2/backup";#改成自己的训练出来的权重文件保存路径
行322:draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, voc_labels, CLASSNUM);
倒数第2行:else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 1, frame_skip, prefix);#1改成自己的类别数
3)yolo_train.cfg
改class和output,当num=3,和论文中B=2不同,output要按num计算,output=(num*5+class)*49
4.其他训练步骤按照官网教程,训练时.cfg文件和初始权重要匹配:
yolo.cfg -> extraction.conv.weights
yolo-small.cfg -> strided.conv.weights
yolo-tiny.cfg -> darknet.conv.weights
yolo中用到的pre-trained weights的格式是.conv.weights的文件,根据不同的model,要对已有的weights进行转换。
./darknet partial cfg/extraction.cfg path/to/extraction.weights extraction.conv.weights # ./darknet partial 转化网络 现有weights的路径 需要生成的weights的路径
yolo_v2 cfg文件和对应的weights文件前缀一致,两个版本的weight不通用
./darknet partial cfg/darknet.cfg path/to/darknet.weights path/to/darknet.conv.weights