YOLO V2教程之訓練自己的資料

來源:互聯網
上載者:User

1. yolo v2很多檔案和v1不一樣,而且迭代了很多個版,網上現有的V2教程裡的src/yolo_kernels.cu已經沒有了,這一步改動不用管

 

2. 教程:http://blog.csdn.net/hysteric314/article/details/54097845(記得修改完要重新make)

 

3.有關於測試閾值改動、中間參數可視化(不能直接用,因為中間參數格式變了)的教程:

http://blog.csdn.net/hrsstudy/article/details/65644517?utm_source=itdadao&utm_medium=referral

 

4. 為了讓YOLO v2能像訓練VOC資料集一樣訓練自己的資料集,需要對代碼進行以下三個方面的修改: (我在svt資料集上做映像文本檢測,是1類text)
一:修改分類的個數:在代碼中,預設VOC資料集是20類,而我要改成1類。 
二:準備txt文檔:VOC訓練資料集中會內建幾個txt文檔,用來指明檔案名稱或者路徑地址,而如果你使用你自己的資料可能就需要自己產生這些文檔。 
三:修改代碼中路徑資訊,把代碼中VOC訓練資料集的路徑改成自己訓練資料集的路徑

 

5. 把20類改成1類

1) cfg/voc.data檔案中:

classes 改成1。

names=data/svt.names。

svt.names這一個檔案要存在於darknet目錄下的data檔案夾裡,建立一個svt.names,加上內容,當然名字和路徑都可以自己定義。這個檔案中的行數要和類數一致,每一行都是一個類別的名字。比如我的這一檔案中就只有一行資料:“text”。這個檔案在測試你訓練的model的時候會用到,系統會在圖片上畫出bounding box,bounding box上面的文字,也就是這個框中物體的名字,應該就來自這個檔案。

 

2) cfg/yolo_voc.cfg檔案中 :

【region】層中 classes 改成1。

【region】層上方第一個【convolution】層,其中的filters值要進行修改,改成(classes+ coords+ 1)* (NUM) ,我的情況中:(1+4+1)* 5=30,我把filters 的值改成了30。

 

3) src/yolo.c檔案中 :

位置大約第14行左右改成:char *voc_names={“text”},原來裡面有20類的名字,我改成了唯一1類的名字。

位置大約第328行左右,修改draw_detection這個函數最後一個參數:20改成1。這個函數用於把系統檢測出的框給畫出來,並把畫完框的圖片傳回第一個參數im中,用於儲存和顯示。

位置大約第361行左右,demo函數中,倒數第三個參數把20改成了1。

scripts/voc_label.py 檔案中 :

這裡我不是用作者的代碼,因為當時v1的這個檔案跑不出來,所以找了另外的

# -*- coding: utf-8 -*-    

import os  

l=["text"]  

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))

 

6. 資料格式轉換(準備txt文檔)

一共需要準備四種txt格式文檔,分別是記錄訓練集和測試集的座標和路徑的annotation檔案和list檔案。

1) 每張圖片一個annotation,但是存放路徑和V1不同。

V1:需要的是labels的.png檔案名稱和放圖片的檔案夾以及放annotation的檔案夾名稱對應。至於annotation產生之後放在哪裡,事實上路徑是預設在train.txt的路徑其中的JPEGImages改成labels,路徑的其餘部分不變。

V2:labels的.png檔案名稱就是和類別名稱一樣,測試集和訓練集分別放在兩個檔案夾(不知是否也適用於多類),通過2) 中的list檔案來指明每張圖片的完整路徑,那麼每張圖片annotation的txt檔案放在哪呢。

因為在訓練集中,一個圖片檔案和這一圖片檔案對應標記檔案,他們倆除了尾碼名之外其餘的名稱是一樣的,所以src/yolo.c中有以下語句:

          find_replace(path, "dout", "labels", labelpath);

          find_replace(labelpath, "JPEGImages", "labels", labelpath);

          find_replace(labelpath, ".jpg", ".txt", labelpath);

          find_replace(labelpath, ".JPEG", ".txt", labelpath);

函數會找到路徑中的圖片尾碼名.jpg,自動替換成.txt,所以只需要把這些txt格式的標記檔案複製到圖片所在的目錄下即可。系統根據替換後的路徑地址來讀取對應標記檔案。

 

