2019年1月9日 星期三

C# YOLOWrapper:Alturos.Yolo


由於主要開發環境為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進行辨識的效果,相當出色呢!

15 則留言:

  1. 感謝大大無私的分享,請問你有試過Alturos.Yolo training自己的Model嗎?

    回覆刪除
    回覆
    1. 有喔,有來有空會在分享有關訓練的方法~

      刪除
  2. 不好意思,想請問一下。
    想使用GPU運行,但是一直偵測不到,之前有安裝過darknet也成功跑過yolo(gpu版本的)。
    我的建置後檔案裡沒有 x64資料夾 但cpu版本是可以跑得

    回覆刪除
    回覆
    1. 如果你指的建置是Alturos.Yolo這個專案的話,理論上會自行建置出x64的資料夾出來,也會把所需的dll都透過網路抓下來(前提是你的電腦要有對外網路)

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

    回覆刪除
  4. 請問有辦法導入自己training的Model嗎
    目前我已用darkflow訓練好了Model也轉換成pb檔,可是不知道要如何導入到Alturos.Yolo,希望有機會能教學 感謝

    回覆刪除
    回覆
    1. Alturos.Yolo使用的是darknet預設的訓練模型和參數檔(.cfg, .weights),只要是這兩個替換成自己訓練的就可以運作了。

      刪除
  5. 你好,我建置yolo_cpp_dll.dll是成功的,但是到C# yolo引用時,載入模型正常,但卻在推論時發生C++ compiled error,請問版主有發生過這個狀況嗎? PS.2019年的時候根據版主的流程是可以用的,不會有error。

    回覆刪除
    回覆
    1. 是否能把比較細的error meassage貼出來比較好判斷問題。

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

      刪除
  6. 你是指這個嗎?
    ************** 例外狀況文字 **************
    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。

    回覆刪除
  7. 您好 請問一下能夠使用webcam進行辨識嗎?還是只能放圖片一張一張的跑?

    回覆刪除
  8. 您好
    我在visual studio 2022 中嘗試建置 Alturos.Yolo.TestUI
    執行中 在 Main.cs 中
    this._yoloWrapper = new YoloWrapper(config.ConfigFile, config.WeightsFile, config.NamesFile, gpuConfig);
    一直拋出例外,
    已經確認有configfile,weightsfile, namefile 三個檔案, gpuconfig=null
    請問 可能有那些問題沒處好?

    回覆刪除
  9. 您好,請問這有辦法做即時影像嗎??

    回覆刪除
  10. 敲碗自己訓練模型

    回覆刪除