效果圖

簡介
Yolo,是實(shí)時(shí)物體檢測的算法系統(tǒng),基于Darknet—一個(gè)用C和CUDA編寫的開源神經(jīng)網(wǎng)絡(luò)框架。它快速,易于安裝,并支持CPU和GPU計(jì)算,也是yolo的底層。本文主要介紹在win10系統(tǒng)上配置darknet環(huán)境,編譯,使用yolo實(shí)現(xiàn)開頭展示的目標(biāo)檢測效果。主要包括以下幾個(gè)步驟:
編譯流程 -> 環(huán)境安裝 -> VS2017配置和編譯 -> 運(yùn)行展示
YOLO,美語新詞,是You Only Live Once的首字母縮略詞,意為你只能活一次,應(yīng)該活在當(dāng)下,大膽去做。

本文的YOLO,意為:You Only Look Once,再點(diǎn)進(jìn)官網(wǎng),一股暗黑色系地風(fēng)格讓人覺得很magic,編程真有意思~

yolo官網(wǎng):https://pjreddie.com/darknet/yolo/
darknet官網(wǎng):https://pjreddie.com/darknet/
github:Linux:https://github.com/pjreddie/darknet windows:https://github.com/AlexeyAB/darknet
編譯流程
要使用yolo,必須先安裝darknet、darknet可以直接在githb上下載壓縮包:https://github.com/AlexeyAB/darknet
本文主要介紹darknet在win10上的編譯流程。github上介紹了Linux和Windows下darknet的編譯,我這里直接用谷歌瀏覽器翻譯了:
1.如何在Linux上編譯
只是make在darknet目錄中。在make之前,您可以在Makefile:link中設(shè)置這些選項(xiàng)
-
GPU=1用CUDA構(gòu)建以使用GPU加速(CUDA應(yīng)該在/usr/local/cuda) -
CUDNN=1使用cuDNN v5-v7構(gòu)建以使用GPU加速訓(xùn)練(cuDNN應(yīng)該在/usr/local/cudnn) -
CUDNN_HALF=1構(gòu)建Tensor核心(在Titan V / Tesla V100 / DGX-2及更高版本上)加速檢測3x,訓(xùn)練2x -
OPENCV=1使用OpenCV 3.x / 2.4.x構(gòu)建 - 允許檢測來自網(wǎng)絡(luò)攝像機(jī)或網(wǎng)絡(luò)攝像頭的視頻文件和視頻流 -
DEBUG=1可以調(diào)試Yolo的版本 -
OPENMP=1使用OpenMP支持構(gòu)建,通過使用多核CPU來加速Yolo -
LIBSO=1構(gòu)建使用此庫的庫darknet.so和二進(jìn)制可運(yùn)行文件uselib?;蛘吣梢試L試運(yùn)行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4如何從您自己的代碼中使用此SO庫 - 您可以查看C ++示例:https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp 或者使用這樣的方式:LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov3.cfg yolov3.weights test.mp4
要在Linux上運(yùn)行Darknet,請(qǐng)使用本文中的示例,./darknet而不是darknet.exe使用,即使用此命令:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights
2.如何在Windows上編譯(使用vcpkg)
- 將Visual Studio安裝或更新到至少2017版,確保將其完全修補(bǔ)(如果不確定自動(dòng)更新到最新版本,請(qǐng)?jiān)俅芜\(yùn)行安裝程序)。如果您需要從頭開始安裝,請(qǐng)從此處下載VS:Visual Studio 2017社區(qū)
- 安裝CUDA和cuDNN
- 安裝
git和cmake。確保它們至少在當(dāng)前帳戶的路徑上 - 例如,安裝vcpkg并嘗試安裝測試庫以確保一切正常
vcpkg install opengl - 定義環(huán)境變量,
VCPKG_ROOT指向安裝路徑vcpkg - 使用名稱
VCPKG_DEFAULT_TRIPLET和值定義另一個(gè)環(huán)境變量x64-windows - 打開Powershell(作為標(biāo)準(zhǔn)用戶)并鍵入(最后一個(gè)命令需要確認(rèn)并用于清理不必要的文件)
- [僅限CUDA]使用首選計(jì)算功能自定義CMakeLists.txt
- 使用Powershell腳本構(gòu)建
build.ps1或使用Visual Studio 2017的“打開文件夾”功能。在第一個(gè)選項(xiàng)中,如果要使用Visual Studio,您將找到包含所有相應(yīng)配置的構(gòu)建后由CMake為您創(chuàng)建的自定義解決方案系統(tǒng)的標(biāo)志。
環(huán)境安裝
1.安裝Visual Studio2017
官網(wǎng)下載安裝社區(qū)版即可:https://visualstudio.microsoft.com/zh-hans/downloads/

