1. 程式人生 > >yolov3實踐(一)

yolov3實踐(一)

如果 分享 攝像 div 步驟 主程序 char 第一篇 index

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

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

兩個項目:

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. darknet

這個項目才是最重要的。首先第一步就是配置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等等。

yolov3實踐(一)