Yolov2訓練自己的數據


一 、把20類改成1類

  1. cfg/voc.data文件中:

  2. classes 改成1
    names=data/pasacal.names。
    pasacal.names這一個文件要存在於darknet目錄下的data文件夾里,沒有的話可以自己在那個目錄下創建一個pasacal.txt,加上內容之后,修改文件后綴名變成pasacal.names即可,當然名字和路徑都可以自己定義。這個文件中的行數要和類數一致,每一行都是一個類別的名字。比如我的這一文件中就只有一行數據:“person”。這個文件在測試你訓練的model的時候會用到,系統會在圖片上畫出bounding box,bounding box上面的文字,也就是這個框中物體的名字,應該就來自這個文件。

      2、cfg/yolov2-voc.cfg文件中 :

          【region】層中 classes 改成1。

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

           修改filters的建議來源自(https://groups.google.com/forum/#!topic/darknet/B4rSpOo84yg),我修改了之后一切正常。

     3、examples/yolo.c 文件中 :

  • 位置大約第14行左右改成:char *voc_names={“n00000001”},原來里面有20類的名字,我改成了唯一1類的名字。
  • 位置大約第328行左右,修改draw_detection這個函數最后一個參數:20改成1。這個函數用於把系統檢測出的框給畫出來,並把畫完框的圖片傳回第一個參數im中,用於保存和顯示。
  • 位置大約第361行左右,demo函數中,倒數第三個參數我把20改成了1,雖然不知道有沒有用,反正對結果沒什么影響。

    4、src/yolo_kernels.cu 文件中 :

  • 位置第62行,draw_detection這個函數最后一個參數20改成1。

 

二、准備txt文檔

三、修改路徑

 1、cfg/voc.data文件中:

  • train = /home/yolo_v2_tinydarknet/darknet/infrared/infrared_train.txt //infrared_train.txt的完整路徑
  • valid = /home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt //infrared_val.txt的完整路徑
  • backup = /home/yolo_v2_tinydarknet/darknet/backup/ /* 這個路徑是YOLO用於備份的,在訓練過程中YOLO會不斷地對產生的weights文件進行備份,darknet目錄下就自帶一個backup文件夾,這個路徑指向那里。

2、examples/yolo.c 文件中:

  •      

  •  train_yolo函數中:

  • char *train_images =" /home/yolo_v2_tinydarknet/darknet/infrared/infrared_train.txt";//infrared_train.txt的完整路徑
    char *backup_directory = "/home/yolo_v2_tinydarknet/darknet/backup/";//可以修改為自己的路徑
  • validate_yolo函數中:

    char *base = "/home/yolo_v2_tinydarknet/darknet/results/comp4_det_test_";//可以修改自己的路徑,好像是用於保存測試結果
    list *plist=get_paths("/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt");//infrared_val.txt的完整路徑
    

      

  • validate_yolo_recall函數中:

    char *base = "/home/yolo_v2_tinydarknet/darknet/results/comp4_det_test_";//可以修改自己的路徑
    list *plist = get_paths("/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt");//infrared_val.txt的完整路徑
    

        

3、src/detector.c 文件中: 

位置第375行改成:list *plist = get_paths(“/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt”);//改成infrared_val.txt的完整路徑

需要注意的是,這個文件里的validate_detector_recall函數是用來計算輸出recall值的,后面會說

 

對了,可能你注意到,輸入到系統的infrared_train.txt或者infrared_val.txt都只是圖片的完整路徑,你也知道,要進行訓練的話,除了需要圖片還需要標記信息,然而標記信息僅僅用我的腳本voc_label_change.py從xml轉換成了YOLO可識別的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。比如: 
/home/yolo_v2_tinydarknet/darknet/infrared/image/dout/0000.jpg 
自動替換后變成了 
/home/yolo_v2_tinydarknet/darknet/infrared/image/dout/0000.txt 
所以在使用voc_label_new.py轉換生成txt格式的標記信息之后,只需要把這些txt格式的標記文件復制到圖片所在的目錄下即可。系統根據替換后的路徑地址來讀取對應標記文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM