Windows下 YOLOv3配置教程(YOLOv3項VS2013平臺遷移的方法)
Summary: YOLOv3—Windows配置
Author: Amusi
Date: 2018-04-05
目錄
系統環境
- Win10
- Visual Studio 2013
- CUDA 8.0
- cudnn 5.1
- OpenCV3.3.1()和OpenCV2.4.13(x64)
安裝教程
下載darknet
開啟cmd命令提示符,輸入下述命令,下載AlexeyAB/darknet(假設你已經安裝好git環境)
然後根據下圖進行操作
修改darknet.vcxproj
開啟darknet/build/darknet/darknet.vcxproj,將14全部替換為12
開啟darknet.vcxproj,將CUDA 9.1全部替換為CUDA 8.0
修改OpenCV路徑,其中x64版本最重要,至於x86版本屬於可選。因為建議使用x64版本
對於x64版本
將C:\opencv_3.0\opencv\build\include替換為D:\OpenCV\OpenCV3.3.1\OpenCV3.3.1_Contrib_VS2013_x64\install\include
對於x86版本
將C:\opencv_2.4.9\opencv\build\include替換為D:\OpenCV\OpenCV2.4.9\OpenCV2.4.9_VS2013\install\include
將C:\opencv_2.4.9\opencv\build\x86\vc12\lib替換為:D:\OpenCV\OpenCV2.4.9\OpenCV2.4.9_VS2013\install\x86\vc12\lib
將compute_52,sm_52替換為compute_50,sm_50(不知道可行不可行,不知道必要不必要)
改好後,部分程式碼如下
修改darknet.sln
將Visual Studio 2015的屬性修改為Visual Studio 2013(當前VS版本)的屬性
修改為:
開啟darknet.sln
以防止萬一,加上OpenCV3.3.1的屬性表
將當前解決方案設定為Release x64
配置好OpenCV路徑後,隨便開啟幾個.c檔案快速瀏覽一下
編譯darknet工程
編譯過程中,你會發現此時可能出現下述問題,如果沒有出現,那就基本直接編譯成功。
如果發生問題,可以參考下述解決方案:
注:我是自己用CMake和Visual Studio 2013重新編譯的OpenCV,所以.lib和.dll命名與官方提供的動態連結庫名稱不一樣,如果你直接用官方編譯好的庫,那麼可以省很多事。
查詢world關鍵字,發現在detector.c中,有
將#ifndef CV_VERSION_EPOCH到#endif註釋掉,因為我已經新增好了屬性表,所以不用在程式中顯式宣告使用哪個lib。這裡其實取決你的OpenCV是如何配置的,如果是使用官方提供編譯好的OpenCV,那麼就不需要改這些內容了;如果是自己用CMake編譯的,那麼請參考剛剛描述的內容。
然後重新編譯
接下來,就是見證奇蹟的時刻:
上述是x64版本的darknet配置過程,如果你想配置x86版本,其實步驟類似,只需要將屬性表替換即可。
這裡可以看一下我是如何繼續配置x86版本的。
同理,新增x86版本的OpenCV屬性表,我這裡使用的是OpenCV2.4.9 x86,
並將當前工程的狀態切換成Release x86:
然後編譯當前x86工程
接下來,就是再次見證奇蹟的時刻
但...還是遇到問題了
原來我電腦裡沒有x86版的cublas.lib,這個就尷尬了,但這個不重要,其實我已經配置好了x64版本,這個x86只是嘗試。如果你依舊堅持,那麼可以下載x86版本的cublas.lib,或者你電腦裡本身就有,這就更美滋滋了。
再看一下darknet\build\darknet\x64資料夾,哇塞,那個darknet.exe就是你夢寐以求的!!!
準備
下載yolov3.weights
連結1(百度雲):連結:https://pan.baidu.com/s/1OsuaURd2jjA9_fX50w651g 密碼:chmq
連線2(官網):https://pjreddie.com/media/files/yolov3.weights
測試
開啟cmd命令提示符,切換到F:\Projects\Object Detection\YOLO\Darknet\Linux_Windows\darknet\build\darknet\x64路徑下
YOLOv3影象目標檢測
輸入:
- darknet.exe detector test data\coco.data yolov3.cfg .\weights\yolov3.weights
F:\Projects\Object Detection\YOLO\Darknet\Linux_Windows\darknet\build\darknet\x64\data\dog.jpg
F:\Projects\Object Detection\YOLO\Darknet\Linux_Windows\darknet\build\darknet\x64\data\giraffe.jpg
上述是針對多幅影象的檢測
YOLOv3視訊目標檢測
接下來,介紹一下使用網路攝像頭來檢測的命令
- darknet.exe detector demo data\coco.data yolov3.cfg weights\yolov3.weights
- darknet.exe detector demo data\coco.data cfg\yolov3.cfg weights\yolov3.weights -c 0
上述兩種命令都不能正常執行,出現下述問題:
對當前問題.exe進行除錯,發現斷點調到http_stream.cpp中的第217行的cpp_cap.isOpenCV()處(和上述github問題吻合)。其實就是get_webcam_frame函式的形參傳入值有問題!
仔細檢視變數狀態,此時cap有問題,居然是NULL???
那麼怎麼修改呢???
問題:攝像頭亮著,但程式崩潰
到底怎麼解決呢?這裡我們參考下述方法,使用OpenCV2.4.13
我們將darknet資料夾複製一份,重新命名為darknet-opencv2
此時,嘗試將已新增的OpenCV3.3.1屬性表刪除,新增OpenCV2.4.13(x64)版本的屬性表;
再將darknet工程屬性裡的OpenCV include和lib路徑進行修改
再對原始碼進行編譯
然後對開啟darknet解決方案,對工程進行重新編譯—>生成。
出現下述情況,即表示編譯成功!
接下來,開啟cmd命令提示符,切換至darknet-opencv2\build\darknet\x64路徑下,
輸入使用網路攝像頭來檢測的命令
- darknet.exe detector demo data\coco.data yolov3.cfg weights\yolov3.weights
- darknet.exe detector demo data\coco.data cfg\yolov3.cfg weights\yolov3.weights -c 0
YOLOv2視訊目標檢測
- .\darknet.exe detector demo cfg\coco.data cfg\yolov2.cfg weights\yolov2.weights
注:奇怪,為什麼YOLOv2的FPS比YOLOv3的還高
YOLOv2-Tiny-VOC視訊目標檢測
- .\darknet.exe detector demo cfg\voc.data cfg\yolov2-tiny-voc.cfg weights\yolov2-tiny-voc.weights
注:FPS雖然很高,但這檢測率太差了...
安裝Yolo_mark
開啟yolo_mark.sln,將環境設定為v120
(可選)刪掉不必要的opencv環境路徑
新增OpenCV3的屬性表
將main.cpp下述內容修改:
但編譯時居然還會出錯,但機智的Amusi直接對yolo_mark的Release x64進行了OpenCV重新配置
再次編譯
進入Yolo_mark\x64\Release資料夾下,雙擊yolo_mark.cmd,即可看見
參考
[6]YOLOv3翻譯:https://blog.csdn.net/amusi1994/article/details/79698890