YOLO教程之訓練自己的資料
以上都是V2,V2比V1佔視訊記憶體少,訓練更快,指標更好,論文還沒有出來,程式碼裡面也有V1的相關檔案可以直接用。官網的教程寫得挺好,首先要仔細看了再看其他教程。
教程:目前所有的教程都是針對V1的
-
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
""" 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