2019年1月3日 星期四

影像辨識-YOLO darknet編譯建置方法



最近開始研究影像辨識的套件

於是找到一個目前非常火紅YOLO

其官方網站:https://pjreddie.com/darknet/yolo/

而其效果就如首頁這張圖

擁有相當高的mAP-50(越高越好)以及執行效率(越快越好)


官方的github連結:https://github.com/pjreddie/darknet

恩...就是一個說明很簡短的gitlab首頁

反而比較有名的是AlexeyAB的fork版本,github連結為:https://github.com/AlexeyAB/darknet

乍看之下真的會以為這個才是官方版本... XDD

底下的說明內容非常完整

所以目前也是以此版本下載進行測試,如下圖:


下載完後在build\darknet資料夾有幾個相關的方案檔,如下圖:


主要針對darknet以及yolo_cpp_dll這兩個方案檔


這裡有一篇大陸的介紹,算是相當完整:https://www.zhihu.com/appview/p/45845454

也是透過這篇才能比較順利的進行建置

但有些地方需要進行調整及差異的就在此補充說明


目前採用的開發IDE是MSVS2017(需安裝C++開發套件)

以及目標環境是windows10、Cuda10.0

Cuda 10.0的下載位置:https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10

以及所搭配的cuDNN:https://developer.nvidia.com/rdp/cudnn-download

以及該套件所需參考的openCV:https://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.4.0/opencv-3.4.0-vc14_vc15.exe/download


由於開發的環境並沒有支援cuda的顯卡

因此在安裝Cuda 10.0時,可僅安裝相關的開發套件,如下圖:

一定要安裝development跟Visual Studio Integration
(其他應該都可以不用安裝)


而cuDNN下載後執行就進行解壓縮動作,解完資料夾如下:


這些資料夾內的檔案之後會需要進行搬移,等等再進行說明


OpenCV下載後執行也是進行解壓縮動作,解出來的資料夾如下:


待會兒會需要include跟x64這兩個資料夾的path,所以請把openCV放置在你認為適合的位置


接著用VS2017開啟darknet.sln會出現以下畫面:


由於原先該作者是用VS2015開發的,所以就點選確定進行專案升級

開啟後該方案會停在Debug、Win32的組態環境


對著方案右鍵,選擇組態管理員,將其組態改成release、x64


改完之後就可以進行建置,第一次建置會出現這樣的錯誤:


於是對著專案按右鍵->屬性,進行cuda path的設定:

預設的安裝位置會在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0

設定完之後再進行建置:


會出現cudnn的error

這時候就將剛剛解壓縮的cudnn的三個資料夾bin、include、lib中的檔案(共三個檔案)

複製到cuda的安裝目錄:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 相對應的資料夾內

cudnn\cuda\bin的cudnn64_7.dll 複製到 CUDA\v10.0\bin裡面

cudnn\cuda\bin的cudnn.h 複製到 CUDA\v10.0\include裡面

cudnn\cuda\lib\x64\cudnn.lib 複製到 CUDA\v10.0\lib\x64裡面


接著再進行建置:


會出現OpenCV的錯誤

於是再針對專案按右鍵->屬性,設定VC++目錄以及連結器

VC++目錄中,先在Include目錄加入OpenCV的include path

build\include、build\include\opencv、build\include\opencv2 這三個路徑


以及程式庫目錄中加入OpenCV的lib path

build\x64\vc14\lib 這一個路徑


接著在連結器的輸入頁面的其他相依性加入

opencv_world340.lib


以上都完成後再進行建置,就終於能建置成功了!


建置成功,會在專案的資料夾build\darknet\x64產生一個darknet.exe

即可透過該指令進行物件辨識的測試


該執行檔會依賴於build\darknet\x64裡面的pthreadGC2.dll、pthreadVC2.dll 這兩個元件

以及cudnn:cudnn64_7.dll、openCV:opencv_world340.dll、ffmpeg:opencv_ffmpeg340_64.dll

