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