Darknet 程式碼分析(之一,準備工作)
用yolo v3檢測圖片中的某種植物,沒找到網路定義檔案中的說明,看一下darknet的程式碼,做個筆記。
程式碼來源:
Alexey AB維護的Darknet 版本:
https://github.com/AlexeyAB/darknet
關於訓練自己的資料,說明見 https://github.com/AlexeyAB/darknet#how-to-use
1. 網路配置檔案.cfg
只有一個類areca,所以我拷貝yolov3.cfg,改名yolov3-areca.cfg。
內容修改:
Line 3: batch=64
Line 4: subdivisions=8
Line 610, 696, 783 :classes=1
Line 603, 689, 776: filters=18 (只改這三行,filters=(classes + 5)x3)
2. 分類名檔案
檔名: areca.names,裡面只有一行
areca
3. areca.data檔案
classes= 1
train = ./train.txt
valid = ./test.txt
names = ./areca.names
backup = backup/
4. 訓練
1) 下載預訓練的資料:
http://pjreddie.com/media/files/darknet53.conv.74
2) 執行訓練
darknet.exe detector train ./areca.data ./yolov3-areca.cfg darknet53.conv.74
注意,學習率應該為0.001,如果用多GPU訓練,則learning_rate * GPUs = 0.001,burn_in 和 max_batches 的值乘以GPU數量。
網上幾乎找不到關於.cfg檔案中網路定義的相關說明,這裡分析一下程式碼,整理一下思路,主要也是為了搞清楚訓練用的圖片檔案應該要注意什麼,怎樣才能更有效率。
程式碼邏輯
main函式在darknet.c中,如執行darknet的第一引數是"detector",則呼叫run_detector函式,如下:
... } else if (0 == strcmp(argv[1], "detector")){ **run_detector(argc, argv);** } else if (0 == strcmp(argv[1], "detect")){ float thresh = find_float_arg(argc, argv, "-thresh", .24); int ext_output = find_arg(argc, argv, "-ext_output"); char *filename = (argc > 4) ? argv[4]: 0; test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, ext_output); } ...
run_detector函式在detector.c中,第二個引數是"train",轉到train_detector函式,同在detector.c,在這裡,parse_network_cfg函式負責解析網路配置檔案。
在parser.c中,parse_network_cfg函式包裝了另外一個函式parse_network_cfg_custom函式
待續。