由於主要開發環境為C#
因此一開始是從C#的Wrapper著手
GitHub上有一份介紹還蠻完整的Source:Alturos.Yolo
作者AlturosDestinations是用上一篇所介紹的AlexeyAB/darknet
編譯其中yolo_cpp_dll這個方案
(可參考前篇)
並透過C# DllImport的機制載入yolo_cpp_dll的dll檔
並且在其專案上提供已經編譯好的CPU與GPU版本
在NuGet上也可以找到Alturos.Yolo套件
參考後會連同所需的dll一併下載
建議一開始先將Alturos.Yolo的GitHub抓下來研究一下
此方案很方便地提供了幾個測試程式
包含一個windows form與console
進行方案建置會出現nuget套件錯誤
在方案右鍵點選還原nuget套件後
再進行建置即可建置成功
試著把Alturos.Yolo.TestUI設定為起始專案
執行會拋出一個FileNotFound的錯誤
因為目前少了yolo model的資料
到Alturos.Yolo GitHub頁面可以下載
裡面提供蠻多版本的model
可以先試用YOLOv2-tiny這個版本,比較輕量、速度比較快
載完的檔案放置於執行目錄下即可
若你是用MSVS2017開發
這樣應該就能順利執行Test.UI這個專案
因為由於該專案所引用的套件是作者由MSVS2017建置的
因此會檢查系統是否有安裝visual studio 2017 c++ runtime套件
下載位置
請下載並安裝x64版本
TestUI跟TestConsole主要都是參考Alturos.Yolo的專案的YoloWrapper類別
YoloWrapper有程式會判斷主機是否有支援Cuda
主要判斷的依據為:
運作資料夾底下的x64資料夾是否有cudnn64_7.dll
以及系統上是否有"CUDA_PATH"這個環境變數
有支援則引用GPU版本:yolo_cpp_dll_gpu.dll
若不支援則引用CPU版本:yolo_cpp_dll_cpu.dll
所以如果要在有支援GPU的環境上執行
還需下載符合該Cuda版本的cuDNN的cudnn64_7.dll
(這在上一篇也有介紹過)
若有支援,UI的底下會顯示GPU的型號
運行於CPU版本
運行於GPU版本
一開始的使用上其實沒什麼大問題
但Alturos.Yolo所提供的是Cuda 9.2與cuDNN 7.1.4的版本
因此才會有上一篇需要自行建置Cuda 10最新版的研究
而在darknet上的yolo_cpp_dll
依照上一篇所介紹的,進行c++專案的設定後
即可編譯成功產生出:yolo_cpp_dll.dll動態連結檔
搭配Alturos.Yolo的命名方式
把yolo_cpp_dll.dll更名為yolo_cpp_dll_gpu.dll
即可替換成自建置的yolo_cpp_dll_gpu.dll
覆蓋到執行目錄裡x64的資料夾的元件
記得包含opencv_world340這個相依的dll
以及搭配於該主機Cuda版本的cudnn64_7.dll
pthreadGC2與pthreadVC2在專案建置就會產出,所以重新編譯後替換掉三個dll檔
但在執行上會遇到一個小bug
YoloWrapper提供兩種影像偵測的方法
一個是帶入Byte[]影像資料以及一個是帶入FilePath影像儲存路徑
讀取byte[]影像資料是透過參考opencv的實作
但yolo_cpp_dll預設是未開啟opencv的支援
若Test.UI在程式中把memoryTransfer改成false
透過FilePath帶入可正常執行
但若採用Byte[]的方式進行偵測
(預設方式)
則會出現錯誤
追根究柢是在yolo_cpp_dll建置上有些問題
在darknet目前的版本
預設是不採用opencv
所以不支援直接讀取byte[]的影像資料
需要在yolo_v2_class.hpp加入#define OPENCV
才會能支援透過opencv讀取byte[]的影像資料
加入此段,yolo_cpp_dll即可執行有關openCV的方法
TestUI就能正常執行了!
這是採用yoloV3的model進行辨識的效果,相當出色呢!
感謝大大無私的分享,請問你有試過Alturos.Yolo training自己的Model嗎?
回覆刪除有喔,有來有空會在分享有關訓練的方法~
刪除不好意思,想請問一下。
回覆刪除想使用GPU運行,但是一直偵測不到,之前有安裝過darknet也成功跑過yolo(gpu版本的)。
我的建置後檔案裡沒有 x64資料夾 但cpu版本是可以跑得
如果你指的建置是Alturos.Yolo這個專案的話,理論上會自行建置出x64的資料夾出來,也會把所需的dll都透過網路抓下來(前提是你的電腦要有對外網路)
刪除作者已經移除這則留言。
回覆刪除請問有辦法導入自己training的Model嗎
回覆刪除目前我已用darkflow訓練好了Model也轉換成pb檔,可是不知道要如何導入到Alturos.Yolo,希望有機會能教學 感謝
Alturos.Yolo使用的是darknet預設的訓練模型和參數檔(.cfg, .weights),只要是這兩個替換成自己訓練的就可以運作了。
刪除你好,我建置yolo_cpp_dll.dll是成功的,但是到C# yolo引用時,載入模型正常,但卻在推論時發生C++ compiled error,請問版主有發生過這個狀況嗎? PS.2019年的時候根據版主的流程是可以用的,不會有error。
回覆刪除是否能把比較細的error meassage貼出來比較好判斷問題。
刪除作者已經移除這則留言。
刪除你是指這個嗎?
回覆刪除************** 例外狀況文字 **************
System.NotImplementedException: C++ dll compiled incorrectly
於 Alturos.Yolo.YoloWrapper.Detect(Byte[] imageData)
於 D:\Alturos.Yolo_20190919\src\Alturos.Yolo\YoloWrapper.cs: 行 292
於 Alturos.Yolo.TestUI.Main.Detect()
於 D:\Alturos.Yolo_20190919\src\Alturos.Yolo.TestUI\Main.cs: 行 241
於 Alturos.Yolo.TestUI.Main.buttonSendImage_Click(Object sender, EventArgs e)
於 D:\Alturos.Yolo_20190919\src\Alturos.Yolo.TestUI\Main.cs: 行 121
於 System.Windows.Forms.Control.OnClick(EventArgs e)
於 System.Windows.Forms.Button.OnClick(EventArgs e)
於 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
於 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
於 System.Windows.Forms.Control.WndProc(Message& m)
於 System.Windows.Forms.ButtonBase.WndProc(Message& m)
於 System.Windows.Forms.Button.WndProc(Message& m)
於 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
我目前查到是在yolo_wrapper.cs中,此行程式報錯count = DetectImageGpu(pnt, imageData.Length, ref container);
count出來的結果是-1。
您好 請問一下能夠使用webcam進行辨識嗎?還是只能放圖片一張一張的跑?
回覆刪除您好
回覆刪除我在visual studio 2022 中嘗試建置 Alturos.Yolo.TestUI
執行中 在 Main.cs 中
this._yoloWrapper = new YoloWrapper(config.ConfigFile, config.WeightsFile, config.NamesFile, gpuConfig);
一直拋出例外,
已經確認有configfile,weightsfile, namefile 三個檔案, gpuconfig=null
請問 可能有那些問題沒處好?
您好,請問這有辦法做即時影像嗎??
回覆刪除敲碗自己訓練模型
回覆刪除