YOLO教程之训练自己的数据

官网: http://pjreddie.com/yolo/ 
相关文章: http://arxiv.org/abs/1506.02640 
源代码: https://github.com/pjreddie/darknet.git

以上都是V2V2V1占显存少,训练更快,指标更好,论文还没有出来,代码里面也有V1的相关文件可以直接用。官网的教程写得挺好,首先要仔细看了再看其他教程。

教程:目前所有的教程都是针对V1

  1. http://guanghan.info/blog/en/my-works/train-yolo/

    这个教程的作者是众多教程作者里最懂yolo的,下面的评论也提供了很多问题的解决思路,但是作者提供的convert.py文件写得不好懂,教程里关于这部分也没多加说明,下面我会说明数据处理的思路,最好是自己写个脚本来转换数据格式。

  2. http://blog.csdn.net/fffupeng/article/details/52910902?locationNum=13&fps=1

    虽然格式不是那么系统,但思路和要点都说到了

    3http://blog.csdn.net/qq_30401249/article/details/51564871

    这个教程对于数据处理的阐述有不正确的地方,我就在这里卡了好久……

     

  1. YOLO的安装:yolo的安装相对于caffe等环境非常简便,主要按照官网上去做http://pjreddie.com/darknet/install/

     

  2. 数据格式转换:

    1)每张图片一个annotation,所有训练图片一个路径list

    2annotation文件:数据要转换成darknet格式,作者提供了对voc数据的转换,但是别的数据就需要自己写脚本了,不建议用convert.py的脚本

    转换算法:

    坐标格式为:label x y w h

    其中label为标签,x ybox的中心坐标/图片的宽度,高度。同理whbox的宽度和高度/图片的宽度,高度,数据不用截断。label标签这里需要特别注意,前面教程3)里这部分是有问题的。类标应该是从0开始,如果一类就是0,不用和文件夹名称对应,需要的是labels.png文件名称和放图片的文件夹以及放annotation的文件夹名称对应。另外,教程中没有提到annotation生成之后放在哪里,事实上路径是默认在train.txt的路径其中的JPEGImages改成labels,路径的其余部分不变。

    若用ningconvert.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.修改代码:

    1yolo_kernel.cu

    62draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, CLS_NUM);

    2yolo.c

    13char *voc_names[] = {"text"};#改成自己的标签名

    17char *train_images = "/media/zqh/_E/darknet2/scripts/train.txt";#改成自己的train.txt清单所在路径

        char *backup_directory = "/media/zqh/_E/darknet2/backup";#改成自己的训练出来的权重文件保存路径

    322draw_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改成自己的类别数

    3yolo_train.cfg

    classoutput,当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

你可能感兴趣的:(深度学习)