OAK 相機模型轉換方法介紹

 

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

關於把 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



留言

這個網誌中的熱門文章

[心得] 破解 Google 雲端下載限制(非建立副本)