別(Person Re-ID)核心技術(shù)解析與工程實(shí)踐指南)
1. 先搞清楚Person Re-ID到底在解決什么問(wèn)題1.1 一句話定義以及它和人臉識(shí)別的邊界在哪Person Re-ID行人重識(shí)別一般簡(jiǎn)寫(xiě)為Re-ID或ReID這幾年在計(jì)算機(jī)視覺(jué)里熱度一直不低但很多剛?cè)腴T(mén)的人容易把它和人臉識(shí)別搞混。我比較喜歡用一句話來(lái)區(qū)分人臉識(shí)別回答的是“這個(gè)人是誰(shuí)”P(pán)erson Re-ID回答的是“這個(gè)人在其他攝像頭里有沒(méi)有出現(xiàn)過(guò)、在哪里出現(xiàn)過(guò)”。換句話說(shuō)它要解決的是跨攝像頭、跨時(shí)間、跨場(chǎng)景下的行人匹配問(wèn)題。具體點(diǎn)說(shuō)給定一張查詢(xún)圖query系統(tǒng)要從一個(gè)很大的候選圖庫(kù)gallery里找出同一身份的行人。這個(gè)任務(wù)聽(tīng)起來(lái)跟圖像檢索很像但如果直接拿通用的圖像檢索方案來(lái)做效果通常比較慘。原因也很直白R(shí)e-ID面對(duì)的類(lèi)內(nèi)差異極大同一個(gè)人的外觀在不同攝像頭下可能因?yàn)楣庹?、角度、姿態(tài)、遮擋、分辨率甚至季節(jié)穿著而大不相同而類(lèi)間差異反而可能極小兩個(gè)人穿著相似的衣服、站在相似的背景下比許多分類(lèi)任務(wù)里的“貓和狗”難分多了。它的實(shí)際應(yīng)用場(chǎng)景也決定了這個(gè)任務(wù)不能只停留在實(shí)驗(yàn)室。最常見(jiàn)的就是跨鏡頭的行人追蹤與軌跡還原——比如一個(gè)大型園區(qū)部署了幾百路攝像頭當(dāng)某個(gè)人從A鏡頭走到B鏡頭再到C鏡頭系統(tǒng)需要判斷這幾次出現(xiàn)是不是同一個(gè)人。再比如智慧零售里統(tǒng)計(jì)顧客動(dòng)線、尋找走失老人兒童、公共安全場(chǎng)景下的目標(biāo)檢索背后都是同一套邏輯。再加上目前很多地方都有存量攝像頭Re-ID是少數(shù)能在不改動(dòng)硬件的情況下通過(guò)純軟件算法提升視頻結(jié)構(gòu)化能力的方案。正因?yàn)檫@樣Person Re-ID在學(xué)術(shù)界火了很多年工業(yè)界的需求也一直很旺盛。當(dāng)然也因?yàn)樗y——難在這件事不是“堆數(shù)據(jù)就能解決”的簡(jiǎn)單分類(lèi)問(wèn)題它需要模型對(duì)行人外觀有過(guò)人的判別力、對(duì)跨域變化有很強(qiáng)的魯棒性還得在推理時(shí)扛得住大規(guī)模圖庫(kù)的檢索壓力。1.2 為什么“跨攝像頭跨時(shí)間”讓任務(wù)變得這么難初學(xué)者看論文里那些花哨的網(wǎng)絡(luò)結(jié)構(gòu)時(shí)容易忽略一個(gè)更底層的問(wèn)題Re-ID的難點(diǎn)到底是什么。我把這個(gè)問(wèn)題拆成三塊來(lái)看。第一塊是傳感器和環(huán)境的差異。不同攝像頭的白平衡、曝光參數(shù)、安裝高度、視角范圍都不一樣同一個(gè)行人從正門(mén)攝像頭走進(jìn)來(lái)再到側(cè)門(mén)攝像頭出現(xiàn)膚色可能都偏了更不用說(shuō)衣服顏色在日光和燈光下完全是兩個(gè)效果。這類(lèi)問(wèn)題不是簡(jiǎn)單的顏色校正能解決的因?yàn)閳?chǎng)景里每個(gè)像素的偏移都不是均勻的。第二塊是行人自身的姿態(tài)和遮擋變化。人不是剛性物體不會(huì)像車(chē)牌一樣始終一個(gè)模樣。走路時(shí)手臂擺動(dòng)會(huì)擋住身體一部分坐在椅子上時(shí)下半身被遮住更不用提背包、推車(chē)、打傘這類(lèi)常見(jiàn)情況。早期方法里很多是提取全身特征一旦遮擋嚴(yán)重全局特征里混進(jìn)了大量干擾信息模型就很容易翻車(chē)。第三塊是最隱蔽但也最麻煩的跨域差異。在一個(gè)數(shù)據(jù)集上訓(xùn)練好的模型換到另一個(gè)場(chǎng)景上性能會(huì)掉得特別明顯。我在實(shí)際項(xiàng)目里見(jiàn)過(guò)很典型的案例用Market-1501訓(xùn)練出的模型在實(shí)驗(yàn)室測(cè)試集上mAP能到85%以上拿到現(xiàn)場(chǎng)攝像頭一測(cè)直接掉到40%。原因就是訓(xùn)練數(shù)據(jù)和實(shí)際場(chǎng)景之間的分布差異太大模型學(xué)到了訓(xùn)練集里的“偏科知識(shí)”比如某類(lèi)背景或某種光照條件下的統(tǒng)計(jì)規(guī)律而不是真正通用的行人判別能力。這也是為什么近年來(lái)越來(lái)越多研究轉(zhuǎn)向無(wú)監(jiān)督域適應(yīng)和泛化性方向。1.3 評(píng)估指標(biāo)里那些容易看走眼的坑提Re-ID必然繞不開(kāi)CMC曲線和mAP這兩個(gè)指標(biāo)。很多新手一開(kāi)始只盯Rank-1認(rèn)為“第一名命中率越高模型越好”這個(gè)理解其實(shí)是有偏差的。CMCCumulative Matching Characteristic描述的是搜索結(jié)果前k位中出現(xiàn)正確目標(biāo)的概率Rank-1就是第一名命中的概率Rank-5就是前五名里命中的概率。mAPmean Average Precision則是對(duì)所有query的檢索精度做一個(gè)綜合評(píng)估它同時(shí)考慮正確目標(biāo)在圖庫(kù)里的排序位置和整體檢索質(zhì)量。這里面的坑在于Rank-1高但mAP低說(shuō)明模型“碰巧把正確目標(biāo)排到了第一位”但圖庫(kù)里其他正確目標(biāo)排得很靠后Rank-1低但mAP高說(shuō)明模型雖然很少把正確目標(biāo)放第一位但正確目標(biāo)的整體排序比較靠前只是第一名被某個(gè)干擾項(xiàng)搶走了。在實(shí)際落地時(shí)mAP往往比Rank-1更有參考價(jià)值因?yàn)檎鎸?shí)場(chǎng)景的gallery非常大你關(guān)注的是所有目標(biāo)是否都排在靠前的位置而不僅僅是第一個(gè)。另外還有一個(gè)細(xì)節(jié)評(píng)測(cè)時(shí)用single query還是multi query結(jié)果差異很大。multi query是對(duì)同一個(gè)行人的多張查詢(xún)圖特征取平均后再檢索Rank-1通常能比single query高2到4個(gè)百分點(diǎn)。論文里為了對(duì)比公平都會(huì)說(shuō)明自己的評(píng)測(cè)協(xié)議但讀的時(shí)候一定要看清楚否則橫向?qū)Ρ葦?shù)字沒(méi)有意義。我自己復(fù)現(xiàn)論文時(shí)吃過(guò)這個(gè)虧看到某篇論文效果特別好仔細(xì)一看人家用了multi query自己用的是single query白高興一場(chǎng)。2. 從手工特征到深度學(xué)習(xí)一條清晰的演進(jìn)線2.1 早期手工特征階段顏色直方圖和LOMO在深度學(xué)習(xí)成為主流之前行人重識(shí)別基本是手工特征度量學(xué)習(xí)的天下。那時(shí)候的思路是先設(shè)計(jì)一個(gè)描述子比如顏色直方圖、紋理特征、LOMO特征等然后用度量學(xué)習(xí)方法如KISSME、XQDA來(lái)學(xué)習(xí)一個(gè)距離函數(shù)使得同一身份的特征距離近、不同身份的特征距離遠(yuǎn)。當(dāng)時(shí)最有代表性的應(yīng)該是LOMOLocal Maximal Occurrence特征它通過(guò)對(duì)局部區(qū)域做最大出現(xiàn)概率統(tǒng)計(jì)來(lái)應(yīng)對(duì)跨視角下外觀變化的問(wèn)題。這類(lèi)方法在當(dāng)時(shí)的CUHK03、VIPeR等數(shù)據(jù)集上效果還行但有個(gè)致命問(wèn)題手工特征對(duì)復(fù)雜場(chǎng)景的適應(yīng)性很差換一個(gè)場(chǎng)景就得重新調(diào)特征和度量函數(shù)泛化能力跟不上實(shí)際需求。盡管現(xiàn)在很少人再去手工設(shè)計(jì)特征了但這段歷史還是值得理解的。因?yàn)槎攘繉W(xué)習(xí)這個(gè)思路被深度學(xué)習(xí)完整繼承了下來(lái)——只是把“手工特征”換成了“網(wǎng)絡(luò)自動(dòng)學(xué)習(xí)的深度特征”。理解了這一點(diǎn)你再看后面的方法就會(huì)發(fā)現(xiàn)所有東西都是一脈相承的。2.2 深度學(xué)習(xí)的兩條主線表征學(xué)習(xí)與度量學(xué)習(xí)深度學(xué)習(xí)時(shí)代Person Re-ID方法大體可以分成兩派表征學(xué)習(xí)Representation Learning和度量學(xué)習(xí)Metric Learning。當(dāng)然現(xiàn)在的主流方法通常兩者混合用但理解這兩派各自的邏輯還是很有必要的。表征學(xué)習(xí)的核心做法是把Re-ID當(dāng)成分類(lèi)問(wèn)題來(lái)處理。具體來(lái)說(shuō)給每個(gè)訓(xùn)練身份分配一個(gè)類(lèi)別標(biāo)簽讓模型通過(guò)softmax分類(lèi)損失來(lái)學(xué)習(xí)特征提取器。訓(xùn)練結(jié)束后去掉最后的分類(lèi)層把倒數(shù)第二層的特征向量作為行人的描述子用于檢索。這種方法的優(yōu)點(diǎn)是訓(xùn)練穩(wěn)定、實(shí)現(xiàn)簡(jiǎn)單缺點(diǎn)是這樣學(xué)出來(lái)的特征并不天然具有“拉近同類(lèi)、推開(kāi)異類(lèi)”的結(jié)構(gòu)判別力上限有限。度量學(xué)習(xí)則直接對(duì)特征向量的距離建模。核心思想是讓同一個(gè)人的特征在歐氏空間里盡量靠近不同人的特征盡量遠(yuǎn)離。最經(jīng)典的當(dāng)屬Triplet Loss三元組損失它每次取三張圖anchor錨點(diǎn)、positive正樣本同身份、negative負(fù)樣本不同身份約束anchor與positive的距離加上一個(gè)余量后仍然小于anchor與negative的距離。早年用Triplet Loss訓(xùn)練Re-ID模型很流行但實(shí)際效果很依賴(lài)樣本挖掘策略如果隨機(jī)采三元組訓(xùn)練很容易停滯。現(xiàn)在工業(yè)界和學(xué)術(shù)界的主流做法基本是用ID Loss交叉熵保證模型能學(xué)到分類(lèi)級(jí)別的判別特征用Triplet Loss在特征層面做距離約束增強(qiáng)類(lèi)內(nèi)緊湊性和類(lèi)間可分性?xún)蓚€(gè)Loss加在一起聯(lián)合訓(xùn)練往往比單獨(dú)只用其中一個(gè)效果好很多。2.3 局部特征為什么能救場(chǎng)PCB與MGN全局特征做Re-ID有個(gè)天然弱點(diǎn)對(duì)遮擋和局部差異不敏感。舉個(gè)很簡(jiǎn)單的例子兩個(gè)人穿同款黑色上衣一個(gè)穿藍(lán)褲子一個(gè)穿白褲子如果只看全局特征模型很可能把它們判成一個(gè)人因?yàn)樯弦骂伾鲗?dǎo)了全局特征但如果模型能“注意到”褲子的顏色差異就能正確區(qū)分。于是就有了局部特征學(xué)習(xí)這一類(lèi)方法。最有代表性的當(dāng)屬PCBPart-based Convolutional Baseline和MGNMultiple Granularity Network。PCB的做法比較直接把整張?zhí)卣鲌D在水平方向切成若干條比如6條每條單獨(dú)做分類(lèi)損失訓(xùn)練時(shí)讓每條特征圖關(guān)注行人對(duì)應(yīng)的身體部位。因?yàn)樾腥巳碚胀ǔJ秦Q直的水平切條基本能對(duì)應(yīng)到頭、肩、上衣、下裝等區(qū)域。這樣做的好處是即便整體外觀相似模型也能通過(guò)局部區(qū)域的特征差異來(lái)區(qū)分不同身份。MGN則更進(jìn)一步用多個(gè)分支同時(shí)提取全局特征和不同粒度的局部特征再把它們拼接起來(lái)作為最終描述子。MGN在當(dāng)時(shí)把Market-1501的State-of-the-art提升了一大截我記得那時(shí)在多個(gè)數(shù)據(jù)集上都能明顯看出局部特征帶來(lái)的收益。不過(guò)局部特征方法也有它的煩人之處它依賴(lài)人體對(duì)齊。如果檢測(cè)框沒(méi)切好行人頭被截掉一半PCB切出來(lái)的“頭部分支”其實(shí)是一堆背景反而會(huì)干擾特征。這個(gè)問(wèn)題后來(lái)衍生出了姿態(tài)對(duì)齊、語(yǔ)義對(duì)齊等方向但始終沒(méi)有特別完美的解決方案。2.4 Transformer和注意力機(jī)制如何改寫(xiě)游戲規(guī)則ViT在圖像分類(lèi)上火了之后Re-ID領(lǐng)域很快跟進(jìn)。2021年出現(xiàn)的TransReID是比較標(biāo)志性的工作它把Vision Transformer引入行人重識(shí)別并且加了一個(gè)關(guān)鍵設(shè)計(jì)——SIESide Information Embedding把攝像頭ID、視角等輔助信息作為位置編碼的一部分注入網(wǎng)絡(luò)讓模型在提取特征時(shí)能感知到“這是幾號(hào)攝像頭拍到的”。為什么Transformer對(duì)Re-ID有效我的理解是Re-ID需要的特征既要關(guān)注全局又要感知細(xì)節(jié)而Transformer的自注意力機(jī)制天然可以建模長(zhǎng)距離依賴(lài)讓特征圖上的每個(gè)位置都能和整個(gè)圖像的其他位置建立聯(lián)系。相比于CNN有限的感受野Transformer能更好地捕捉到“這個(gè)人的紅色上衣配黑色背包”這種跨區(qū)域的全局組合特征。后來(lái)出現(xiàn)的跨窗口自注意力等結(jié)構(gòu)本質(zhì)上都是在解決注意力計(jì)算效率和局部建模能力之間的平衡問(wèn)題。這類(lèi)結(jié)構(gòu)在Re-ID任務(wù)里表現(xiàn)也不錯(cuò)尤其是在分辨率較高、目標(biāo)占比偏大的數(shù)據(jù)集上。這里還想多說(shuō)一句Transformer模型雖然在精度上確實(shí)能壓CNN一頭但隨之而來(lái)的是顯存占用高、訓(xùn)練收斂慢、推理速度慢。我在實(shí)際項(xiàng)目里對(duì)比過(guò)同樣的數(shù)據(jù)下ResNet50和ViT-B的推理延遲后者基本都是前者的3到5倍。所以做落地項(xiàng)目時(shí)到底選CNN還是Transformer得看算力預(yù)算和幀率要求不能盲目追新。3. 訓(xùn)練一個(gè)可用Re-ID模型的工程細(xì)節(jié)3.1 數(shù)據(jù)集準(zhǔn)備與預(yù)處理別在源頭埋雷學(xué)術(shù)界最常用的三個(gè)數(shù)據(jù)集是Market-1501、DukeMTMC-reID和MSMT17。我之前踩過(guò)一個(gè)大坑DukeMTMC-reID因?yàn)樵家曨l中出現(xiàn)了真實(shí)行人隱私信息已經(jīng)被原作者要求撤回了但網(wǎng)上各種第三方鏈接滿天飛很多教程還在推薦下載。這里給個(gè)提醒如果是從學(xué)術(shù)角度復(fù)現(xiàn)論文用Market-1501和MSMT17足夠如果是從合規(guī)出發(fā)自己測(cè)試最好使用脫敏數(shù)據(jù)或自行采集的數(shù)據(jù)集。數(shù)據(jù)集準(zhǔn)備好之后預(yù)處理里最容易出問(wèn)題的是行人檢測(cè)框的質(zhì)量。Re-ID評(píng)測(cè)時(shí)通常給的是“已經(jīng)裁剪好的行人框”但這個(gè)框可能不居中、可能包含大量背景、甚至可能只有半個(gè)人。我在項(xiàng)目里測(cè)試過(guò)一個(gè)簡(jiǎn)單但高效的預(yù)處理對(duì)裁剪后的圖像先做一次邊緣檢測(cè)或者輪廓分析去掉占比過(guò)大的純背景區(qū)域。雖然不能根治檢測(cè)框不準(zhǔn)的問(wèn)題但能減少一部分訓(xùn)練噪聲。另外注意圖像尺寸的一致性。不同數(shù)據(jù)集的圖像尺寸差異很大Market-1501主要是256x128MSMT17則是更高分辨率。如果混著訓(xùn)練需要統(tǒng)一resize策略。我習(xí)慣用短邊對(duì)齊然后中心裁剪的流程但Re-ID領(lǐng)域里大多數(shù)方法還是直接整圖resize到固定尺寸比如256x128或者384x192。這個(gè)選擇會(huì)影響模型效果和顯存占用需要根據(jù)實(shí)際任務(wù)權(quán)衡。3.2 損失函數(shù)組合與BNNeck精度提升的關(guān)鍵配置訓(xùn)練Re-ID模型時(shí)損失函數(shù)的組合方式直接決定最終效果。我在實(shí)驗(yàn)里試過(guò)很多組合比較穩(wěn)定且效果好的配方是ID Loss交叉熵 Triplet Loss同時(shí)配合BNNeck結(jié)構(gòu)。先解釋一下BNNeck為什么有效。早期方法直接讓同一個(gè)特征向量同時(shí)做softmax分類(lèi)和三元組距離約束這兩個(gè)目標(biāo)在優(yōu)化方向上是有沖突的——softmax分類(lèi)希望特征在類(lèi)別中心周?chē)蹟n三元組損失希望特征在歐氏空間里拉開(kāi)距離。BNNeck的做法是在特征向量進(jìn)入分類(lèi)層之前單獨(dú)加一個(gè)BatchNorm層把用于分類(lèi)的特征和用于距離計(jì)算的特征解耦開(kāi)。這樣分類(lèi)分支和度量分支各管各的訓(xùn)練更穩(wěn)定收斂后的精度也會(huì)更高。我實(shí)測(cè)過(guò)加上BNNeck之后在Market-1501上mAP能提升2到3個(gè)百分點(diǎn)屬于性?xún)r(jià)比極高的改動(dòng)。損失函數(shù)的權(quán)重也值得細(xì)調(diào)。我常用的比例是ID Loss權(quán)重1.0Triplet Loss權(quán)重1.0初始學(xué)習(xí)率3.5e-4。但如果數(shù)據(jù)集比較小、身份數(shù)量少可以適當(dāng)增大Triplet Loss權(quán)重到1.5甚至2.0能增強(qiáng)特征空間的度量結(jié)構(gòu)。另外近年有一些新Loss比如Circle Loss把softmax和triplet統(tǒng)一到了一個(gè)框架里效果在某些場(chǎng)景確實(shí)更好。但從工程穩(wěn)定性的角度來(lái)說(shuō)我還是建議先把ID LossTriplet這套基礎(chǔ)組合調(diào)好再考慮替換成其他損失。3.3 數(shù)據(jù)增強(qiáng)隨機(jī)擦除是性?xún)r(jià)比之王Re-ID的數(shù)據(jù)增強(qiáng)里最有用的我認(rèn)為是Random Erasing隨機(jī)擦除。它的做法是隨機(jī)選圖像中的一塊矩形區(qū)域用隨機(jī)像素填充模擬身體部位被遮擋的情況。這個(gè)增強(qiáng)手段幾乎零成本但能讓模型學(xué)會(huì)在部分區(qū)域缺失時(shí)仍然正確識(shí)別行人對(duì)遮擋場(chǎng)景的泛化能力提升非常明顯。另一個(gè)實(shí)用的增強(qiáng)是Random Horizontal Flip隨機(jī)水平翻轉(zhuǎn)。行人重識(shí)別不像人臉識(shí)別那么依賴(lài)左右對(duì)稱(chēng)性水平翻轉(zhuǎn)不會(huì)破壞身份信息還能有效擴(kuò)充數(shù)據(jù)量。我在訓(xùn)練時(shí)基本都會(huì)開(kāi)。至于AutoAugment、RandAugment這類(lèi)復(fù)雜的圖像增強(qiáng)策略在Re-ID上的收益沒(méi)有那么明確。顏色抖動(dòng)ColorJitter需要謹(jǐn)慎使用因?yàn)樾腥送庥^的顏色本身就是重要的識(shí)別線索過(guò)度調(diào)整顏色分布會(huì)誤導(dǎo)模型。我一般只做輕微的亮度、對(duì)比度擾動(dòng)飽和度和色相不動(dòng)??缬蚍夯矫嬖缒暧腥擞肎AN生成不同風(fēng)格的行人圖像來(lái)做風(fēng)格遷移數(shù)據(jù)增強(qiáng)比如把Market-1501的圖像轉(zhuǎn)換成DukeMTMC的風(fēng)格再參與訓(xùn)練。這種方法確實(shí)能提升跨域性能但訓(xùn)練復(fù)雜度高、不穩(wěn)定現(xiàn)在的主流方案更傾向于用域適應(yīng)方法解決這部分后面再說(shuō)。3.4 訓(xùn)練策略預(yù)熱、余弦退火與多卡同步BN模型訓(xùn)練時(shí)優(yōu)化策略的細(xì)節(jié)往往比網(wǎng)絡(luò)結(jié)構(gòu)更能影響最終結(jié)果。我用的是Adam優(yōu)化器初始學(xué)習(xí)率3.5e-4配合Warmup策略——前10個(gè)epoch讓學(xué)習(xí)率從小往大線性爬升避免模型在開(kāi)局階段因?yàn)檫^(guò)大的學(xué)習(xí)率導(dǎo)致震蕩。學(xué)習(xí)率調(diào)度方面余弦退火Cosine Annealing在Re-ID上的表現(xiàn)很穩(wěn)定。我習(xí)慣訓(xùn)練60個(gè)epoch前10個(gè)epoch warmup之后按余弦退火衰減到極小值。這個(gè)配置在Market-1501上能穩(wěn)定收斂在MSMT17上也沒(méi)有出現(xiàn)嚴(yán)重的過(guò)擬合。多卡訓(xùn)練時(shí)BatchNorm層的同步問(wèn)題要特別注意。Re-ID模型通常依賴(lài)較大的Batch Size比如64或128來(lái)保證Triplet Loss里有足夠的樣本組合。如果單卡顯存不夠很多人會(huì)減小Batch Size到32甚至16本地驗(yàn)證時(shí)損失函數(shù)也能降下去但實(shí)際檢索效果會(huì)明顯變差。這主要是因?yàn)锽atchNorm的統(tǒng)計(jì)量在小Batch上不穩(wěn)定。解決方案是使用多卡同步BNSyncBN讓所有卡上的數(shù)據(jù)一起統(tǒng)計(jì)均值和方差如果只有一張卡就盡量保持Batch Size在64以上犧牲分辨率也要保住Batch Size。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 訓(xùn)練Loss降了但指標(biāo)不漲問(wèn)題出在哪這是Re-ID里最讓人崩潰的情況看著訓(xùn)練損失不斷下降Rank-1和mAP卻紋絲不動(dòng)。我遇到的這類(lèi)問(wèn)題大概有三種原因。第一種是學(xué)習(xí)率設(shè)置不合理。Re-ID對(duì)學(xué)習(xí)率非常敏感如果學(xué)習(xí)率太大模型會(huì)在特征空間里反復(fù)橫跳看似損失很低但學(xué)到的特征判別性很差。一個(gè)很容易被忽略的點(diǎn)是預(yù)訓(xùn)練模型的Backbone和新增的分類(lèi)頭需要不同的學(xué)習(xí)率——我通常把Backbone的學(xué)習(xí)率設(shè)為分類(lèi)頭的十分之一這樣既能保留預(yù)訓(xùn)練特征的泛化能力又能讓新頭快速收斂。第二種是Batch內(nèi)沒(méi)有足夠的難例。Triplet Loss的威力很大程度來(lái)自hard negative mining如果一個(gè)Batch里全是比較容易區(qū)分的樣本三元組損失很快就趨近于零模型就失去了繼續(xù)優(yōu)化的信號(hào)。我在訓(xùn)練時(shí)習(xí)慣讓每個(gè)Batch包含盡量多的不同身份比如Batch Size為64時(shí)安排16個(gè)身份、每個(gè)身份4張圖這樣Triplet采樣時(shí)的難例比例會(huì)高很多。第三種是訓(xùn)練集和評(píng)測(cè)集的預(yù)處理不一致。我犯過(guò)很低級(jí)的錯(cuò)誤訓(xùn)練時(shí)做了隨機(jī)擦除和水平翻轉(zhuǎn)但評(píng)測(cè)時(shí)忘了關(guān)掉隨機(jī)增強(qiáng)導(dǎo)致每個(gè)query的檢索結(jié)果不穩(wěn)定。后來(lái)我寫(xiě)腳本時(shí)把訓(xùn)練和推理的數(shù)據(jù)流程分開(kāi)封裝這類(lèi)問(wèn)題就再?zèng)]出現(xiàn)過(guò)。4.2 Rank-1高、mAP低說(shuō)明模型學(xué)偏了Rank-1高但mAP低的情況在跨域場(chǎng)景下特別常見(jiàn)。我用一組數(shù)據(jù)來(lái)說(shuō)明某次實(shí)驗(yàn)在Market-1501上Rank-1是91.2%mAP卻只有76.8%。粗看Rank-1已經(jīng)很不錯(cuò)了但mAP差了一截。這個(gè)現(xiàn)象說(shuō)明模型對(duì)“最容易匹配的那個(gè)正確目標(biāo)”把握得很好但對(duì)圖庫(kù)中其他正確目標(biāo)的排序能力不足。換句話說(shuō)模型可能只記住了這個(gè)人的強(qiáng)判別特征比如紅色上衣一旦某張圖里把紅色上衣遮住了模型就認(rèn)不出來(lái)了。這種情況我一般從兩個(gè)方向調(diào)。一是增強(qiáng)局部特征學(xué)習(xí)比如引入類(lèi)似PCB的水平切分讓模型關(guān)注到更多部位而不是單一主導(dǎo)特征。二是加強(qiáng)Triplet Loss的約束權(quán)重同時(shí)在采樣時(shí)提高難樣本的比例逼迫模型在更難的情況下也能拉近同類(lèi)距離。4.3 跨攝像頭泛化能力差怎么辦訓(xùn)練集和測(cè)試集來(lái)自不同攝像頭分布時(shí)性能斷崖式下跌是常見(jiàn)問(wèn)題。最簡(jiǎn)單有效的方法是做攝像頭層面的數(shù)據(jù)增強(qiáng)在訓(xùn)練時(shí)把同一行人不同攝像頭下的圖像混合到一個(gè)Batch里讓模型有機(jī)會(huì)學(xué)到“攝像頭無(wú)關(guān)”的特征。這比直接在全局做顏色歸一化要有效得多。更進(jìn)階的做法是攝像頭風(fēng)格遷移用CycleGAN或其他風(fēng)格遷移方法把圖像風(fēng)格在攝像頭之間轉(zhuǎn)換擴(kuò)大訓(xùn)練數(shù)據(jù)分布。不過(guò)這個(gè)方法訓(xùn)練成本高、不穩(wěn)定不建議在小團(tuán)隊(duì)里從零復(fù)現(xiàn)。工業(yè)界目前在無(wú)監(jiān)督域適應(yīng)UDA方向有不少工作最簡(jiǎn)單的entry-level方案是先用源域數(shù)據(jù)訓(xùn)練一個(gè)初始模型再用偽標(biāo)簽對(duì)目標(biāo)域數(shù)據(jù)進(jìn)行自訓(xùn)練迭代效果就能比直接遷移好不少。4.4 模型落地時(shí)的算力與推理速度問(wèn)題論文里大家比的都是mAP、Rank-1這些精度指標(biāo)但真實(shí)項(xiàng)目中推理延遲和存儲(chǔ)占用同樣關(guān)鍵。一個(gè)人流量大的園區(qū)可能有幾千路攝像頭每路每秒25幀即使5秒取一幀做人臉檢測(cè)Re-ID也需要系統(tǒng)單機(jī)扛住很大的并發(fā)。我見(jiàn)過(guò)不少團(tuán)隊(duì)在精度上摳得很細(xì)但模型落地時(shí)發(fā)現(xiàn)GPU扛不住或者延遲超標(biāo)最后只能換更輕量的模型。Re-ID模型常用的輕量化方案有用MobileNetV3或EfficientNet-Lite替換ResNet50作為Backbone對(duì)特征向量做PCA降維或者Product Quantization壓縮用更短的向量做檢索在gallery端建立倒排索引先粗排再精排減少距離計(jì)算的次數(shù)。這一套組合拳下來(lái)能把單路推理延遲從幾十毫秒壓到個(gè)位數(shù)毫秒同時(shí)精度損失控制在2%以?xún)?nèi)。另外還要強(qiáng)調(diào)一下存儲(chǔ)。Parking園區(qū)百萬(wàn)級(jí)gallery特征每個(gè)特征2048維float32大約需要8GB內(nèi)存。如果做分布式部署需要提前規(guī)劃好特征庫(kù)的存儲(chǔ)方案和更新策略。這些工程問(wèn)題看起來(lái)不“學(xué)術(shù)”但在實(shí)際項(xiàng)目中往往決定模型能否真正跑起來(lái)。4.5 常見(jiàn)問(wèn)題速查表現(xiàn)象可能原因解決方法Loss不降或降得極慢學(xué)習(xí)率太大/太小或數(shù)據(jù)沒(méi)做歸一化使用warmup策略從3e-4左右起步檢查圖像歸一化參數(shù)Rank-1正常但mAP很低模型只學(xué)到全局主導(dǎo)特征引入局部特征分支增強(qiáng)Triplet Loss難樣本約束跨數(shù)據(jù)集泛化差域分布差異大攝像頭級(jí)數(shù)據(jù)增強(qiáng)、無(wú)監(jiān)督域適應(yīng)、偽標(biāo)簽自訓(xùn)練單卡顯存不足Batch Size太大或分辨率太高使用SyncBN多卡訓(xùn)練或降低分辨率保Batch Size推理延遲超標(biāo)模型過(guò)重、gallery過(guò)大輕量化Backbone、特征壓縮、倒排索引粗排相同代碼跑結(jié)果不一致隨機(jī)種子、數(shù)據(jù)加載順序、增強(qiáng)邏輯不同固定隨機(jī)種子評(píng)測(cè)時(shí)關(guān)閉隨機(jī)增強(qiáng)確定評(píng)測(cè)協(xié)議5. 數(shù)據(jù)集、評(píng)測(cè)基線與未來(lái)值得關(guān)注的方向5.1 三大多用數(shù)據(jù)集的“脾氣”各不相同做Re-ID實(shí)驗(yàn)繞不開(kāi)Market-1501、DukeMTMC-reID和MSMT17這三個(gè)數(shù)據(jù)集。它們的規(guī)模和難度差異很大不看數(shù)據(jù)直接對(duì)比論文指標(biāo)是很多新手會(huì)犯的錯(cuò)誤。Market-1501是最常用的入門(mén)數(shù)據(jù)集751個(gè)訓(xùn)練身份、750個(gè)測(cè)試身份總共約3.2萬(wàn)張圖像。它是在清華大學(xué)校園內(nèi)用6個(gè)攝像頭采集的包含室外和室內(nèi)場(chǎng)景。圖像分辨率較低很多都是100x50左右的小目標(biāo)但因?yàn)槭窃缙跀?shù)據(jù)集場(chǎng)景相對(duì)單一目前SOTA模型的Rank-1已經(jīng)能到95%以上mAP到90%以上。DukeMTMC-reID來(lái)自杜克大學(xué)校園8個(gè)攝像頭收錄了超過(guò)1400個(gè)身份的3.6萬(wàn)張圖像。它的難度比Market-1501更高主要因?yàn)閿z像頭視角變化大、光照不均衡。由于隱私問(wèn)題數(shù)據(jù)集已經(jīng)撤回但論文下載還能找到只是不建議新項(xiàng)目再基于它做開(kāi)發(fā)。MSMT17是目前學(xué)術(shù)界公認(rèn)最難的數(shù)據(jù)集之一它采集自北京大學(xué)校園包含15個(gè)攝像頭、4101個(gè)身份、超過(guò)12萬(wàn)張圖像覆蓋不同時(shí)段和各種天氣。在MSMT17上很多在Market-1501上表現(xiàn)很好的模型性能會(huì)掉一大截所以它是檢驗(yàn)?zāi)P汪敯粜缘摹霸嚱鹗?。如果你新想出?lái)的方法在MSMT17上也能有比較大的提升那基本是真正的進(jìn)步而不只是過(guò)擬合了某個(gè)數(shù)據(jù)分布。5.2 無(wú)監(jiān)督域適應(yīng)、大模型與CLIP ReID無(wú)監(jiān)督域適應(yīng)UDA是我認(rèn)為最貼近工業(yè)實(shí)際的方向之一因?yàn)樗鉀Q的是“沒(méi)有目標(biāo)域標(biāo)注”的痛點(diǎn)。在真實(shí)場(chǎng)景里新建一個(gè)園區(qū)不可能花幾個(gè)月去標(biāo)注行人IDUDA希望能用已有標(biāo)注的源域數(shù)據(jù)和大量無(wú)標(biāo)注的目標(biāo)域數(shù)據(jù)訓(xùn)練出在目標(biāo)域上也能用的模型。早期UDA方法主要靠風(fēng)格遷移和偽標(biāo)簽。近兩年的主流是做聚類(lèi)偽標(biāo)簽迭代訓(xùn)練用源域訓(xùn)練的模型給目標(biāo)域圖像提特征聚類(lèi)后分配偽標(biāo)簽再用這些帶噪標(biāo)簽來(lái)訓(xùn)練模型。這個(gè)流程的挑戰(zhàn)在于偽標(biāo)簽中存在大量噪聲如何設(shè)計(jì)不確定性感知的損失函數(shù)、如何設(shè)計(jì)聚類(lèi)策略是UDA Re-ID的核心難點(diǎn)。大模型對(duì)Re-ID的影響也不容小覷。CLIP ReID這類(lèi)方法利用圖文預(yù)訓(xùn)練模型把行人圖像和對(duì)應(yīng)的語(yǔ)義描述對(duì)齊在zero-shot場(chǎng)景下也能達(dá)到不錯(cuò)的檢索性能。目前這個(gè)方向還在快速發(fā)展但距離真正工業(yè)落地還有距離主要問(wèn)題在于大模型的計(jì)算開(kāi)銷(xiāo)和跨域泛化能力。5.3 可落地方向視頻Re-ID與跨模態(tài)Re-ID再說(shuō)兩個(gè)在工業(yè)界可能更有價(jià)值的方向。視頻Re-ID利用一個(gè)行人在同一攝像頭下連續(xù)多幀的信息來(lái)判斷身份。跟單幀圖像相比視頻包含更多姿態(tài)變換和時(shí)序信息能有效提升在遮擋、模糊場(chǎng)景下的魯棒性。代價(jià)是推理時(shí)需要維護(hù)一個(gè)時(shí)序緩存系統(tǒng)復(fù)雜度會(huì)上升。在需要實(shí)時(shí)處理的場(chǎng)景里我建議用“關(guān)鍵幀抽取時(shí)序特征聚合”的輕量級(jí)方案而不是把視頻直接喂給3D卷積網(wǎng)絡(luò)??缒B(tài)Re-ID目前最受關(guān)注的是可見(jiàn)光-紅外Re-IDRGB-IR ReID用于夜間或者光照極差的環(huán)境。它的難點(diǎn)在于兩個(gè)模態(tài)之間的特征分布差異太大需要設(shè)計(jì)模態(tài)對(duì)齊模塊。這個(gè)方向在安防夜視場(chǎng)景下應(yīng)用前景很大但學(xué)術(shù)界的公開(kāi)數(shù)據(jù)集還比較有限距離大規(guī)模落地仍需時(shí)間。6. 從一個(gè)可行方案說(shuō)起從零訓(xùn)練一個(gè)可用的Re-ID模型最后分享一個(gè)我自己反復(fù)使用的基線方案——基于Torchreid框架訓(xùn)練一個(gè)ResNet50 ID Loss Triplet Loss的Re-ID模型。這套配置在網(wǎng)上有很多資料但真正能從頭到尾跑通且效果穩(wěn)定的教程其實(shí)不多。我用的訓(xùn)練配置大致如下。數(shù)據(jù)集放在data/market1501目錄下訓(xùn)練腳本的核心配置可以用YAML文件管理這樣能復(fù)現(xiàn)、好調(diào)參比把參數(shù)硬編碼在訓(xùn)練腳本里更方便。下面的配置文件是我在實(shí)際項(xiàng)目中驗(yàn)證過(guò)的版本# market1501_reid.yaml model: name: resnet50 pretrained: true last_stride: 1 neck: bnneck neck_feat: after data: type: image root: data sources: [market1501] targets: [market1501] height: 256 width: 128 norm_mean: [0.485, 0.456, 0.406] norm_std: [0.229, 0.224, 0.225] transforms: [random_flip, random_erase] optimizer: name: adam lr: 0.00035 weight_decay: 0.0005 bias_lr_factor: 2.0 lr_scheduler: name: warmup_multi_step stepsize: [40, 55] warmup_epochs: 10 train: batch_size: 64 num_instances: 4 epochs: 60 eval_freq: 10 start_epoch: 0 seed: 1 sampler: type: pk loss: name: [triplet, id] triplet: margin: 0.3 weight_t: 1.0 id: weight_x: 1.0 test: evaluator: [CMC_mAP] batch_size: 128 eval_freq: 10 re_rank: false訓(xùn)練時(shí)直接執(zhí)行python scripts/main.py \ --config-file market1501_reid.yaml \ --transforms random_flip random_erase \ --root data如果顯存有限Batch Size調(diào)到32但我會(huì)把每個(gè)ID采樣的圖片數(shù)從4降到2這樣能盡量保證Batch里每個(gè)身份都有足夠的樣本。還需要注意的是num_instances這個(gè)參數(shù)直接影響Triplet Loss的采樣難度它表示每個(gè)身份在一個(gè)Batch里采樣多少?gòu)垐D。num_instances4時(shí)意味著一個(gè)Batch里有16個(gè)身份、每個(gè)身份4張圖這樣Triplet Loss能挖到更難的負(fù)樣本。訓(xùn)練完成后推理階段可以加載訓(xùn)練好的權(quán)重去掉分類(lèi)層用BackboneBNNeck得到特征。實(shí)測(cè)下來(lái)這個(gè)基線在Market-1501的single query協(xié)議下Rank-1約91%mAP約81%如果加上Re-ranking后處理mAP還能再漲4到5個(gè)點(diǎn)。這里也提醒一句Re-ranking雖然能提升評(píng)測(cè)指標(biāo)但會(huì)引入額外的計(jì)算開(kāi)銷(xiāo)和依賴(lài)在大規(guī)模實(shí)時(shí)檢索場(chǎng)景里慎用。7. 最后再分享一點(diǎn)實(shí)驗(yàn)習(xí)慣做Re-ID實(shí)驗(yàn)這幾年我最大的體會(huì)是精度指標(biāo)的提升固然重要但真正決定模型能不能落地的往往是那些論文里不怎么提的工程細(xì)節(jié)。從數(shù)據(jù)配比、損失權(quán)重、學(xué)習(xí)率策略到數(shù)據(jù)增強(qiáng)的開(kāi)關(guān)每一個(gè)環(huán)節(jié)都值得單獨(dú)做對(duì)照實(shí)驗(yàn)而不是一股腦堆上去再猜結(jié)果。另一個(gè)容易被忽視的點(diǎn)是評(píng)測(cè)代碼的正確性。Re-ID評(píng)測(cè)里有一個(gè)經(jīng)典陷阱gallery中如果包含query本身的圖像模型會(huì)“作弊”一樣把這張圖排在第一位導(dǎo)致指標(biāo)虛高。Market-1501官方評(píng)測(cè)協(xié)議里已經(jīng)把這種“同源query”排除了但很多第三方實(shí)現(xiàn)沒(méi)有處理好直接對(duì)比結(jié)果就會(huì)失真。我自己習(xí)慣在跑完評(píng)測(cè)后手動(dòng)檢查幾個(gè)query的Top-10輸出看看有沒(méi)有出現(xiàn)“自己匹配自己”這種低級(jí)問(wèn)題。如果你剛?cè)腴T(mén)Re-ID我建議先花兩周時(shí)間跑通一個(gè)Baseline而不是一上來(lái)就啃最新的Transformer論文。先把數(shù)據(jù)流程、評(píng)測(cè)協(xié)議、損失函數(shù)這幾塊地基打牢后面換模型、改進(jìn)方法都會(huì)快很多。這個(gè)領(lǐng)域坑不少但只要基礎(chǔ)扎實(shí)很多所謂“玄學(xué)調(diào)參”其實(shí)都有清晰的邏輯可以解釋。