將這五個dll以及exe都放置於同一個資料夾中才能正常執行

目前測試採用coco資料集 以及 yolo3的model

所需的資料有:yolov3.weights、yolov3.cfg、coco.data、coco.names

yolov3.weights比較麻煩需上網下載:https://pjreddie.com/media/files/yolov3.weights

其他三個在下載的build\darknet\x64\cfg以及data資料夾中可找到

這些檔案的配置如下:

yolov3.cfg、yolov3.weights 放在與執行檔同一層資料夾

coco.data放在cfg資料夾

coco.names放在data資料夾

然後在build\darknet\x64\data的資料夾內有一個labels的資料夾

也要將該資料夾放置到目標的data資料夾裡面

利用命令提示字元執行

darknet.exe detect yolov3.cfg yolov3.weights Bird2.png

Bird2.png就是要進行影像辨識的檔名,放在與exe同一個目錄下

執行結果如下:

這樣就表示成功,花費了27.95 ms

辨識的結果會在執行目錄下產出一個predictions.jpg


以上就是建置darknet.sln產生出exe以及執行exe的方式

若要測試影片

則執行的命令如下:

darknet.exe detector demo cfg/coco.data yolov3.cfg yolov3.weights yourVideo.mp4

yourVideo.mp4就是你所要測試的影片檔

執行結果如下:
執行後會跳出一個新視窗,該視窗會顯示標記所有辨識到的物件

而原本的console視窗會不斷跳出辨識物件的資訊,以及辨識影片的FPS

這個darknet.exe的執行方法可以協助做第一步的影片測試

除了測試辨識效果外也能初步確認GPU顯卡的計算效能

算是相當方便!


重點提醒:若要測試影片檔,一定要將所參考的opencv_ffmpeg340_64.dll

放置到執行目錄,否則會出現如下的錯誤訊息:

會一直以為是CUDA參數錯誤的錯誤訊息... XDD


而下載中的另外一個方案yolo_cpp_dll.sln也是用一樣的方式建置

產出來的dll就能透過外部程式進行引用呼叫

下一篇再來介紹AlturosDestinations作者所提供C# Wrapper - Alturos.Yolo

