學習如何在 MYIR 的 ZU3EG FPGA 開發板上部署 Tiny YOLO v4,對比 FPGA、GPU、CPU 的效能,助力 AIoT 邊緣計算應用。(文末有彩蛋)
一、 為什麼選擇 FPGA:應對 7nm 製程與 AI 限制
在全球半導體制程限制和高階 GPU 受限的大環境下,FPGA 成為了中國企業發展的重要路徑之一。它可支援靈活的 AIoT 應用,其靈活性與可程式設計性使其可以在國內成熟的 28nm 工藝甚至更低節點的製程下實現高效的硬體加速。
米爾的 ZU3EG 開發板憑藉其可重構架構為 AI 和計算密集型任務提供了支援,同時避免了 7nm 工藝對國產晶片設計的制約。透過在 ZU3EG 上部署 Tiny YOLO V4,我們可以為智慧家居、智慧城市等 AIoT 應用提供高效的解決方案。


二、 瞭解 Tiny YOLO 模型及其適用性
YOLO(You Only Look Once)是一種實時物體檢測模型,它透過一次性掃描整個影像,實現高效的物件識別。
而其簡化版 Tiny YOLO V4 更適合嵌入式裝置,具有較少的層數和引數。其輕量化特性更適合在資源受限的裝置上執行,尤其在低功耗、實時檢測的邊緣計算裝置中表現出色。
相比傳統 GPU,FPGA 能在小面積和低功耗下實現類似的推理效能,非常契合 AIoT 應用。像米爾 ZU3EG 這樣的 FPGA 開發板,透過底板和豐富介面的載板設計,非常適合高效的嵌入式低功耗資料處理。

Yolo V4 網路結構圖

Tiny Yolo V4 網路結構圖
(透過最佳化網路結構和引數,保持較高檢測精度的同時,降低模型的計算量和記憶體佔用)
三、 獲取資料集和模型
可下載開源訓練集或預訓練模型。為了確保相容性,建議將模型轉換為 ONNX 格式,以便後續能在 FPGA 上完成最佳化。
1.下載 Tiny YOLO V4 模型:從Darknet 的 GitHub 倉庫 獲取 Tiny YOLO 的預訓練權重,或者在 COCO 等資料集上自行訓練模型。自定義的模型適用於特定應用場景(如車輛檢測、人臉檢測等)。
2.資料準備:若要自定義模型,可使用 LabelImg 等工具對資料集進行標註,將資料轉為 YOLO 格式。之後,可將 YOLO 格式轉換為 ONNX 格式,以便相容 FPGA 最佳化工具鏈。

四、 透過 Vivado HLS 為 FPGA 準備模型
要將模型部署到 FPGA,需要將神經網路操作轉換為硬體級描述。使用 Xilinx 的 Vitis HLS(高階綜合)可以將 Tiny YOLO v4 的 C++ 模型程式碼的轉化為 Verilog RTL(暫存器傳輸級)程式碼,從而將模型從軟體世界帶入硬體實現。
詳細步驟:
1.模型層對映和最佳化:- 將 YOLO 的每一層(如卷積層、池化層)對映為硬體友好的 C/C++ 結構。例如,將卷積對映為乘累加(MAC)陣列,透過流水線實現並行化。
2.運算元加速與指令最佳化:
- 流水線(Pipelining):利用流水線來處理多項操作並行,減少延遲。
- 迴圈展開(Loop Unrolling):展開迴圈,以每週期處理更多資料,尤其在卷積操作中有效。
- 設定 DATAFLOW 指令,使層間獨立處理。
3.量化與位寬調整:
- 將啟用值和權重量化為定點精度(例如 INT8),而非浮點數。這在維持準確度的同時顯著降低計算量,尤其適合 FPGA 的固定點運算支援。

五、 使用 Vivado 綜合與部署 Verilog 到 米爾的ZU3EG FPGA開發板
當 HLS 生成的 RTL 程式碼準備就緒後,可以使用 Vivado 將模型部署到 FPGA。1.Vivado 中的設定:
-
將 HLS 輸出的 RTL 檔案匯入 Vivado。
-
在 Vivado 中建立模組設計,包括連線AXI 介面與 ZU3EG 的 ARM 核連線。
2.I/O 約束與時序:
-
定義 FPGA 的 I/O 引腳約束,以匹配 ZU3EG 板的特定管腳配置。配置時鐘約束以滿足合適的資料速率(如影片資料 100-200 MHz)。
-
進行時序分析,確保延遲和響應速度達到實時要求。
3.生成位元流並下載到 ZU3EG:
-
生成的位元流可以直接透過 JTAG 或乙太網介面下載到 ZU3EG。

將 Tiny YOLO 處理模組連線到 米爾ZU3EG開發板 的外設和介面
六、 在 FPGA 上測試並執行推理
現在 Tiny YOLO 已部署,可以驗證其實時物件檢測效能。
1.資料採集:
- 透過連線的相機模組捕捉影像或影片幀,或者使用儲存的測試影片。
- 使用 ZU3EG 的 ARM 核上的 OpenCV 對幀進行預處理,再將它們傳入 FPGA 預處理後進行推理。
2.後處理與顯示:
- 模型檢測物件後,輸出邊框和類別標籤。使用 OpenCV 將邊框對映回原始幀,並在每個檢測到的物件周圍顯示類別和置信度。
3.效能測試:
- 測量幀速率(FPS)和檢測準確度。微調量化位寬或資料流引數,以最佳化實時需求。
Tiny YOLO 模型在 ZU3EG 上顯示檢測結果的實時輸出,影片幀中標註了檢測到的物件
七、 效能最佳化與除錯技巧
為提高效能,可以進行以下調整:- 記憶體訪問:設計資料儲存方式,最大限度利用快取並減少資料傳輸,降低記憶體瓶頸。
- 降低延遲:重新評估關鍵路徑延遲。若延遲過高,調整 Vitis HLS 中的流水線深度,並驗證層間的資料依賴性。
- 量化改進:嘗試 INT8 量化。Xilinx 的 Vitis AI 可幫助微調量化引數,以平衡準確性與速度。

不同最佳化配置對資源使用的影響

米爾MYC-CZU3EG/4EV/5EV-V2核心板及開發板
在MYIR 的 ZU3EG 開發平臺上提供了一種高效的解決方案。利用 FPGA 獨特的靈活性和低功耗優勢,助力未來 AIoT 裝置的普及和智慧升級。
關注米爾電子公眾號,後臺回覆FPGA,獲取完整Tiny Yolo V4教程。