1. 程式人生 > >Darknet 程式碼分析(之一,準備工作)

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.001burn_inmax_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函式

待續。