29 則留言:

  1. 版主你好,我在建置darknet時出現這個錯誤,懇請版主替我找到解決辦法。 MSB3721 命令 ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_75,code=\"sm_75,compute_75\" --use-local-env --cl-version 2015 -ccbin "D:\Visual Studio2015\VC\bin\x86_amd64" -x cu -IC:\opencv_3.0\opencv\build\include -I..\..\include -I..\..\3rdparty\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include" -I\include -I\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include" --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static -DCUDNN_HALF -DOPENCV -DCUDNN -D_TIMESPEC_DEFINED -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_CRT_RAND_S -DGPU -DWIN32 -DNDEBUG -D_CONSOLE -D_LIB -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /FS /Zi /MD " -o x64\Release\network_kernels.cu.obj "D:\darknet-master\src\network_kernels.cu"" 已結束,代碼為 1。

    回覆刪除
    回覆
    1. 你提供的資訊有點少,你是依照我文章的步驟進行建置嗎? 目前看起來像是"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\nvcc.exe" 缺少了這個檔案nvcc.exe,是不是cuda沒安裝成功呢?

      刪除
  2. 'opencv2/core/version.hpp': No such file or directory darknet D:\2\darknet-master\src\image_opencv.cpp 'opencv2/opencv.hpp': No such file or directory darknet D:\2\darknet-master\src\http_stream.cpp
    請問一下這兩個錯誤要如何解決

    回覆刪除
    回覆
    1. 請問你有下載安裝OpenCV,並在darknet專案的程式庫目錄中加入OpenCV的lib path嗎?

      刪除
  3. 'opencv2/core/version.hpp': No such file or directory darknet D:\2\darknet-master\src\image_opencv.cpp 'opencv2/opencv.hpp': No such file or directory darknet D:\2\darknet-master\src\http_stream.cpp
    請問一下這兩個錯誤要如何解決

    回覆刪除
  4. 您好:
    我在進行第一次編譯時(更改組態)
    出現這個錯誤訊息"並未將物件參考設定為物件的執行個體"

    回覆刪除
  5. 請問測試影片如何存檔?? 以目前測試結果看,分辨成功率並不高,不知版主有心得分享嗎? 謝謝~

    回覆刪除
    回覆
    1. 目前的做法是將辨識結果一張一張影像保存起來,在用ffmpeg將連續的影像轉成影片。
      不知道你認為分辨成功率不高是指哪方面呢?

      刪除
  6. 作者已經移除這則留言。

    回覆刪除
  7. 請問,已經照上述跑完opencv的部分卻出現錯誤無法開啟檔案cudnn.lib,該怎麼辦

    回覆刪除
    回覆
    1. 你少裝了 CUDNN 補丁,抓來之後丟到相對應的 CUDA 目錄下的三個目錄即可(檔案不會重複所以可以直接資料夾覆蓋)

      刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 不好意思,我想問如何能連接攝像頭,我輸入darknet.exe detector demo data\coco.data yolov3.cfg weights\yolov3.weights,但執行時出現CUDA-version: 10000 (10020), cuDNN: 7.6.5, CUDNN_HALF=1, GPU count: 1
    OpenCV version: 3.4.0
    Couldn't open file: data\coco.data

    回覆刪除
    回覆
    1. 看起來是找不到data目錄裡的coco.data檔案?

      刪除
  10. 你好怎麼使用darknet_video.py檔案?

    回覆刪除
  11. 作者您好我想請問一下我照著方法建置後執行完卻發生Couldn't open file: cfg/coco.data 這個問題,想請問是因為我路徑沒有設定好嗎還是coco.data的路徑不對呢?

    回覆刪除
    回覆
    1. 請問你coco.data有放在cfg資料夾裡面嗎?

      刪除
    2. 原本的cfg中就有一個coco.data了所以我就沒在動,還是我應該要去下載MSCOCO的data檔呢?

      刪除
    3. 那你data資料夾裡面有coco.names的檔案嗎?

      刪除
    4. 作者您好,我也遇到了相同的問題,data資料夾裡有coco.names的檔案,想請問應該如何解決呢?

      刪除
  12. 作者已經移除這則留言。

    回覆刪除
  13. 你好, 我嘗試在CPU上運行yolo但發現影片非常的慢.... FPS 只有0.5 , 請問這是我電腦的運算力問題嗎, 還是有地方可以調較速度? 謝謝

    回覆刪除
    回覆
    1. 你是用什麼的CPU呢? 你可以參考我另外一篇FPS比較文:https://yy-programer.blogspot.com/2019/04/cpu-vs-gpuyolo-darknet-vs-tensorflow.html

      如果在CPU上想要有速度上的優化~建議可以參考我新一篇用emguCV導入yolo的方法:https://yy-programer.blogspot.com/2020/07/emgucv-dnn-yolov3.html#more

      刪除
  14. 版大你好 全部照著步驟進行
    最後執行時顯示"應用程式無法正確啟動(0x0000007b)"
    用cmd執行darknet.exe 顯示"此應用程式無法在您的電腦執行 若要尋找適用您電腦的版本...","存取被拒"
    環境是Win10(940MX) CUDA10.1 VS2015版
    前面建置都很正常 無錯誤或警告訊息

    回覆刪除
  15. 版大你好 全部照著步驟進行
    最後執行時顯示"應用程式無法正確啟動(0x0000007b)"
    用cmd執行darknet.exe 顯示"此應用程式無法在您的電腦執行 若要尋找適用您電腦的版本...","存取被拒"
    環境是Win10(940MX) CUDA10.1 VS2015版
    前面建置都很正常 無錯誤或警告訊息

    回覆刪除