yolov3實踐(一)

不少博友看了個人第一篇博客yolo類檢測算法解析——yolo v3,對其有了必定的認識和了解,可是並無貼出代碼和運行效果,略顯蒼白。所以在把篇博客理論的基礎上,造就了第一篇實踐文章,也就是本文。只要讀者有着強大的理論支撐,什麼模型什麼框架都是同樣玩。因此老師又會跟你說哲學和科學、科學和技術存在如何的關聯,儘管很抽象,可是沒有人反駁過就像有這麼多的編程語言,各有特點,最後也都幹了相同或類似的事,那麼多的框架,各有千秋,最後也都幹了相同或類似的事。又或者說反了,是由於它們都想幹相同或類似的事,而又有着不一樣的實現方法,最後造成了那麼多的框架和語言,也許這就是All roads lead to Rome的道理。雖都是通往羅馬的路,可是每條路的特徵不同,存在即合理......html

yolov3的實踐篇必須向讀者介紹兩個很好用的開源項目,面向Windows開發用戶而設計,而它們都來源於同一個做者,也就是AlexeyAB,做者的奉獻推進了yolo系列算法的研究和推動,在此僅以綿薄的文字表達對做者的敬仰之意。本篇博客主要是介紹、安裝和使用這兩個項目的入門介紹。git

兩個項目:github

1. Yolo_mark算法

這是在yolo項目下做者建立的標註項目,就是把圖片集標註成一個txt文件,以下:編程

0 0.498437 0.481499 0. 117188 0.175000

第一位是類ID,表示爲0具體表明的是啥,請看相應的.names文件,而後接下來四個小數字表明的是bbox和圖片分辨率的關係,具體說明一下:框架

 yolo中用到的GT都是bbox中心點座標,可是光有中心點座標是不能準肯定位一個框的,因此須要兩個輔助的座標,天然就是框的寬和高,並對其歸一化處理;而在預測環節,若是用相對anchor box的絕對值座標,同一目標相對anchor的位置受參數影響變化很大,模型收斂困難,所以論文經過相對網格點的偏移固定bbox中心點,並經過先驗anchor box預測bbox的寬和高,這樣的話,能夠歸納爲:編程語言

#GT:假設bbox的中心點座標爲(x,y);bbox的寬和高分別爲(w,h);圖片分辨率爲(u,v),原本的座標是(x,y,w,h);歸一化後的座標是:(x/u, y/v, w/u, h/v)
#Pr:(x,y,w,h)經過創建相對網格點和anchor box的位置關係得到。
#同理,上述推理也很容易求得bbox矩形框的座標,畫出最終的檢測結果。

曾經我也試用了一下,感受仍是很不錯的,感興趣的能夠寫一個標註的工具分享給你們。函數

如何編譯和使用,項目介紹裏寫得很清楚;須要將opencv的依賴配置到項目屬性中,編譯過程當中可能會遇到以下錯誤:工具

  • 找不到highgui.hpp:這個錯誤是因爲頭文件地址不對,把highgui.hpp的地址改成#include<opencv2/highgui/highgui.hpp>。
  • snprintf()函數報錯:在Windows系統中該函數實際上是_snprintf,可是編譯器提示最好用_snprintf_s()函數替代。

2. darknetpost

 這個項目纔是最重要的。首先第一步就是配置darknet。本文的環境是cuda8.0和cudnn7。首先須要打開darknet項目的vcxproj文件,修改cuda版本,不然會沒法加載darknet項目。修改9.1 爲8.0,如圖:

 

緊接着打開darknet項目解決方案,配置項目屬性。

  • 配置第三方庫,如圖所示。

  • 配置opencv,步驟同上,include,lib,若是配置好就不須要再配了,此處省略。
  • 預編譯器定義。

接下來就能夠build該項目了,如圖所示:

 

成功以後,就是和以前的yolo版本同樣用了,Ubuntu的也是,代碼也是差很少。下面測試一下其性能:

測試視頻:darknet.exe detector demo data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 test.mp4 

測試圖片:darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 test.jpg

測試USB攝像頭:darknet.exe detector demo data/coco.data yolov3.cfg yolov3.weights  -i 0 -thresh 0.25 -c 0

忘截圖了,若是USB攝像頭沒法調用,第一步確保電腦相機能夠打開,第二步嘗試更換-c 後面的編號,第三步參考USB攝像頭沒法正常讀取問題

最後,重要的部分,yolo裏面有幾個源代碼文件對應於上面的測試,具體請看:darknet.c(主程序)解析第一個輸入的關鍵字指令,好比上面的detector,而後執行run_detector(int argc, char **argv)這個函數,接着跳到detector.c,繼續解析命令行關鍵指令,好比上面的demo和test和後面跟着的配置參數如cfg,data,weight等等,重點是demo跳到

demo(cfg, weights, thresh, hier_thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename, http_stream_port, dont_show);

就到了demo.c裏面,test就跳到test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, dont_show)函數了。還有image.c,detection_layer.c,utils.c,data.c等等。

歡迎加入QQ交流羣864933024

相關文章
相關標籤/搜索