去年暑假我在公司寫了一支轉換程式,

關於把 YOLOv3, v3Tiny, v4 的 .weight 檔案轉換成 OAK 系列相機能用的 .blob 檔。

主要是公司那邊想用這東西來做物件追蹤,如果成了,就能大幅度的提升效率還有推理速度。

推理速度能提升是因為 OAK 相機是一顆 Edge 裝置,

裡面有類似 GPU 的 VPU,可以理解為裡面插了之前 Intel 推出的神經推理棒晶片,

不用把資料再塞回伺服器推理。

然後就不出意外的出意外了。

主要大概遇到三個階段性問題:

一、無法推理,模型轉換報錯。

二、可以推理,模型推理錯誤。

三、可以推理,Anchor 尺寸錯誤。

一、無法推理,模型轉換報錯:

先講 OAK 這相機的由來,OAK 相機其實是 Openvino 推的硬體,Openvino 背後又是我們偉大的牙膏廠(Intel)。

牙膏廠的文件大家也是知道的。

OAK 相機這東西太新,總之原廠還沒有支援完整的轉換套件,所以依照之前牙膏出的神經推理棒轉換流程去轉會出錯,無法在 OAK 上面執行。

(後來推估原因,應該是轉換凍結模型模型的時候有一些網路層沒轉到。)

我研究後發現,雖然 .weight 檔沒辦法一步轉換成 .blob,但是可以先轉成中繼格式 .pb 再轉成 .blob。

確定這個路線後,程式就分成兩部分:

一、1 將 YOLO 的 .wight 模型還有 .cfg (依賴 COCO資料集)轉成 .pb。

一、2 將 .pb 轉成 .blob。

二、可以推理,模型推理錯誤:

查了一些文件,轉過去後的確是能放在 OAK 相機上面跑,不會報錯,

但是檢測結果很異常。

會有物件框,但是 label 是錯的、Anchor 也不會隨著不同物件變動尺寸。

為了釐清到底是 .pb 出問題,還是 .blob 出問題?

我找了正職的同仁要了一份內部訓練的 .pb 檔案,

也在網路上找了一份確定正常的 .pb 預訓練模型,

將這兩者放入 Openvino 在個人電腦上模擬推理、確認轉換後的模型沒問題。

結果這步驟(一、1)就出錯,推測是轉換時沒有融合到 .cfg 的資訊,

導致  label 與 Anchor 出錯。

後來透過查詢 Github 還有詢問同仁的經驗,才把這部分搞定。

這部分是使用一個將  YOLOv3, v3Tiny, v4 轉成 .pb 的開源專案處理的。

三、可以推理,Anchor 尺寸錯誤:

解決完上述問題,放進 OAK 相機仍然出錯,這次的問題如同下圖:

異常的 Anchor 示意圖
抓取 Anchor 時會出錯,
於是檢查了推理的程式碼中做 NMS(Non-Maximum Suppression)的部分,
發現 Anchor 尺寸與原本訓練模型的圖片尺寸是按照比例計算的,
於是詢問了同仁我們要轉換的模型當初是用什麼尺寸的圖片做訓練?
進而修改程式解決這個問題。

最終獲得正確的輸出結果:


正常的 Anchor 示意圖
專案結論:
1.可使用本程式轉換現有客製化模型省下重新訓練為 .blob 檔的時間,每次轉換約為 4 分鐘、每次訓練粗估為 17 小時。
2.在 300*300 解析度下使用 OAK相機的 VPU 搭配 YOLOv3 Tiny 做物件追蹤具有 15FPS 的推理效率。
3.OAK相機搭配 YOLO 模型解決物件追蹤的重疊問題時,無法準確分辨重疊後的物件 ID,目前較適合使用在物件不多的場景。

後續也將此流程整理為自動化 bat 程式,並在月會上報告、寫成教學手冊交由部門使用。

此專案提供了可信的評估依據,並初步探索了 OAK 相機的性能與使用方法。

目前程式已在 Github 上開源

如果有任何問題,請聯絡我:

wuyiulin@gmail.com

By wuyiulin

喜歡騎單車的影像算法工程師

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *