1. 程式人生 > >YOLO教程之訓練自己的資料

YOLO教程之訓練自己的資料

以上都是V2V2V1佔視訊記憶體少,訓練更快,指標更好,論文還沒有出來,程式碼裡面也有V1的相關檔案可以直接用。官網的教程寫得挺好,首先要仔細看了再看其他教程。

教程:目前所有的教程都是針對V1

  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