一 、把20類改成1類
-
cfg/voc.data文件中:
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格式的標記文件復制到圖片所在的目錄下即可。系統根據替換后的路徑地址來讀取對應標記文件。