2) 所有訓練圖片一個路徑list,測試集也是一個list檔案。下面會說明如何在代碼中修改路徑資訊,指向這兩個檔案。

 

7. 修改路徑

1) cfg/voc.data檔案中:

train = /home/pjreddie/data/voc/train.txt //修改為訓練list的路徑

valid = /home/pjreddie/data/voc/2007_test.txt /*修改為測試list的路徑,因為test不能返回評價指標,valid才行*/

backup = backup /* 這個路徑是YOLO用於備份的,在訓練過程中YOLO會不斷地對產生的weights檔案進行備份,darknet目錄下就內建一個backup檔案夾,這個路徑指向那裡。這裡建議修改為自己的路徑 */

 

2) src/yolo.c 檔案中:

train_yolo函數中:

char *train_images = "/data/voc/train.txt"; //修改為訓練list的路徑

char *backup_directory = "/home/pjreddie/backup/"; //修改為上面的backup路徑

validate_yolo函數中:

char *base = "results/comp4_det_test_"; /*可以修改自己的路徑,comp4_det_test_[類名].txt用於儲存valid命令的測試結果*/

list *plist = get_paths("/home/pjreddie/data/voc/2007_test.txt");//修改為測試list的路徑

validate_yolo_recall函數中:

char *base = "results/comp4_det_test_"; //可以修改自己的路徑

list *plist = get_paths("data/voc.2007.test"); //修改為測試list的路徑

 

3) src/detector.c 檔案中: 

char *train_images = option_find_str(options, "train", "data/train.list"); //修改為訓練list的路徑

char *backup_directory = option_find_str(options, "backup", "/backup/"); //修改為自己的backup路徑

validate_detector_flip函數中:

char *valid_images = option_find_str(options, "valid", "data/train.list"); //修改為測試list路徑,該函數對應的測試命令為valid2

validate_detector函數中:

char *valid_images = option_find_str(options, "valid", "data/train.list"); /*修改為測試list路徑,該函數對應的測試命令為valid*/

validate_detector_recall函數中:

list *plist = get_paths("data/voc.2007.test"); //修改成測試list路徑

 

8. 調整評價指標

src/detector.c 檔案中:

1) 修改評估閾值

評估模型可以使用命令valid或recall

修改valid2閾值(預設.005),validate_detector_flip函數中:

float thresh = .005; //修改為需要的閾值如.1

修改valid閾值(預設.005),validate_detector函數中:

float thresh = .005; //修改為需要的閾值如.1

修改recall閾值(預設為.001),validate_detector_recall函數中:

float thresh = .001; // 修改為需要的閾值如.25

 

2) 增加返回precision指標並註明指標名稱

//fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);

fprintf(stderr, "ID:%5d Correct:%5d Total:%5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\t", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);

fprintf(stderr, "proposals:%5d\tPrecision:%.2f%%\n",proposals,100.*correct/(float)proposals);

//評價指標都是累積的,而不是單張圖片的

 

9. 修改完上面所有之後,就可以開始訓練啦,最重要的別忘了先重新make:

make clean

make -j16

否則框不出東西別怪我哈哈哈,當然忘了重新make訓練出來的權重是不受影響的

訓練命令:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 | tee  ./svt_train_log.txt

一般我都用| tee [路徑+檔案名稱] (後面加上-a是續寫)命令,或者ls -l >[路徑+檔案名稱] (>>[路徑+檔案名稱]則是續寫)命令,來匯出中間過程,一方面備份方便查看,另一方面可以根據中間參數畫出圖表來分析,第2點的教程裡有共用可視化中間參數的代碼,但是不能直接用,因為中間參數格式變了

 

10. 測試並返回評價指標

1) ./darknet detector test cfg/voc.data cfg/yolo-voc.cfg ./svt/backup/yolo-voc_final.weights

/*不現實評價指標,輸入圖片路徑,只顯示框好後的圖片和類別、置信率*/

 

2) ./darknet detector valid cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights

/*在終端只返回用時,在./results/comp4_det_test_[類名].txt裡儲存測試結果*/

 

3) ./darknet detector recall cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights

/*依次ID:圖片序號從0開始,correct:累計檢測正確的總框數,total:累計的總ground truth數,RPs/Img: 累計的總proposals/已檢測圖片數,IOU,Recall: correct / total,proposals:累計的總框數,Precision: correct / proposals*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.