YOLOv10 解析與地平線 征程 6 模型量化
# 一,YOLOv10 解析
## 1.簡介
近些年來,研究人員對 YOLO 的架構設計、優化目標、數據增強策略等進行了探索,取得了顯著進展。然而,后處理對非極大值抑制(NMS)的依賴阻礙了 YOLO 的端到端部署,并對推理延遲產生不利影響。此外,YOLO 中各個組件的設計缺乏全面徹底的檢查,導致明顯的計算冗余并限制了模型的能力。
YOLOv10 的突破就在于從后處理和模型架構方面進一步提升了 YOLO 的性能 - 效率邊界。
為此,研究團隊**首次提出了** **YOLO** **無 NMS 訓練的一致雙重分配(consistent dual assignment)**,這使得 YOLO 在性能和推理延遲方面有所改進。
研究團隊為 YOLO 提出了整體效率 - 準確率驅動的模型設計策略,從效率和準確率兩個角度全面優化 YOLO 的各個組件,大大降低了計算開銷并增強了模型能力。
大量實驗表明,YOLOv10 在各種模型規模上都實現了 SOTA 性能和效率。例如,YOLOv10-S 在 COCO 上的類似 AP 下比 RT-DETR-R18 快 1.8 倍,同時參數數量和 FLOP 大幅減少。與 YOLOv9-C 相比,在性能相同的情況下,YOLOv10-B 的延遲減少了 46%,參數減少了 25%。

## 2.**方法介紹**
為了實現整體效率 - 準確率驅動的模型設計,研究團隊從效率、準確率兩方面分別提出改進方法。
為了提高效率,該研究提出了輕量級分類 head、空間通道(spatial-channel)解耦下采樣和排序指導的塊設計,以減少明顯的計算冗余并實現更高效的架構。
為了提高準確率,研究團隊探索了大核卷積并提出了有效的部分自注意力(partial self-attention,PSA)模塊來增強模型能力,在低成本下挖掘性能改進的潛力。基于這些方法,該團隊成功實現了一系列不同規模的實時端到端檢測器,即 YOLOv10-N / S / M / B / L / X。
## 3.**用于無 NMS 訓練的一致雙重分配**
在訓練期間,YOLO 通常利用 TAL 為每個實例分配多個正樣本。一對多的分配方式產生了豐富的監督信號,促進了優化并使模型實現了卓越的性能。
然而,這需要 YOLO 依賴于 NMS 后處理,這導致了部署時次優的推理效率。雖然之前的研究工作探索了一對一匹配來抑制冗余預測,但它們通常引入了額外的推理開銷。
與一對多分配不同,一對一匹配對每個 ground truth 僅分配一個預測,避免 NMS 后處理。然而,這會導致弱監督,以至于準確率和收斂速度不理想。幸運的是,這種缺陷可以通過一對多分配來彌補。
該研究提出的「雙標簽分配」結合了上述兩種策略的優點。如下圖所示,該研究為 YOLO 引入了另一個一對一 head。它保留了與原始一對多分支相同的結構并采用相同的優化目標,但利用一對一匹配來獲取標簽分配。在訓練過程中,兩個 head 聯合優化,以提供豐富的監督;在推理過程中,YOLOv10 會丟棄一對多 head 并利用一對一 head 做出預測。這使得 YOLO 能夠進行端到端部署,而不會產生任何額外的推理成本。

## 4.**整體效率 - 準確率驅動的模型設計**
除了后處理之外,YOLO 的模型架構也對效率 - 準確率權衡提出了巨大挑戰。盡管之前的研究工作探索了各種設計策略,但仍然缺乏對 YOLO 中各種組件的全面檢查。因此,模型架構表現出不可忽視的計算冗余和能力受限。
YOLO 中的組件包括 stem、下采樣層、帶有基本構建塊的階段和 head。作者主要對以下三個部分執行效率驅動的模型設計。
1. 輕量級分類 head。
2. 空間通道解耦下采樣。
3. 排序指導的模塊設計。

# 二,yolov10 訓練
## 1.下載模型訓練代碼。
github 網址:https://github.com/THU-MIG/yolov10
拉取壓縮包如下圖

## 2.搭建 conda 訓練環境
conda activate yolov10 #先激活自己的虛擬環境
pip install -r requirements.txt #一鍵安裝相應的安裝包
## 3.設置數據集
我使用的是 coco 數據集,如圖

## 4.模型訓練,代碼如下圖。

## 5.訓練之后轉 onnx 模型。
# 三,yolov10 模型量化
使用的是地平線 征程 6 的 docker,版本是 v3.0.22
## 1.首先進行模型檢查。
在浮點模型準備好之后,我們建議先進行快速的模型驗證,以確保其符合計算平臺的支持約束。啟動樣例里面的腳本,修改一下路徑即可,如下圖。如果模型驗證不通過,請根據終端打印或在當前路徑下生成的日志文件確認報錯信息和修改建議。

## 2.準備校準數據集。
PTQ 方案的校準數據一般是從訓練集或驗證集中篩選 100 份左右(可適當增減)的典型數據,并應避免非常少見的異常樣本, 如純色圖片、不含任何檢測或分類目標的圖片等。篩選出的校準數據還需進行與模型 inference 前一致的預處理操作, 處理后保持與原始模型一樣的數據類型、layout 和尺寸。
對于校準數據的預處理,地平線建議直接參考示例代碼進行修改使用,preprocess.py 文件中 的 calibration_transformers 函數的包含了其校準數據的前處理 transformers,處理完的校準數據與其 yaml 配置文件保持一致,

## 3.編輯 yaml 文件進行模型量化編譯
Yaml 配置文件共包含 4 個必選參數組和 1 個可選參數組, 每個參數組下也區分必選和可選參數(可選參數默認隱藏), 具體要求和填寫方式可以參考 OE 文檔里的具體章節。
準備完校準數據和 yaml 配置文件后,即可一步命令完成模型解析、圖優化、校準、量化、編譯的全流程轉換。

## 4.編譯模型結果查看
轉換完成后,會在 yaml 文件配置的路徑下保存各階段流程產出的模型文件和編譯器預估的模型 BPU 部分的靜態性能評估文件。
各個算子余弦相似度如圖
)
生成包含模型靜態性能預估的 html 和 json 文件,兩者內容相同, 但 html 文件的可讀性更好,如下圖。
余弦相似度如圖
[外鏈圖片轉存中...(img-410vo2h6-1740490280824)])
生成包含模型靜態性能預估的 html 和 json 文件,兩者內容相同, 但 html 文件的可讀性更好,如下圖。

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。