【目標檢測實戰(zhàn)】Darknet入門—yolov3模型訓練(Win10下的安裝、編譯、實現(xiàn))

效果圖

簡介

Yolo,是實時物體檢測的算法系統(tǒng),基于Darknet—一個用C和CUDA編寫的開源神經(jīng)網(wǎng)絡框架。它快速,易于安裝,并支持CPU和GPU計算,也是yolo的底層。本文主要介紹在win10系統(tǒng)上配置darknet環(huán)境,編譯,使用yolo實現(xiàn)開頭展示的目標檢測效果。主要包括以下幾個步驟:

編譯流程 -> 環(huán)境安裝 -> VS2017配置和編譯 -> 運行展示

YOLO,美語新詞,是You Only Live Once的首字母縮略詞,意為你只能活一次,應該活在當下,大膽去做。

本文的YOLO,意為:You Only Look Once,再點進官網(wǎ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之前,您可以在Makefilelink中設置這些選項

  • GPU=1用CUDA構建以使用GPU加速(CUDA應該在/usr/local/cuda
  • CUDNN=1使用cuDNN v5-v7構建以使用GPU加速訓練(cuDNN應該在/usr/local/cudnn
  • CUDNN_HALF=1 構建Tensor核心(在Titan V / Tesla V100 / DGX-2及更高版本上)加速檢測3x,訓練2x
  • OPENCV=1 使用OpenCV 3.x / 2.4.x構建 - 允許檢測來自網(wǎng)絡攝像機或網(wǎng)絡攝像頭的視頻文件和視頻流
  • DEBUG=1 可以調(diào)試Yolo的版本
  • OPENMP=1 使用OpenMP支持構建,通過使用多核CPU來加速Yolo
  • LIBSO=1構建使用此庫的庫darknet.so和二進制可運行文件uselib?;蛘吣梢試L試運行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上運行Darknet,請使用本文中的示例,./darknet而不是darknet.exe使用,即使用此命令:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights

2.如何在Windows上編譯(使用vcpkg

  1. 將Visual Studio安裝或更新到至少2017版,確保將其完全修補(如果不確定自動更新到最新版本,請再次運行安裝程序)。如果您需要從頭開始安裝,請從此處下載VS:Visual Studio 2017社區(qū)
  2. 安裝CUDA和cuDNN
  3. 安裝gitcmake。確保它們至少在當前帳戶的路徑上
  4. 例如,安裝vcpkg并嘗試安裝測試庫以確保一切正常vcpkg install opengl
  5. 定義環(huán)境變量,VCPKG_ROOT指向安裝路徑vcpkg
  6. 使用名稱VCPKG_DEFAULT_TRIPLET和值定義另一個環(huán)境變量x64-windows
  7. 打開Powershell(作為標準用戶)并鍵入(最后一個命令需要確認并用于清理不必要的文件)
  8. [僅限CUDA]使用首選計算功能自定義CMakeLists.txt
  9. 使用Powershell腳本構建build.ps1或使用Visual Studio 2017的“打開文件夾”功能。在第一個選項中,如果要使用Visual Studio,您將找到包含所有相應配置的構建后由CMake為您創(chuàng)建的自定義解決方案系統(tǒng)的標志。

環(huán)境安裝

1.安裝Visual Studio2017

官網(wǎng)下載安裝社區(qū)版即可:https://visualstudio.microsoft.com/zh-hans/downloads/

VS2017-0.png

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

VS2017-2.png

一定要選下面這個V140工具集,不然用141的會報錯.....

VS2017-1.png

安裝時沒有選完整也沒關系,可以在Visual Studio Installer修改

vs.png

2.安裝CUDA和CUDNN

官網(wǎng)下載即可,我的安裝包如下:
cuda_9.0.176_win10.exe
cudnn-9.0-windows10-x64-v7.4.2.24

Nvidia和CUDA和CUDNN的關系,參考:https://blog.csdn.net/qq_35941018/article/details/96481116

一關系闡述:

(1)NVIDIA的顯卡驅(qū)動程序和CUDA完全是兩個不同的概念哦!CUDA是NVIDIA推出的用于自家GPU的并行計算框架,也就是說CUDA只能在NVIDIA的GPU上運行,而且只有當要解決的計算問題是可以大量并行計算的時候才能發(fā)揮CUDA的作用。
CUDA的本質(zhì)是一個工具包(ToolKit);但是二者雖然不一樣的。

顯卡驅(qū)動的安裝:
當我們使用一臺電腦的時候默認的已經(jīng)安裝了NVIDIA的顯卡驅(qū)動,因為沒有顯卡驅(qū)動根本用不了顯卡嘛,但是這個時候我們是沒有CUDA可以用的,我們可以更新我們的驅(qū)動,更新鏈接為:
https://www.nvidia.com/Download/index.aspx?lang=en-us
在這個里面可以根據(jù)自己的顯卡類型選擇最新的驅(qū)動程序。顯卡驅(qū)動程序當前大小大概500多M。

CUDA ToolKit的安裝:
CUDA的下載地址為:https://developer.nvidia.com/cuda-downloads
我們可以選擇兩種安裝方式,一種是在線安裝(我還沒用過),一中離線安裝(我采用的)即本地安裝,
當我們選擇離線安裝,當我們選定相對應的版本之后,下載的時候發(fā)現(xiàn)這個地方的文件大小大概在2G左右,Linux系統(tǒng)下面我們選擇runfile(local) 完整安裝包從本地安裝,或者是選擇windows的本地安裝。CUDA Toolkit本地安裝包時內(nèi)含特定版本Nvidia顯卡驅(qū)動的,所以只選擇下載CUDA Toolkit就足夠了,如果想安裝其他版本的顯卡驅(qū)動就下載相應版本即可。

所以,NVIDIA顯卡驅(qū)動和CUDA工具包本身是不具有捆綁關系的,也不是一一對應的關系,只不過是離線安裝的CUDA工具包會默認攜帶與之匹配的最新的驅(qū)動程序。

注意事項:NVIDIA的顯卡驅(qū)動器與CUDA并不是一一對應的哦,CUDA本質(zhì)上只是一個工具包而已,所以我可以在同一個設備上安裝很多個不同版本的CUDA工具包,比如我的電腦上同事安裝了 CUDA 9.0、CUDA 9.2、CUDA 10.0三個版本。一般情況下,我只需要安裝最新版本的顯卡驅(qū)動,然后根據(jù)自己的選擇選擇不同CUDA工具包就可以了,但是由于使用離線的CUDA總是會捆綁CUDA和驅(qū)動程序,所以在使用多個CUDA的時候就不要選擇離線安裝的CUDA了,否則每次都會安裝不同的顯卡驅(qū)動,這不太好,我們直接安裝一個最新版的顯卡驅(qū)動,然后在線安裝不同版本的CUDA即可。

總結(jié):CUDA和顯卡驅(qū)動是沒有一一對應的。

(2)cuDNN是一個SDK,是一個專門用于神經(jīng)網(wǎng)絡的加速包,注意,它跟我們的CUDA沒有一一對應的關系,即每一個版本的CUDA可能有好幾個版本的cuDNN與之對應,但一般有一個最新版本的cuDNN版本與CUDA對應更好。

總結(jié):cuDNN與CUDA沒有一一對應的關系

(3)CUDA 工具包附帶的 CUPTI。

CUPTI,即CUDA Profiling Tools Interface (CUPTI)。在CUDA分析工具接口(CUPTI)能夠分析和跟蹤靶向CUDA應用程序的工具的創(chuàng)建。CUPTI提供以下API:
Activity API,Callback API,事件API,Metric API,和Profiler API。
使用這些API,您可以開發(fā)分析工具,深入了解CUDA應用程序的CPU和GPU行為。CUPTI作為CUDA支持的所有平臺上的動態(tài)庫提供。請參閱CUPTI文檔。

nvidia與cuda需要滿足關系:
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
cuda與cudnn需要滿足關系:
https://developer.nvidia.com/rdp/cudnn-archive
cuda歷史版本下載連接:
https://developer.nvidia.com/cuda-toolkit-archive
Tensorflow不同版本要求與CUDA及CUDNN版本對應關系:
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升級了一下~現(xiàn)在的版本如下:

cmake.png

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

環(huán)境變量.png

4.安裝vcpkg

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

--1.png

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

2.png

至此,準備工作基本做完,我們可以開始編譯darknet了

5.安裝opencv

單純安裝opencv對版本沒有限制,但是為了和darknet匹配,必須安裝特定的版本,darnnet官網(wǎng)要求的版本是opencv 3.x,明確要求小于4.0版。

我一次下了多個版本的opencv,發(fā)現(xiàn)3.0.0,3.4.0的可用,4.0.1的不可用。實踐證明,確實如此,4.0.1的在編譯daeknet時VS會報錯,說有些接口方法不存在....3.x的版本中有些能用,有些不能用。

222.png

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

111.png

下載后解壓至任意目錄,方便自己使用時能找到即可

6.下載darnnet

darknet直接在https://github.com/AlexeyAB/darknet 下載zip包即可,同樣可以解壓至任意目錄

??darknet-master.zip


VS2017配置和編譯

  首先找到之前下載的daeknet-master目錄,進入->build->darknet文件夾下,可以看見有三個.sln文件,這三個文件是三個VS項目入口,其中
  • 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動態(tài)鏈接庫,lib靜態(tài)鏈接庫

前面提到過,yolo支持CPU和GPU計算,CPU和GPU運行yolo所依賴的庫文件是不同的

VS222.png

雙擊darknet.sln即可在VS2017中打開這個項目。

VS2017屬性配置

找到項目目錄,右鍵點屬性:

aaa.png

在屬性頁面,我們需要經(jīng)行一系列配置

目標平臺版本

目標平臺版本即要生成的exe目標運行環(huán)境,默認是8.1,可修改為10,不配置也暫時無影響

平臺工具集

即VS2017開發(fā)平臺的工具集,經(jīng)過采坑發(fā)現(xiàn)v141不行、v140可用

常規(guī).png

VC++目錄

主要配2處:包含目錄和引用目錄,根據(jù)自己opencv安裝目錄配置相應路徑.下面以我的路徑為例:

包含目錄:
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


VC++++++.png

編譯darknet.exe

現(xiàn)在,我們可以嘗試編譯了,點擊生成
shengcheng.png

報異常

bug-1.png

異常信息

1>------ 已啟動生成: 項目: darknet, 配置: Release x64 ------

1>D:\software\darknet\darknet190226\new\darknet-master\build\darknet\darknet.vcxproj(54,5): error MSB4019: 未找到導入的項目“C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\BuildCustomizations\CUDA 10.0.props”。請確認 <Import> 聲明中的路徑正確,且磁盤上存在該文件。

1>已完成生成項目“darknet.vcxproj”的操作 - 失敗。
========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

解決異常

我們順著異常提示的文件夾路徑點進去發(fā)現(xiàn),確實沒有CUDA 10.0.props這個文件,但是有CUDA 9.0.props,原來在當前版本的darknet中,默認使用的CUDA 10.0,我們需要在配置darknet.vcxproj中修改(和darknet.sln在同級目錄)

用notepad++修改,將10.0改為9.0即可,總共改頭尾兩處。
asdasd.png

再次編譯

dddddddd.png

編譯成功后,會在darknet-master\build\darknet\x64下生成darknet.exe文件,這個就是可執(zhí)行的程序。

編譯GPU版庫

編譯GPU版庫文件,主要即產(chǎn)生可以支持GPU運行的yolo的dll和lib文件,用于方便在別的C++項目中直接調(diào)用,編譯前的VS2017配置和上面編譯darknet.exe基本類似,此處還需配置一處:

配置屬性-CUDA-Device.jpg

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

wqwwqwq.png

編譯CPU版庫

CPU版本庫的編譯和GPU類似,就不贅述了


運行展示

1.下載yolov3.weights并放到darknet.exe同級目錄下,下載鏈接:

http://link.zhihu.com/?target=https%3A//pjreddie.com/media/files/yolov3.weights

2.運行

cd到darknet.exe所在目錄,運行命令即可。

命令1:

darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

效果1:

image
命令2:

darknet detect cfg/yolov3.cfg yolov3.weights data/bird.jpg

效果2:
222.png

tips:

1.運行時如果提示找不到opencv_world340.dll,需要手動將opencv下的此dll放入darknet.exe運行同級目錄下


11111.png

我的opencv_world340.dll所在目錄:D:\software\opencv\opencv3.4.0\opencv\build\x64\vc14\bin
opencv_world340.dll對應Release版、opencv_world340d.dll對應debug版。

2.如果運行時報內(nèi)存溢出的異常,需要手動修改yolov3-voc.cfg中的batch和subdivisions,可以都修改為1


a.png
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容