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

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

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

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

## 2.搭建 conda 訓(xùn)練環(huán)境
conda activate yolov10 #先激活自己的虛擬環(huán)境
pip install -r requirements.txt #一鍵安裝相應(yīng)的安裝包
## 3.設(shè)置數(shù)據(jù)集
我使用的是 coco 數(shù)據(jù)集,如圖

## 4.模型訓(xùn)練,代碼如下圖。

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

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

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

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

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。