安裝時(shí)依照自己的開發(fā)需要,勾選相應(yīng)的環(huán)境:

一定要選下面這個(gè)V140工具集,不然用141的會(huì)報(bào)錯(cuò).....

安裝時(shí)沒有選完整也沒關(guān)系,可以在Visual Studio Installer修改

2.安裝CUDA和CUDNN
官網(wǎng)下載即可,我的安裝包如下:
cuda_9.0.176_win10.exe
cudnn-9.0-windows10-x64-v7.4.2.24
Nvidia和CUDA和CUDNN的關(guān)系,參考:https://blog.csdn.net/qq_35941018/article/details/96481116
一關(guān)系闡述:
(1)NVIDIA的顯卡驅(qū)動(dòng)程序和CUDA完全是兩個(gè)不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行計(jì)算框架,也就是說CUDA只能在NVIDIA的GPU上運(yùn)行,而且只有當(dāng)要解決的計(jì)算問題是可以大量并行計(jì)算的時(shí)候才能發(fā)揮CUDA的作用。
CUDA的本質(zhì)是一個(gè)工具包(ToolKit);但是二者雖然不一樣的。
顯卡驅(qū)動(dòng)的安裝:
當(dāng)我們使用一臺(tái)電腦的時(shí)候默認(rèn)的已經(jīng)安裝了NVIDIA的顯卡驅(qū)動(dòng),因?yàn)闆]有顯卡驅(qū)動(dòng)根本用不了顯卡嘛,但是這個(gè)時(shí)候我們是沒有CUDA可以用的,我們可以更新我們的驅(qū)動(dòng),更新鏈接為:
https://www.nvidia.com/Download/index.aspx?lang=en-us
在這個(gè)里面可以根據(jù)自己的顯卡類型選擇最新的驅(qū)動(dòng)程序。顯卡驅(qū)動(dòng)程序當(dāng)前大小大概500多M。
CUDA ToolKit的安裝:
CUDA的下載地址為:https://developer.nvidia.com/cuda-downloads
我們可以選擇兩種安裝方式,一種是在線安裝(我還沒用過),一中離線安裝(我采用的)即本地安裝,
當(dāng)我們選擇離線安裝,當(dāng)我們選定相對(duì)應(yīng)的版本之后,下載的時(shí)候發(fā)現(xiàn)這個(gè)地方的文件大小大概在2G左右,Linux系統(tǒng)下面我們選擇runfile(local) 完整安裝包從本地安裝,或者是選擇windows的本地安裝。CUDA Toolkit本地安裝包時(shí)內(nèi)含特定版本Nvidia顯卡驅(qū)動(dòng)的,所以只選擇下載CUDA Toolkit就足夠了,如果想安裝其他版本的顯卡驅(qū)動(dòng)就下載相應(yīng)版本即可。
所以,NVIDIA顯卡驅(qū)動(dòng)和CUDA工具包本身是不具有捆綁關(guān)系的,也不是一一對(duì)應(yīng)的關(guān)系,只不過是離線安裝的CUDA工具包會(huì)默認(rèn)攜帶與之匹配的最新的驅(qū)動(dòng)程序。
注意事項(xiàng):NVIDIA的顯卡驅(qū)動(dòng)器與CUDA并不是一一對(duì)應(yīng)的哦,CUDA本質(zhì)上只是一個(gè)工具包而已,所以我可以在同一個(gè)設(shè)備上安裝很多個(gè)不同版本的CUDA工具包,比如我的電腦上同事安裝了 CUDA 9.0、CUDA 9.2、CUDA 10.0三個(gè)版本。一般情況下,我只需要安裝最新版本的顯卡驅(qū)動(dòng),然后根據(jù)自己的選擇選擇不同CUDA工具包就可以了,但是由于使用離線的CUDA總是會(huì)捆綁CUDA和驅(qū)動(dòng)程序,所以在使用多個(gè)CUDA的時(shí)候就不要選擇離線安裝的CUDA了,否則每次都會(huì)安裝不同的顯卡驅(qū)動(dòng),這不太好,我們直接安裝一個(gè)最新版的顯卡驅(qū)動(dòng),然后在線安裝不同版本的CUDA即可。
總結(jié):CUDA和顯卡驅(qū)動(dòng)是沒有一一對(duì)應(yīng)的。
(2)cuDNN是一個(gè)SDK,是一個(gè)專門用于神經(jīng)網(wǎng)絡(luò)的加速包,注意,它跟我們的CUDA沒有一一對(duì)應(yīng)的關(guān)系,即每一個(gè)版本的CUDA可能有好幾個(gè)版本的cuDNN與之對(duì)應(yīng),但一般有一個(gè)最新版本的cuDNN版本與CUDA對(duì)應(yīng)更好。
總結(jié):cuDNN與CUDA沒有一一對(duì)應(yīng)的關(guān)系
(3)CUDA 工具包附帶的 CUPTI。
CUPTI,即CUDA Profiling Tools Interface (CUPTI)。在CUDA分析工具接口(CUPTI)能夠分析和跟蹤靶向CUDA應(yīng)用程序的工具的創(chuàng)建。CUPTI提供以下API:
Activity API,Callback API,事件API,Metric API,和Profiler API。
使用這些API,您可以開發(fā)分析工具,深入了解CUDA應(yīng)用程序的CPU和GPU行為。CUPTI作為CUDA支持的所有平臺(tái)上的動(dòng)態(tài)庫提供。請(qǐng)參閱CUPTI文檔。
nvidia與cuda需要滿足關(guān)系:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
cuda與cudnn需要滿足關(guān)系:
https://developer.nvidia.com/rdp/cudnn-archive
cuda歷史版本下載連接:
https://developer.nvidia.com/cuda-toolkit-archive
Tensorflow不同版本要求與CUDA及CUDNN版本對(duì)應(yīng)關(guān)系:
https://blog.csdn.net/u013066730/article/details/88845083
3.安裝git和cmake
git直接在官網(wǎng)下載即可:https://git-scm.com/download/win
cmake也是,直接下載:https://cmake.org/download/
剛開始,我git版本過低,后來在cmd中用update升級(jí)了一下~現(xiàn)在的版本如下:

