1. 程式人生 > >Darknet 原始碼理解(一)----主體框架的理解

Darknet 原始碼理解(一)----主體框架的理解

簡介:

本系列博文介紹對Darknet原始碼的理解,這一部分為程式主體框架的理解。本博文預設讀者基本熟悉Darknet的使用。

正文:

darknet的主函式在darknet.c中,其中的main()函式根據終端輸入引數轉向不同的功能函式。

argv[1]= “detector”,則轉向run_detector()(該函式在detector.c),並將輸入引數傳遞給

run_detector()。

run_detector()根據引數不同,轉向不同的功能函式,如下圖所示,該段程式碼在detector.c的最下面。


熟悉darknet的使用的朋友肯定知道,一般檢測一張圖片時執行的命令為

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

結合上圖,當第二個引數為test時,將轉向執行test_detector()(在detector.c中)。具體程式參考detector.c中。

test_detector()中,

1. 執行network*net = load_network(cfgfile, weightfile, 0)初始化一個網路,cfgfile為模型配置檔案,weightfile

模型權重檔案。

2. 執行image im= load_image_color(input,0,0),讀取一張圖片,input為圖片地址。執行imagesized =

letterbox_image(im, net->w, net→h),對圖片進行

resizeresize成模型需要的大小。

3. 執行network_predict(net,X),模型進行前向傳播。X為輸入圖片。

4. 執行detection*dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1,&nboxes),根據網路的輸

出,提取出檢測到的目標的位置以及類別。

5. 執行draw_detections(im,dets, nboxes, thresh, names, alphabet, l.classes),將目標的位置以及類別標註在圖

片中。

注:

networkimagedetection等為框架中定義的結構體,其在

darknet.h檔案中宣告的。

總結:

test_detector()函式中,包含了我們熟悉的一個端到端的過程。即,初始化模型、讀取模型權重、讀取圖片、圖片resize

將圖片餵給模型進行前向傳播、根據模型輸出得到目標位置及類別、將目標位置及類別標註在圖片上。

下一篇部落格,將介紹輸入圖片讀取的具體過程!