去年暑假我在公司寫了一支轉換程式,
關於把 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 相機仍然出錯,這次的問題如同下圖:
最終獲得正確的輸出結果:
後續也將此流程整理為自動化 bat 程式,並在月會上報告、寫成教學手冊交由部門使用。
此專案提供了可信的評估依據,並初步探索了 OAK 相機的性能與使用方法。
目前程式已在 Github 上開源。
如果有任何問題,請聯絡我:
wuyiulin@gmail.com