下載完成,記得配置環(huán)境變量:

4.安裝vcpkg
詳見:https://github.com/Microsoft/vcpkg
安裝完成后,用vcpkg安裝pthreads和opencv。
cd到vcpkg的主目錄,運(yùn)行命令:.\vcpkg install pthreads opencv
此處我發(fā)現(xiàn),pthreads可以安裝成功,opencv總是安裝失敗.....

看報(bào)錯(cuò)信息,下載opencv:3.4.3.tar.gz時(shí)報(bào)錯(cuò),于是手動(dòng)下載tar包(https://github.com/opencv/opencv/archive/3.4.3.tar.gz),放入vcpkg的downloads目錄下,再次嘗試安裝:

至此,準(zhǔn)備工作基本做完,我們可以開始編譯darknet了
5.安裝opencv
單純安裝opencv對(duì)版本沒有限制,但是為了和darknet匹配,必須安裝特定的版本,darnnet官網(wǎng)要求的版本是opencv 3.x,明確要求小于4.0版。
我一次下了多個(gè)版本的opencv,發(fā)現(xiàn)3.0.0,3.4.0的可用,4.0.1的不可用。實(shí)踐證明,確實(shí)如此,4.0.1的在編譯daeknet時(shí)VS會(huì)報(bào)錯(cuò),說有些接口方法不存在....3.x的版本中有些能用,有些不能用。

官網(wǎng)下載: https://opencv.org/releases.html

下載后解壓至任意目錄,方便自己使用時(shí)能找到即可
6.下載darnnet
darknet直接在https://github.com/AlexeyAB/darknet 下載zip包即可,同樣可以解壓至任意目錄
VS2017配置和編譯
首先找到之前下載的daeknet-master目錄,進(jìn)入->build->darknet文件夾下,可以看見有三個(gè).sln文件,這三個(gè)文件是三個(gè)VS項(xiàng)目入口,其中
- darknet.sln主要用來編譯darknet,生成darknet.exe可執(zhí)行文件;
- yolo_cpp_dll.sln主要用來編譯可供外部使用的GPU版yolo的dll和lib文件;
- yolo_cpp_dll_no_gpu.sln主要用來編譯可供外部使用的非GPU版(即CPU版)dll和lib。
dll動(dòng)態(tài)鏈接庫,lib靜態(tài)鏈接庫
前面提到過,yolo支持CPU和GPU計(jì)算,CPU和GPU運(yùn)行yolo所依賴的庫文件是不同的

雙擊darknet.sln即可在VS2017中打開這個(gè)項(xiàng)目。
VS2017屬性配置
找到項(xiàng)目目錄,右鍵點(diǎn)屬性:

在屬性頁面,我們需要經(jīng)行一系列配置
目標(biāo)平臺(tái)版本
目標(biāo)平臺(tái)版本即要生成的exe目標(biāo)運(yùn)行環(huán)境,默認(rèn)是8.1,可修改為10,不配置也暫時(shí)無影響
平臺(tái)工具集
即VS2017開發(fā)平臺(tái)的工具集,經(jīng)過采坑發(fā)現(xiàn)v141不行、v140可用

VC++目錄
主要配2處:包含目錄和引用目錄,根據(jù)自己opencv安裝目錄配置相應(yīng)路徑.下面以我的路徑為例:
包含目錄:
D:\software\opencv\opencv3.4.0\opencv\build\include
庫目錄:
D:\software\opencv\opencv3.4.0\opencv\build\x64\vc15\lib
D:\software\opencv\opencv3.4.0\opencv\build\x64\vc14\lib

編譯darknet.exe
現(xiàn)在,我們可以嘗試編譯了,點(diǎn)擊生成
報(bào)異常

異常信息
1>------ 已啟動(dòng)生成: 項(xiàng)目: darknet, 配置: Release x64 ------
1>D:\software\darknet\darknet190226\new\darknet-master\build\darknet\darknet.vcxproj(54,5): error MSB4019: 未找到導(dǎo)入的項(xiàng)目“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations\CUDA 10.0.props”。請(qǐng)確認(rèn) <Import> 聲明中的路徑正確,且磁盤上存在該文件。
1>已完成生成項(xiàng)目“darknet.vcxproj”的操作 - 失敗。
========== 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過 0 個(gè) ==========
解決異常
我們順著異常提示的文件夾路徑點(diǎn)進(jìn)去發(fā)現(xiàn),確實(shí)沒有CUDA 10.0.props這個(gè)文件,但是有CUDA 9.0.props,原來在當(dāng)前版本的darknet中,默認(rèn)使用的CUDA 10.0,我們需要在配置darknet.vcxproj中修改(和darknet.sln在同級(jí)目錄)
用notepad++修改,將10.0改為9.0即可,總共改頭尾兩處。
再次編譯

編譯成功后,會(huì)在darknet-master\build\darknet\x64下生成darknet.exe文件,這個(gè)就是可執(zhí)行的程序。
編譯GPU版庫
編譯GPU版庫文件,主要即產(chǎn)生可以支持GPU運(yùn)行的yolo的dll和lib文件,用于方便在別的C++項(xiàng)目中直接調(diào)用,編譯前的VS2017配置和上面編譯darknet.exe基本類似,此處還需配置一處:

CUDA C/C++ ->Deviece -> Code Generation處。原compute_75,sm_75改為compute_52,sm_52
然后就是正常的生成,生成成功后在darknet-master\build\darknet\x64目錄下會(huì)新生成:yolo_cpp_dll.dll和yolo_cpp_dll.lib

編譯CPU版庫
CPU版本庫的編譯和GPU類似,就不贅述了
運(yùn)行展示
1.下載yolov3.weights并放到darknet.exe同級(jí)目錄下,下載鏈接:
http://link.zhihu.com/?target=https%3A//pjreddie.com/media/files/yolov3.weights
2.運(yùn)行
cd到darknet.exe所在目錄,運(yùn)行命令即可。
命令1:
darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
效果1:

命令2:
darknet detect cfg/yolov3.cfg yolov3.weights data/bird.jpg
效果2:

tips:
1.運(yùn)行時(shí)如果提示找不到opencv_world340.dll,需要手動(dòng)將opencv下的此dll放入darknet.exe運(yùn)行同級(jí)目錄下

我的opencv_world340.dll所在目錄:D:\software\opencv\opencv3.4.0\opencv\build\x64\vc14\bin
opencv_world340.dll對(duì)應(yīng)Release版、opencv_world340d.dll對(duì)應(yīng)debug版。
2.如果運(yùn)行時(shí)報(bào)內(nèi)存溢出的異常,需要手動(dòng)修改yolov3-voc.cfg中的batch和subdivisions,可以都修改為1
