檢測(cè)與定位實(shí)戰(zhàn)指南:從模型選型到部署優(yōu)化的完整落地流程)
1. 從“看得見(jiàn)”到“看得準(zhǔn)”目標(biāo)檢測(cè)與定位到底在解決什么問(wèn)題很多人第一次接觸計(jì)算機(jī)視覺(jué)腦子里冒出來(lái)的第一個(gè)念頭往往是“讓機(jī)器認(rèn)出圖片里有什么”。這個(gè)想法沒(méi)錯(cuò)但只對(duì)了一半。真正讓機(jī)器從“看見(jiàn)”進(jìn)化到“看懂”的關(guān)鍵一步是不僅要說(shuō)出畫(huà)面里有只貓、有輛車(chē)、有個(gè)人還得說(shuō)清楚這只貓?jiān)诋?huà)面的哪個(gè)位置、這輛車(chē)占了多大區(qū)域、這個(gè)人離鏡頭是遠(yuǎn)是近。這就是目標(biāo)檢測(cè)和目標(biāo)定位要干的事。我剛開(kāi)始做視覺(jué)項(xiàng)目的時(shí)候踩過(guò)一個(gè)很典型的坑以為檢測(cè)就是分類(lèi)的升級(jí)版把圖片喂給網(wǎng)絡(luò)輸出一個(gè)類(lèi)別標(biāo)簽就完事了。結(jié)果實(shí)際跑起來(lái)才發(fā)現(xiàn)分類(lèi)網(wǎng)絡(luò)告訴我“這是一張有狗的圖片”但我根本不知道狗在哪兒。如果畫(huà)面里同時(shí)有三只狗、兩輛車(chē)、一個(gè)人分類(lèi)網(wǎng)絡(luò)直接懵了——它只能給整張圖打一個(gè)標(biāo)簽。而目標(biāo)檢測(cè)要做的是把畫(huà)面里每一個(gè)感興趣的對(duì)象都框出來(lái)并且給每個(gè)框標(biāo)上類(lèi)別。這里需要先把兩個(gè)容易混淆的概念掰扯清楚。目標(biāo)定位通常指的是在已知類(lèi)別的前提下找出單個(gè)或多個(gè)同類(lèi)目標(biāo)在圖像中的具體坐標(biāo)位置輸出形式一般是邊界框的四個(gè)坐標(biāo)值。目標(biāo)檢測(cè)則是在定位的基礎(chǔ)上更進(jìn)一步不僅要找到位置還要判斷每個(gè)位置上的物體屬于哪個(gè)類(lèi)別。換句話(huà)說(shuō)定位回答“在哪里”檢測(cè)回答“是什么在哪里”。在實(shí)際工程中這兩者往往是同一個(gè)模型同時(shí)完成的所以業(yè)內(nèi)經(jīng)常把它們放在一起討論。那這項(xiàng)技術(shù)到底能用在哪些地方我梳理了一下自己接觸過(guò)的場(chǎng)景大致可以分成這么幾類(lèi)。第一類(lèi)是安防與監(jiān)控比如在園區(qū)里檢測(cè)有沒(méi)有人闖入禁區(qū)、有沒(méi)有人沒(méi)戴安全帽、有沒(méi)有車(chē)輛違停。第二類(lèi)是工業(yè)質(zhì)檢在生產(chǎn)線(xiàn)上檢測(cè)產(chǎn)品表面有沒(méi)有劃痕、缺件、裝配錯(cuò)位。第三類(lèi)是自動(dòng)駕駛與輔助駕駛檢測(cè)道路上的車(chē)輛、行人、交通標(biāo)志和信號(hào)燈。第四類(lèi)是零售與商業(yè)分析統(tǒng)計(jì)貨架上的商品陳列情況、分析顧客在店內(nèi)的動(dòng)線(xiàn)。第五類(lèi)是醫(yī)療影像在CT或X光片里定位病灶區(qū)域。第六類(lèi)是農(nóng)業(yè)與遙感從航拍圖像里檢測(cè)農(nóng)作物長(zhǎng)勢(shì)、病蟲(chóng)害區(qū)域或者統(tǒng)計(jì)果樹(shù)數(shù)量。這些場(chǎng)景看起來(lái)五花八門(mén)但底層要解決的核心問(wèn)題是一樣的給定一張圖像找出所有感興趣目標(biāo)的位置和類(lèi)別。區(qū)別只在于目標(biāo)的尺度、密度、遮擋程度、光照條件、實(shí)時(shí)性要求各不相同。所以我在做項(xiàng)目選型的時(shí)候從來(lái)不會(huì)一上來(lái)就問(wèn)“哪個(gè)模型最好”而是先問(wèn)“你的場(chǎng)景里目標(biāo)有多大、有多密、跑在什么設(shè)備上、能容忍多少延遲”。這幾個(gè)問(wèn)題的答案直接決定了后面技術(shù)路線(xiàn)的選擇。提示如果你剛?cè)腴T(mén)不要一上來(lái)就啃最新的論文。先把“分類(lèi)、定位、檢測(cè)、分割”這四個(gè)概念的區(qū)別和聯(lián)系搞清楚后面學(xué)任何模型都會(huì)事半功倍。2. 兩階段與單階段檢測(cè)模型的兩條技術(shù)路線(xiàn)怎么選目標(biāo)檢測(cè)模型發(fā)展到現(xiàn)在技術(shù)路線(xiàn)大致可以分成兩大陣營(yíng)兩階段檢測(cè)器和單階段檢測(cè)器。這兩條路線(xiàn)的設(shè)計(jì)哲學(xué)完全不同適用的場(chǎng)景也各有側(cè)重。我在實(shí)際項(xiàng)目里兩種都用過(guò)下面把它們的核心差異和選型邏輯講清楚。2.1 兩階段檢測(cè)器的工作邏輯先找候選再精修兩階段檢測(cè)器的代表思路是“先粗后精”。第一步網(wǎng)絡(luò)會(huì)在圖像上生成大量可能包含目標(biāo)的候選區(qū)域這些區(qū)域叫做區(qū)域提議。第二步對(duì)每個(gè)候選區(qū)域單獨(dú)做分類(lèi)和邊界框回歸判斷它到底是不是目標(biāo)、是什么類(lèi)別、框的位置需不需要微調(diào)。這種設(shè)計(jì)的優(yōu)勢(shì)很明顯因?yàn)榈诙A段對(duì)每個(gè)候選區(qū)域都做了精細(xì)的分類(lèi)和回歸所以檢測(cè)精度通常更高尤其是對(duì)小目標(biāo)和密集目標(biāo)的處理更穩(wěn)。但代價(jià)是速度慢因?yàn)橐幚淼暮蜻x區(qū)域數(shù)量可能上千每個(gè)都要過(guò)一遍分類(lèi)網(wǎng)絡(luò)。我早期在一個(gè)工業(yè)質(zhì)檢項(xiàng)目里用過(guò)這類(lèi)模型當(dāng)時(shí)產(chǎn)線(xiàn)上要檢測(cè)的缺陷非常小有些只有十幾個(gè)像素寬而且缺陷和背景的對(duì)比度很低。兩階段模型在這種場(chǎng)景下的召回率明顯比單階段高出一截。但問(wèn)題是產(chǎn)線(xiàn)速度要求每秒鐘處理至少15幀兩階段模型在當(dāng)時(shí)的硬件上跑不到這個(gè)速度最后只能換方案。2.2 單階段檢測(cè)器的取舍一步到位速度優(yōu)先單階段檢測(cè)器走的是另一條路直接在特征圖上預(yù)測(cè)每個(gè)位置的類(lèi)別和邊界框不需要單獨(dú)的候選區(qū)域生成步驟。你可以把它理解成“在每個(gè)像素位置上直接問(wèn)這里有沒(méi)有目標(biāo)是什么框多大”這種設(shè)計(jì)的最大優(yōu)勢(shì)是速度快因?yàn)檎麄€(gè)網(wǎng)絡(luò)是一次前向傳播就出結(jié)果沒(méi)有反復(fù)的區(qū)域裁剪和二次分類(lèi)。在需要實(shí)時(shí)處理的場(chǎng)景里單階段模型幾乎是默認(rèn)選擇。但它的短板也很明顯由于正負(fù)樣本極度不平衡絕大多數(shù)位置都是背景訓(xùn)練時(shí)容易出現(xiàn)漏檢尤其是小目標(biāo)和密集排列的目標(biāo)。不過(guò)這幾年單階段模型進(jìn)步非??焱ㄟ^(guò)特征金字塔、焦點(diǎn)損失、多尺度訓(xùn)練等技巧精度已經(jīng)追得很近了。我在一個(gè)交通監(jiān)控項(xiàng)目里用單階段模型檢測(cè)車(chē)輛和行人在1080P分辨率下能做到每秒30幀以上精度也滿(mǎn)足業(yè)務(wù)要求。2.3 選型決策表什么場(chǎng)景該用哪條路線(xiàn)為了讓你更直觀地做選擇我把自己總結(jié)的選型邏輯整理成了一張表考量維度兩階段檢測(cè)器單階段檢測(cè)器檢測(cè)精度通常更高尤其小目標(biāo)近年已接近但極端小目標(biāo)仍略遜推理速度較慢難以做到高幀率實(shí)時(shí)快適合實(shí)時(shí)場(chǎng)景訓(xùn)練難度相對(duì)穩(wěn)定收斂較好需要調(diào)損失函數(shù)和正負(fù)樣本策略密集目標(biāo)表現(xiàn)較好需要專(zhuān)門(mén)優(yōu)化否則容易漏檢部署復(fù)雜度較高計(jì)算圖較復(fù)雜較低適合邊緣設(shè)備典型場(chǎng)景工業(yè)質(zhì)檢、醫(yī)療影像、遙感安防監(jiān)控、自動(dòng)駕駛、移動(dòng)端我的經(jīng)驗(yàn)是如果場(chǎng)景對(duì)精度要求極高、對(duì)速度不敏感或者目標(biāo)特別小、特別密優(yōu)先考慮兩階段路線(xiàn)。如果場(chǎng)景要求實(shí)時(shí)、部署在算力有限的設(shè)備上或者目標(biāo)尺度適中、分布不太密集單階段路線(xiàn)更合適。當(dāng)然最終還是要用你自己的數(shù)據(jù)跑一遍對(duì)比因?yàn)椴煌瑪?shù)據(jù)集上的表現(xiàn)差異可能很大。注意不要迷信論文里的精度指標(biāo)。論文用的數(shù)據(jù)集和你的業(yè)務(wù)數(shù)據(jù)分布往往差別很大一定要在自己的驗(yàn)證集上實(shí)測(cè)。3. 邊界框的表示與回歸檢測(cè)模型到底在輸出什么很多人用現(xiàn)成的檢測(cè)框架跑通了Demo但問(wèn)到“模型輸出的那個(gè)框到底是怎么算出來(lái)的”就說(shuō)不清楚了。這一塊如果理解不透后面做數(shù)據(jù)標(biāo)注、損失函數(shù)調(diào)優(yōu)、后處理都會(huì)一頭霧水。我盡量用最直白的方式把這件事講透。3.1 四種坐標(biāo)表示法及其轉(zhuǎn)換關(guān)系邊界框在計(jì)算機(jī)里的表示方式主要有四種不同框架和數(shù)據(jù)集用的格式可能不一樣這是新手最容易踩的坑之一。第一種是左上右下格式也就是記錄框的左上角坐標(biāo)和右下角坐標(biāo)通常寫(xiě)成(x_min, y_min, x_max, y_max)。這種格式最直觀畫(huà)圖的時(shí)候直接用就行。第二種是中心寬高格式記錄框的中心點(diǎn)坐標(biāo)和寬高寫(xiě)成(cx, cy, w, h)。很多檢測(cè)模型在訓(xùn)練時(shí)用這種格式因?yàn)樗鼘?duì)位置和尺度的建模更自然。第三種是歸一化格式把坐標(biāo)值除以圖像寬高變成0到1之間的小數(shù)。這種格式的好處是跟圖像分辨率解耦換分辨率時(shí)不用改標(biāo)注。第四種是兩點(diǎn)格式跟第一種類(lèi)似但有時(shí)候用(x1, y1, x2, y2)表示注意區(qū)分坐標(biāo)順序。它們之間的轉(zhuǎn)換關(guān)系其實(shí)很簡(jiǎn)單但我在代碼里見(jiàn)過(guò)太多因?yàn)楦袷礁慊鞂?dǎo)致框畫(huà)歪的案例。比如把(cx, cy, w, h)直接當(dāng)成(x_min, y_min, x_max, y_max)用畫(huà)出來(lái)的框會(huì)偏到左上角去。建議在項(xiàng)目里統(tǒng)一用一種格式做內(nèi)部表示只在數(shù)據(jù)加載和結(jié)果輸出時(shí)做轉(zhuǎn)換。3.2 為什么模型不直接預(yù)測(cè)絕對(duì)坐標(biāo)這是一個(gè)很關(guān)鍵的問(wèn)題。如果讓模型直接回歸框的絕對(duì)像素坐標(biāo)會(huì)遇到一個(gè)麻煩同一個(gè)物體在不同分辨率的圖像里絕對(duì)坐標(biāo)完全不同。模型很難學(xué)到“這個(gè)物體長(zhǎng)什么樣”和“它的絕對(duì)坐標(biāo)是多少”之間的穩(wěn)定關(guān)系。所以主流做法是讓模型預(yù)測(cè)偏移量。具體來(lái)說(shuō)模型先有一個(gè)“參考框”然后預(yù)測(cè)真實(shí)框相對(duì)于參考框的偏移。這個(gè)參考框可能來(lái)自錨框、特征圖上的網(wǎng)格點(diǎn)或者上一階段的候選區(qū)域。偏移量的表示通常是對(duì)中心點(diǎn)偏移做歸一化、對(duì)寬高做對(duì)數(shù)變換這樣可以讓不同尺度的目標(biāo)在回歸時(shí)處于相近的數(shù)值范圍訓(xùn)練更穩(wěn)定。我打個(gè)比方這就像你告訴朋友“從你家出門(mén)左轉(zhuǎn)走兩百米再右轉(zhuǎn)”比直接說(shuō)“到經(jīng)度116.4度緯度39.9度”更容易理解和執(zhí)行。偏移量就是那個(gè)“左轉(zhuǎn)走兩百米”的相對(duì)描述。3.3 錨框機(jī)制與無(wú)錨框機(jī)制的對(duì)比錨框是檢測(cè)模型里一個(gè)非常重要的概念。簡(jiǎn)單說(shuō)就是在特征圖的每個(gè)位置上預(yù)先設(shè)定若干個(gè)不同大小和長(zhǎng)寬比的參考框模型基于這些參考框做偏移預(yù)測(cè)。這樣做的好處是給模型提供了先驗(yàn)知識(shí)——比如在某個(gè)尺度上目標(biāo)大概有多大。但錨框也帶來(lái)了一些問(wèn)題。首先是超參數(shù)多要設(shè)定錨框的尺寸、長(zhǎng)寬比、數(shù)量這些在不同數(shù)據(jù)集上需要調(diào)整。其次是正負(fù)樣本分配復(fù)雜要計(jì)算每個(gè)錨框和真實(shí)框的重疊度然后決定哪些算正樣本、哪些算負(fù)樣本。最后是計(jì)算量大錨框數(shù)量往往是特征圖位置數(shù)的好幾倍。無(wú)錨框機(jī)制則試圖繞開(kāi)這些麻煩直接預(yù)測(cè)目標(biāo)中心點(diǎn)或者關(guān)鍵點(diǎn)然后從中心點(diǎn)推導(dǎo)出邊界框。這種思路更簡(jiǎn)潔超參數(shù)更少近年來(lái)在很多場(chǎng)景下表現(xiàn)也很好。我在一個(gè)目標(biāo)尺度變化不大的項(xiàng)目里用過(guò)無(wú)錨框方案調(diào)參確實(shí)省心不少。但如果目標(biāo)尺度跨度很大錨框機(jī)制的先驗(yàn)仍然有優(yōu)勢(shì)。提示如果你用的是現(xiàn)成框架先搞清楚它默認(rèn)用的是錨框還是無(wú)錨框這直接影響你后面調(diào)參的方向。4. 從標(biāo)注到訓(xùn)練一個(gè)檢測(cè)項(xiàng)目的完整落地流程光懂原理不夠真正把項(xiàng)目跑起來(lái)是另一回事。我做過(guò)好幾個(gè)從零開(kāi)始的檢測(cè)項(xiàng)目下面把完整流程拆開(kāi)講包括每一步容易出問(wèn)題的地方。4.1 數(shù)據(jù)標(biāo)注質(zhì)量比數(shù)量更重要檢測(cè)項(xiàng)目的第一步永遠(yuǎn)是數(shù)據(jù)。沒(méi)有標(biāo)注數(shù)據(jù)再好的模型也學(xué)不出東西。標(biāo)注的質(zhì)量直接決定模型的上限這一點(diǎn)怎么強(qiáng)調(diào)都不過(guò)分。標(biāo)注工具的選擇上常用的有開(kāi)源的標(biāo)注軟件支持畫(huà)框、選類(lèi)別、導(dǎo)出多種格式。我建議在標(biāo)注之前先定好標(biāo)注規(guī)范比如目標(biāo)被遮擋多少比例就不標(biāo)目標(biāo)小于多少像素就不標(biāo)邊界框是緊貼目標(biāo)邊緣還是留一點(diǎn)余量這些規(guī)則如果不提前統(tǒng)一不同標(biāo)注人員標(biāo)出來(lái)的數(shù)據(jù)一致性會(huì)很差。我踩過(guò)的一個(gè)坑是早期項(xiàng)目里讓幾個(gè)人同時(shí)標(biāo)注沒(méi)有統(tǒng)一規(guī)范結(jié)果有的人把整個(gè)貨架標(biāo)成一個(gè)框有的人把貨架上每個(gè)商品單獨(dú)標(biāo)框。模型學(xué)出來(lái)的結(jié)果就是一會(huì)兒檢測(cè)大區(qū)域、一會(huì)兒檢測(cè)小物體完全沒(méi)法用。后來(lái)重新定了規(guī)范、返工標(biāo)注浪費(fèi)了大量時(shí)間。還有一個(gè)經(jīng)驗(yàn)是標(biāo)注數(shù)量不是越多越好而是越均衡越好。如果某個(gè)類(lèi)別的樣本特別多其他類(lèi)別特別少模型會(huì)偏向多數(shù)類(lèi)。我一般會(huì)保證每個(gè)類(lèi)別至少有幾百個(gè)實(shí)例并且盡量覆蓋不同的尺度、光照、遮擋情況。4.2 數(shù)據(jù)增強(qiáng)讓小數(shù)據(jù)集也能訓(xùn)出好模型實(shí)際項(xiàng)目里標(biāo)注數(shù)據(jù)往往不夠多。這時(shí)候數(shù)據(jù)增強(qiáng)就是救命稻草。常用的增強(qiáng)手段包括隨機(jī)裁剪、縮放、翻轉(zhuǎn)、旋轉(zhuǎn)、色彩抖動(dòng)、馬賽克拼接等。但增強(qiáng)不是隨便加就行。比如你做的是交通標(biāo)志檢測(cè)那水平翻轉(zhuǎn)可能沒(méi)問(wèn)題但垂直翻轉(zhuǎn)就不合理了——現(xiàn)實(shí)中的交通標(biāo)志不會(huì)倒過(guò)來(lái)。再比如你做的是工業(yè)質(zhì)檢色彩抖動(dòng)可能把缺陷的顏色特征破壞掉反而降低效果。我通常的做法是先分析業(yè)務(wù)場(chǎng)景里目標(biāo)可能出現(xiàn)的變化然后只加那些合理的變化。比如目標(biāo)可能出現(xiàn)在不同光照下就加亮度對(duì)比度調(diào)整目標(biāo)可能有不同尺度就加多尺度縮放目標(biāo)可能被部分遮擋就加隨機(jī)遮擋。增強(qiáng)策略要跟實(shí)際場(chǎng)景對(duì)齊不能為了增強(qiáng)而增強(qiáng)。4.3 訓(xùn)練配置學(xué)習(xí)率、批次大小與迭代次數(shù)訓(xùn)練配置這塊我見(jiàn)過(guò)太多人直接用默認(rèn)參數(shù)跑結(jié)果要么不收斂要么過(guò)擬合。這里說(shuō)幾個(gè)關(guān)鍵點(diǎn)。學(xué)習(xí)率是最重要的超參數(shù)。太大容易震蕩不收斂太小收斂太慢。我一般先用一個(gè)較小的學(xué)習(xí)率跑幾百次迭代觀察損失下降情況然后再調(diào)整。如果用的是帶預(yù)訓(xùn)練權(quán)重的模型初始學(xué)習(xí)率可以設(shè)小一點(diǎn)因?yàn)闄?quán)重已經(jīng)比較好了不需要大改。批次大小受顯存限制。如果顯存不夠可以用梯度累積來(lái)模擬大批次。批次大小會(huì)影響批歸一化的效果太小的話(huà)統(tǒng)計(jì)量不穩(wěn)定訓(xùn)練會(huì)抖動(dòng)。迭代次數(shù)不是越多越好。我一般會(huì)在驗(yàn)證集上監(jiān)控指標(biāo)如果連續(xù)若干輪驗(yàn)證指標(biāo)不再提升就提前停止。否則模型會(huì)在訓(xùn)練集上過(guò)擬合驗(yàn)證集上反而變差。4.4 模型評(píng)估m(xù)AP之外還要看什么提到檢測(cè)模型的評(píng)估大家第一反應(yīng)就是mAP。這個(gè)指標(biāo)確實(shí)重要但它不是全部。我在實(shí)際項(xiàng)目里還會(huì)看以下幾個(gè)維度。第一是各類(lèi)別的AP。整體mAP高不代表每個(gè)類(lèi)別都好。有可能多數(shù)類(lèi)AP很高少數(shù)類(lèi)AP很低但被平均值掩蓋了。一定要把每個(gè)類(lèi)別的指標(biāo)單獨(dú)拉出來(lái)看。第二是不同尺度目標(biāo)的召回率。把驗(yàn)證集里的目標(biāo)按面積分成小、中、大三檔分別看召回率。如果小目標(biāo)召回率明顯低說(shuō)明模型對(duì)小目標(biāo)處理不好可能需要調(diào)整特征金字塔或者增加小目標(biāo)增強(qiáng)。第三是誤檢和漏檢的具體案例。指標(biāo)只是數(shù)字真正定位問(wèn)題還是要看具體圖片。我習(xí)慣把誤檢和漏檢的圖片單獨(dú)導(dǎo)出來(lái)看分析是標(biāo)注問(wèn)題、模型問(wèn)題還是場(chǎng)景本身太難。第四是推理速度。在業(yè)務(wù)場(chǎng)景里模型跑不動(dòng)等于沒(méi)用。要測(cè)實(shí)際部署環(huán)境下的幀率包括預(yù)處理和后處理的時(shí)間。注意評(píng)估一定要用獨(dú)立的驗(yàn)證集不能用訓(xùn)練集。訓(xùn)練集上的指標(biāo)再高也不能說(shuō)明模型泛化能力。5. 部署與優(yōu)化讓檢測(cè)模型真正跑起來(lái)模型訓(xùn)練完只是第一步真正部署到業(yè)務(wù)環(huán)境里還有一堆事要處理。這一塊往往是學(xué)術(shù)研究和工程落地之間差距最大的地方。5.1 推理引擎的選擇與模型轉(zhuǎn)換訓(xùn)練框架和推理框架往往是兩回事。訓(xùn)練可能用的是某個(gè)深度學(xué)習(xí)框架但部署時(shí)為了性能通常會(huì)把模型轉(zhuǎn)換成專(zhuān)門(mén)的推理格式然后用對(duì)應(yīng)的推理引擎來(lái)跑。常見(jiàn)的推理引擎各有特點(diǎn)。有的對(duì)服務(wù)器端優(yōu)化好有的對(duì)邊緣設(shè)備支持好有的對(duì)特定硬件有加速。選擇的時(shí)候要考慮你的部署硬件是什么、是否需要跨平臺(tái)、社區(qū)支持是否活躍。模型轉(zhuǎn)換過(guò)程中最容易出問(wèn)題的是算子不支持。訓(xùn)練時(shí)用的某些操作推理引擎可能沒(méi)有實(shí)現(xiàn)轉(zhuǎn)換就會(huì)失敗。我的經(jīng)驗(yàn)是在模型設(shè)計(jì)階段就盡量用主流算子避免用太新的或者太冷門(mén)的操作。如果非用不可就要準(zhǔn)備好自己實(shí)現(xiàn)或者找替代方案。5.2 量化與剪枝在精度和速度之間找平衡如果模型在目標(biāo)設(shè)備上跑得太慢可以考慮量化和剪枝。量化是把模型的權(quán)重和激活值從高精度浮點(diǎn)數(shù)轉(zhuǎn)換成低精度表示比如8位整數(shù)。這樣做的好處是模型體積變小、內(nèi)存占用降低、推理速度提升。但量化會(huì)帶來(lái)精度損失尤其是對(duì)檢測(cè)這種對(duì)位置敏感的任務(wù)量化后的框可能會(huì)有偏移。我一般會(huì)用量化感知訓(xùn)練來(lái)緩解這個(gè)問(wèn)題就是在訓(xùn)練階段就模擬量化的效果讓模型提前適應(yīng)。剪枝是去掉模型中不重要的連接或通道減少計(jì)算量。結(jié)構(gòu)化剪枝可以直接減少卷積核數(shù)量對(duì)速度提升更明顯。但剪枝后通常需要微調(diào)否則精度掉得厲害。我的建議是先用量化因?yàn)閷?shí)現(xiàn)簡(jiǎn)單、收益直接。如果還不夠快再考慮剪枝。兩者可以疊加使用但要注意疊加后的精度損失。5.3 后處理非極大值抑制的坑與調(diào)參檢測(cè)模型輸出的原始結(jié)果里同一個(gè)目標(biāo)往往會(huì)有多個(gè)重疊的框。非極大值抑制就是用來(lái)去掉冗余框的按置信度排序保留最高的然后去掉跟它重疊度超過(guò)閾值的其他框。這個(gè)重疊度閾值是個(gè)關(guān)鍵參數(shù)。設(shè)得太高冗余框去不干凈同一個(gè)目標(biāo)會(huì)出現(xiàn)好幾個(gè)框設(shè)得太低相鄰的兩個(gè)目標(biāo)可能被誤刪一個(gè)。我在密集場(chǎng)景里調(diào)這個(gè)參數(shù)調(diào)了很久最后發(fā)現(xiàn)沒(méi)有萬(wàn)能值只能根據(jù)業(yè)務(wù)場(chǎng)景的實(shí)際密度來(lái)定。還有一個(gè)坑是當(dāng)兩個(gè)同類(lèi)目標(biāo)靠得很近時(shí)非極大值抑制很容易把其中一個(gè)刪掉。后來(lái)我用了改進(jìn)的軟化版本不是直接刪除而是根據(jù)重疊度降低置信度效果好了不少。5.4 實(shí)際部署中的性能瓶頸排查部署之后如果發(fā)現(xiàn)速度不達(dá)標(biāo)不要急著換模型先排查瓶頸在哪里。我一般按這個(gè)順序查第一步測(cè)預(yù)處理時(shí)間。圖像解碼、縮放、歸一化這些操作有時(shí)候比模型推理還慢尤其是高分辨率圖像。第二步測(cè)模型推理時(shí)間。這是核心計(jì)算部分用推理引擎的profiling工具看每一層的耗時(shí)。第三步測(cè)后處理時(shí)間。非極大值抑制在框很多的時(shí)候會(huì)很慢可以考慮用GPU加速或者優(yōu)化實(shí)現(xiàn)。第四步看數(shù)據(jù)傳輸時(shí)間。如果數(shù)據(jù)在CPU和GPU之間來(lái)回拷貝或者通過(guò)網(wǎng)絡(luò)傳輸這部分開(kāi)銷(xiāo)可能很大。我遇到過(guò)一個(gè)案例模型推理只花了10毫秒但圖像解碼花了30毫秒整體幀率被預(yù)處理拖垮了。后來(lái)?yè)Q了更快的解碼庫(kù)幀率直接翻倍。所以一定要分段測(cè)不要憑感覺(jué)猜。6. 那些只有踩過(guò)才知道的實(shí)戰(zhàn)經(jīng)驗(yàn)最后這部分我想分享一些在文檔和論文里不太會(huì)寫(xiě)、但實(shí)際項(xiàng)目中非常關(guān)鍵的經(jīng)驗(yàn)。這些都是我在多個(gè)項(xiàng)目里踩坑踩出來(lái)的希望能幫你少走彎路。6.1 小目標(biāo)檢測(cè)為什么難怎么破小目標(biāo)檢測(cè)是檢測(cè)領(lǐng)域公認(rèn)的難點(diǎn)。難在哪里一是小目標(biāo)在圖像里占的像素少經(jīng)過(guò)多次下采樣后特征幾乎消失了二是小目標(biāo)的標(biāo)注本身就不容易邊界框稍微偏幾個(gè)像素重疊度就掉很多三是小目標(biāo)和背景的區(qū)分度低模型容易漏檢。我試過(guò)幾種有效的策略。第一種是提高輸入分辨率讓目標(biāo)在輸入圖像里占更多像素。但這會(huì)增加計(jì)算量要權(quán)衡。第二種是用特征金字塔把淺層的高分辨率特征和深層的語(yǔ)義特征融合起來(lái)讓模型既能看到細(xì)節(jié)又能理解語(yǔ)義。第三種是專(zhuān)門(mén)的小目標(biāo)增強(qiáng)比如在訓(xùn)練時(shí)把小目標(biāo)復(fù)制粘貼到圖像的不同位置增加小目標(biāo)的樣本量。第四種是調(diào)整錨框尺寸讓錨框跟實(shí)際目標(biāo)的尺度分布匹配。這幾種方法可以組合使用。我在一個(gè)遙感圖像項(xiàng)目里同時(shí)用了提高分辨率和特征金字塔小目標(biāo)召回率提升了將近二十個(gè)百分點(diǎn)。6.2 類(lèi)別不平衡與難例挖掘的實(shí)操技巧實(shí)際業(yè)務(wù)數(shù)據(jù)里類(lèi)別不平衡是常態(tài)。有的類(lèi)別樣本成百上千有的類(lèi)別只有幾十個(gè)。模型訓(xùn)練時(shí)會(huì)偏向多數(shù)類(lèi)少數(shù)類(lèi)檢測(cè)效果很差。我常用的應(yīng)對(duì)方法有幾種。第一種是重采樣對(duì)少數(shù)類(lèi)過(guò)采樣或者對(duì)多數(shù)類(lèi)欠采樣。但過(guò)采樣容易導(dǎo)致過(guò)擬合欠采樣會(huì)丟失信息要謹(jǐn)慎使用。第二種是損失加權(quán)給少數(shù)類(lèi)的損失更高權(quán)重讓模型更關(guān)注少數(shù)類(lèi)。第三種是難例挖掘在訓(xùn)練過(guò)程中找出模型預(yù)測(cè)錯(cuò)的樣本重點(diǎn)訓(xùn)練這些難例。難例挖掘這塊我一般會(huì)在訓(xùn)練幾個(gè)輪次后用當(dāng)前模型在驗(yàn)證集上跑一遍把漏檢和誤檢的樣本挑出來(lái)人工檢查是標(biāo)注問(wèn)題還是模型問(wèn)題。如果是標(biāo)注問(wèn)題就修正標(biāo)注如果是模型問(wèn)題就把這些樣本加入訓(xùn)練集重點(diǎn)訓(xùn)練。這個(gè)迭代過(guò)程往往比單純調(diào)模型結(jié)構(gòu)更有效。6.3 模型更新與數(shù)據(jù)閉環(huán)的工程實(shí)踐檢測(cè)模型上線(xiàn)不是終點(diǎn)而是起點(diǎn)。業(yè)務(wù)場(chǎng)景會(huì)變化數(shù)據(jù)分布會(huì)漂移模型需要持續(xù)更新。建立一個(gè)數(shù)據(jù)閉環(huán)非常重要。我的做法是在線(xiàn)上推理時(shí)把模型置信度處于中間區(qū)間的樣本、以及用戶(hù)反饋有問(wèn)題的樣本自動(dòng)保存下來(lái)。定期對(duì)這些樣本做人工審核和標(biāo)注然后加入訓(xùn)練集重新訓(xùn)練模型。這樣模型就能不斷適應(yīng)新的數(shù)據(jù)分布。這個(gè)閉環(huán)的關(guān)鍵是自動(dòng)化。如果全靠人工去收集和篩選樣本成本太高很難持續(xù)。我一般會(huì)寫(xiě)腳本自動(dòng)完成樣本收集、去重、初步篩選人工只需要做最后的審核和標(biāo)注。6.4 常見(jiàn)問(wèn)題速查表為了方便你快速定位問(wèn)題我把檢測(cè)項(xiàng)目里最常見(jiàn)的問(wèn)題和排查方向整理成了表格現(xiàn)象可能原因排查方向訓(xùn)練損失不下降學(xué)習(xí)率過(guò)大或過(guò)小、數(shù)據(jù)標(biāo)注錯(cuò)誤檢查學(xué)習(xí)率、可視化標(biāo)注框驗(yàn)證集指標(biāo)遠(yuǎn)低于訓(xùn)練集過(guò)擬合、數(shù)據(jù)分布不一致增加增強(qiáng)、檢查驗(yàn)證集來(lái)源小目標(biāo)漏檢嚴(yán)重特征分辨率不足、錨框不匹配提高輸入分辨率、調(diào)整錨框密集目標(biāo)漏檢非極大值抑制閾值過(guò)低調(diào)高閾值、用軟化版本推理速度慢預(yù)處理瓶頸、模型過(guò)大分段測(cè)時(shí)、量化剪枝框位置偏移坐標(biāo)格式轉(zhuǎn)換錯(cuò)誤檢查標(biāo)注和輸出的格式某些類(lèi)別效果差類(lèi)別不平衡損失加權(quán)、重采樣、難例挖掘這張表是我自己排查問(wèn)題時(shí)常用的基本上覆蓋了八成以上的常見(jiàn)情況。遇到問(wèn)題先對(duì)照這張表過(guò)一遍能省不少時(shí)間。6.5 給不同階段從業(yè)者的建議如果你是剛?cè)腴T(mén)我的建議是先把一個(gè)完整的流程跑通從標(biāo)注幾十張圖開(kāi)始用一個(gè)成熟的框架訓(xùn)練一個(gè)小模型然后部署起來(lái)看到實(shí)際效果。不要一開(kāi)始就追求SOTA先把鏈路打通理解每個(gè)環(huán)節(jié)在干什么。如果你已經(jīng)有一定經(jīng)驗(yàn)建議深入兩個(gè)方向一是數(shù)據(jù)側(cè)研究怎么用更少的數(shù)據(jù)訓(xùn)出更好的模型怎么做數(shù)據(jù)增強(qiáng)和難例挖掘二是部署側(cè)研究怎么在有限算力下把模型跑得更快更穩(wěn)。這兩個(gè)方向在實(shí)際工作中價(jià)值最大。如果你在做團(tuán)隊(duì)項(xiàng)目建議盡早建立標(biāo)注規(guī)范和評(píng)估標(biāo)準(zhǔn)。這兩件事看起來(lái)不起眼但如果沒(méi)有后面返工的成本會(huì)非常高。我見(jiàn)過(guò)太多項(xiàng)目因?yàn)闃?biāo)注不一致導(dǎo)致模型反復(fù)重訓(xùn)浪費(fèi)了大量時(shí)間和算力。目標(biāo)檢測(cè)和定位這個(gè)領(lǐng)域理論在快速演進(jìn)但工程落地的核心邏輯其實(shí)很穩(wěn)定數(shù)據(jù)質(zhì)量決定上限模型選型決定效率部署優(yōu)化決定能不能真正用起來(lái)。把這三件事都做好項(xiàng)目基本就不會(huì)差。