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),對圖片進行
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),將目標的位置以及類別標註在圖
片中。
注:
network、image、detection等為框架中定義的結構體,其在
總結:
在test_detector()函式中,包含了我們熟悉的一個端到端的過程。即,初始化模型、讀取模型權重、讀取圖片、圖片resize、
將圖片餵給模型進行前向傳播、根據模型輸出得到目標位置及類別、將目標位置及類別標註在圖片上。
下一篇部落格,將介紹輸入圖片讀取的具體過程!