1. 程式人生 > >Windows下 YOLOv3配置教程(YOLOv3項VS2013平臺遷移的方法)

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