全面解析:從原理到數(shù)據(jù)集下載與訓(xùn)練實(shí)戰(zhàn))
平時(shí)跑跨攝像頭檢索任務(wù)的時(shí)候經(jīng)常有人問我“行人重識別Re-ID到底是什么和普通的目標(biāo)檢測、人臉識別有啥區(qū)別數(shù)據(jù)集到底去哪下載”今天干脆把這些內(nèi)容一次講透。我會從問題定義、技術(shù)演進(jìn)、研究現(xiàn)狀講到數(shù)據(jù)集獲取和訓(xùn)練踩坑全程按我實(shí)際做項(xiàng)目時(shí)的經(jīng)驗(yàn)來寫不堆名詞只說能用得上的東西。1. 行人重識別到底在解決什么問題定義拆解與業(yè)務(wù)場景1.1 Re-ID的問題定義與形式化表達(dá)行人重識別英文全稱是Person Re-identification業(yè)內(nèi)一般直接寫Re-ID。它的核心任務(wù)是給定一張查詢圖像query在跨攝像頭、跨時(shí)間段的候選圖像庫gallery中檢索出所有包含同一個(gè)人的圖片。形式化一點(diǎn)說訓(xùn)練時(shí)你有一批帶身份標(biāo)簽的行人圖像每個(gè)身份在多個(gè)攝像頭下面都有若干張圖。模型要學(xué)習(xí)一個(gè)特征提取器把“不同攝像頭下同一個(gè)人的差異”類內(nèi)差異壓縮同時(shí)放大“不同人之間的差異”類間差異。推理階段把query和gallery里的每張圖都提取成特征向量算相似度余弦距離或歐氏距離按相似度排序返回最靠前的結(jié)果。這和人臉識別最本質(zhì)的區(qū)別在于人臉識別假設(shè)人臉區(qū)域是清晰的、正面的、光照可控的而Re-ID面對的是低分辨率、大角度變化、嚴(yán)重遮擋、光照劇烈變化的全身圖像。換句話說人臉識別靠的是穩(wěn)定的生物特征Re-ID更多靠的是衣服、體型、背包、發(fā)型這些外觀屬性所以一旦目標(biāo)換衣服跨域性能往往會掉得很厲害。這也是Re-ID領(lǐng)域長期以來的痛點(diǎn)和研究熱點(diǎn)。1.2 真實(shí)業(yè)務(wù)場景我為什么關(guān)注Re-IDRe-ID并不是實(shí)驗(yàn)室自嗨的方向?qū)嶋H業(yè)務(wù)里需求非常大。我在安防項(xiàng)目里最常遇到的場景是一個(gè)走失老人出現(xiàn)在某個(gè)路口監(jiān)控畫面里需要檢索他在過去24小時(shí)內(nèi)出現(xiàn)在周邊20個(gè)攝像頭下的所有軌跡。商場里顧客A在門店拿走了商品沒付款需要從整個(gè)商場的幾百路攝像頭里找到他離開的路徑。展會、機(jī)場、火車站這種人流密集場景需要追蹤一個(gè)人在不同登機(jī)口、安檢口之間的移動(dòng)過程。這些場景如果靠人眼一小時(shí)一小時(shí)翻錄像效率極低。而Re-ID算法可以先自動(dòng)搜索出候選結(jié)果再由人工二次確認(rèn)能把幾十個(gè)小時(shí)的排查壓縮到幾分鐘。不過有一點(diǎn)需要提醒Re-ID目前更適合做“輔助檢索”而不是“絕對身份確認(rèn)”。尤其是換裝、跨天、跨場景的情況下直接拿Re-ID結(jié)果當(dāng)確證證據(jù)風(fēng)險(xiǎn)很高。正規(guī)的落地流程一般是Re-ID粗篩候選人工或者人臉識別做最終確認(rèn)。1.3 與普通圖像檢索和人臉識別的區(qū)別很多初學(xué)者會把Re-ID和圖像檢索、人臉識別混在一起這里我做個(gè)簡明的對比任務(wù)類型輸入形式核心難點(diǎn)常用手段圖像檢索任意物體/場景狗、建筑、商品語義相似但真實(shí)類別不同通用表征學(xué)習(xí)、多模態(tài)匹配人臉識別人臉裁剪圖正面/側(cè)面、年齡變化、光照人臉關(guān)鍵點(diǎn)對齊、大間隔分類行人重識別全身行人圖像跨攝像頭、換裝、遮擋、低分辨率ID分類度量學(xué)習(xí)、局部特征理解這個(gè)區(qū)別很重要因?yàn)镽e-ID算法設(shè)計(jì)時(shí)很多技巧都是針對“全身圖像跨攝像頭”這個(gè)特定場景的。比如局部特征建模就是考慮到行人圖像有非常強(qiáng)的結(jié)構(gòu)化先驗(yàn)頭、上身、下身這是通用圖像檢索不會特別關(guān)注的。2. Re-ID技術(shù)演變從手工特征到Transformer的路線圖2.1 早期的手工特征時(shí)代與詞語袋思路2015年之前Re-ID的主流做法是手工設(shè)計(jì)特征再配合距離度量學(xué)習(xí)。比較有代表性的特征有顏色直方圖、顏色命名Color Names利用HSV、Lab等顏色空間統(tǒng)計(jì)行人外觀顏色分布。紋理特征如LBP局部二值模式、Gabor濾波器用于刻畫衣服紋路。最典型的流程是用詞語袋模型Bag of WordsBoW把行人圖像表示成特征向量然后再學(xué)一個(gè)度量。度量學(xué)習(xí)這一步在早期比特征本身還關(guān)鍵。常見的有KISSMEKeep It Simple and Straightforward Metric Learning、XQDACross-view Quadratic Discriminant Analysis。這些方法在Market1501上的Rank-1大概只有40%~55%放到今天的標(biāo)準(zhǔn)看確實(shí)不高但思路很值得了解——先提取局部描述子再通過統(tǒng)計(jì)學(xué)習(xí)得到距離函數(shù)這個(gè)“特征抽取度量學(xué)習(xí)”的兩段式框架和現(xiàn)在的深度學(xué)習(xí)方法本質(zhì)上是一個(gè)套路只是特征抽取器從手工模板換成了CNN。2.2 表征學(xué)習(xí)時(shí)代用分類訓(xùn)練得到一個(gè)“人形特征提取器”2016年前后深度學(xué)習(xí)開始統(tǒng)治Re-ID。當(dāng)時(shí)最直接的做法是把Re-ID當(dāng)成圖像分類任務(wù)來訓(xùn)練用ImageNet預(yù)訓(xùn)練的ResNet50作為backbone在行人訓(xùn)練集上把最后的分類層改成N個(gè)身份的分類頭用交叉熵?fù)p失訓(xùn)練。訓(xùn)練完去掉分類層取倒數(shù)第二層或加了降維層之后的特征作為行人特征向量。這種做法大家稱之為表征學(xué)習(xí)Representation Learning。它的好處是復(fù)現(xiàn)簡單、訓(xùn)練穩(wěn)定。直到今天ID損失CrossEntropy Loss Triplet Loss聯(lián)合訓(xùn)練依然是Re-ID領(lǐng)域最穩(wěn)的baseline組合。不過只用分類損失會有一個(gè)問題分類任務(wù)只要求模型能把不同身份區(qū)分開并不直接保證“同一人的不同圖片在特征空間里距離足夠近”。所以后來大家開始引入度量損失讓訓(xùn)練目標(biāo)更貼近檢索任務(wù)本身。2.3 度量學(xué)習(xí)為什么是Re-ID的靈魂度量學(xué)習(xí)的目標(biāo)是構(gòu)造一個(gè)特征空間讓正樣本對同一人的不同圖距離近負(fù)樣本對不同人距離遠(yuǎn)。常用的損失函數(shù)包括Contrastive Loss對比損失給定一對樣本優(yōu)化目標(biāo)是最小化正對距離、最大化負(fù)對距離到某個(gè)margin之外。Triplet Loss三元組損失每次取錨點(diǎn)圖anchor、正樣本positive、負(fù)樣本negative各一張要求anchor到positive的距離加上margin小于anchor到negative的距離。Circle Loss對三元組損失做進(jìn)一步改進(jìn)對正負(fù)樣本分別做自適應(yīng)加權(quán)。三元組損失是Re-ID訓(xùn)練里最常用的但直接把所有三元組都拿來訓(xùn)練效率很低。實(shí)際操作中一般用困難樣本挖掘Hard Mining只取距離最近的負(fù)樣本和距離最遠(yuǎn)的正樣本參與梯度更新。這也是為什么很多Re-ID訓(xùn)練代碼里會專門實(shí)現(xiàn)一個(gè)“HardExampleMiner”的原因。這里有一點(diǎn)要注意分類損失和度量損失解決的是不同層面的問題。分類損失幫助模型快速收斂到合理的特征空間度量損失在局部上“拉近同類、推開異類”兩者組合效果通常遠(yuǎn)好于只用其中任何一個(gè)。行業(yè)內(nèi)把這種組合叫“ID損失Triplet損失雙頭訓(xùn)練”。2.4 局部特征、注意力機(jī)制與Transformer時(shí)代的到來隨著ResNet特征越來越好研究者發(fā)現(xiàn)細(xì)分局部特征能進(jìn)一步提升效果尤其是在解決“不同人穿相似衣服”這種極端情況時(shí)。代表工作是PCBPart-based Convolutional Baseline把特征圖水平切成6塊每塊分別做一次分類最后拼接得到細(xì)粒度特征。MGNMulti-Granularity Network整合全局分支和多粒度局部分支進(jìn)一步提升精度。注意力機(jī)制如Relation Network、OSNet等用注意力讓模型更關(guān)注可辨識的區(qū)域比如背包、鞋子、發(fā)型。到了2021年之后Transformer架構(gòu)進(jìn)入Re-ID領(lǐng)域比較有代表性的工作是TransReID。它把行人圖像切成patch序列輸入ViT在分類token之外引入了兩個(gè)很關(guān)鍵的改進(jìn)一是Jigsaw Patch Module隨機(jī)打亂部分patch強(qiáng)迫模型學(xué)習(xí)全局輪廓而不只是局部拼接規(guī)律二是Side Information Embeddings把攝像頭編號、視角等信息編碼進(jìn)網(wǎng)絡(luò)緩解跨攝像頭特征漂移。另外還有個(gè)值得關(guān)注的方向是CLIP-ReID這一系列工作用大規(guī)模圖文預(yù)訓(xùn)練模型做行人檢索。和傳統(tǒng)的ImageNet預(yù)訓(xùn)練相比CLIP類模型學(xué)到了更強(qiáng)的語義先驗(yàn)換裝和遮擋魯棒性有明顯提升缺點(diǎn)是模型參數(shù)量大、訓(xùn)練開銷高落地時(shí)需要考慮算力成本。3. 研究現(xiàn)狀速覽通用數(shù)據(jù)集、關(guān)鍵評測指標(biāo)與當(dāng)下的主流難點(diǎn)3.1 學(xué)術(shù)界公認(rèn)的Re-ID基準(zhǔn)數(shù)據(jù)集既然要深入這個(gè)方向數(shù)據(jù)集是繞不開的。我在下面的表格里整理了目前學(xué)術(shù)界最常用的幾個(gè)行人重識別數(shù)據(jù)集這些也是你在讀論文、復(fù)現(xiàn)實(shí)驗(yàn)時(shí)出現(xiàn)頻率最高的。數(shù)據(jù)集名稱發(fā)布時(shí)間身份數(shù)量圖像數(shù)量攝像頭數(shù)量特點(diǎn)與使用提示VIPeR200763212642規(guī)模小每身份只有2張圖僅供早期算法快速驗(yàn)證Market150120151501326686入門首選標(biāo)注規(guī)整劃分方式社區(qū)統(tǒng)一CUHK0320141467131642同時(shí)提供手工標(biāo)注框和DPM檢測框注意新舊劃分協(xié)議DukeMTMC-reID20171812364118場景更復(fù)雜但原作者因隱私問題已要求停止使用MSMT172018410112644115數(shù)據(jù)量大、場景豐富最能反映真實(shí)監(jiān)控環(huán)境的表現(xiàn)目前新論文一般要求至少在Market1501和MSMT17兩個(gè)數(shù)據(jù)集上做實(shí)驗(yàn)因?yàn)榍罢呤恰叭腴T門檻”后者是“真實(shí)壓力測試”。很多老方法在Market1501上刷到95%的Rank-1已經(jīng)是極限但到了MSMT17上通常會掉到70%~85%之間這中間的差距正好反映了模型的泛化能力。3.2 Rank-1、mAP和CMC曲線到底怎么算Re-ID論文里密密麻麻都是指標(biāo)最常見的三個(gè)是Rank-1、mAP和CMC曲線。我用自己的話解釋一下Rank-1對于每個(gè)查詢圖像取相似度最高的那一張檢索結(jié)果。如果這張圖是正確目標(biāo)就算命中。所有查詢的命中率就是Rank-1。CMC曲線橫軸是Rank k即取前k個(gè)結(jié)果縱軸是命中率。Rank-1就是CMC曲線上k1的那一個(gè)點(diǎn)。mAPmean Average PrecisionRank-1只關(guān)心第一個(gè)結(jié)果對不對mAP則更嚴(yán)格它會統(tǒng)計(jì)檢索結(jié)果里所有正確目標(biāo)的排序位置。如果某個(gè)query在gallery里對應(yīng)了5張正確的圖理想的排序是這5張全部排在最前面那么AP1。所有query的AP平均就是mAP。mAP特別能反映“把所有目標(biāo)找全”的能力實(shí)際業(yè)務(wù)里往往比Rank-1更關(guān)鍵。因?yàn)橛脩艨唇Y(jié)果時(shí)通常不止看第一張而是看前10張里有沒有正確目標(biāo)mAP高意味著正確目標(biāo)整體排序靠前用戶翻幾頁就能找到。復(fù)現(xiàn)論文時(shí)我建議別只用Rank-1一個(gè)指標(biāo)。兩個(gè)不同方法可能在Rank-1上差距很小但mAP差好幾個(gè)點(diǎn)說明后者在完整檢索性能上更優(yōu)。論文對比表里如果只報(bào)Rank-1基本可以判斷作者要么沒跑全要么有意回避了弱勢指標(biāo)。3.3 當(dāng)前五大研究難點(diǎn)與主流對策拿2025年的視角回頭看Re-ID還沒有完全解決的熱點(diǎn)問題主要集中在以下五個(gè)方向第一跨域泛化Domain Generalization。在Market1501上訓(xùn)練好的模型直接放到MSMT17上測試性能通常會明顯下跌因?yàn)椴煌瑪?shù)據(jù)集的光照、攝像頭視角、人群密度差異太大。針對這個(gè)問題目前主流方案是域適應(yīng)Domain Adaptation和大模型預(yù)訓(xùn)練。域適應(yīng)通過偽標(biāo)簽、風(fēng)格遷移等方式讓源域模型適應(yīng)目標(biāo)域大模型預(yù)訓(xùn)練則是讓模型見過足夠多樣的圖像語義從而對域偏移不那么敏感。第二遮擋問題Occluded Re-ID。行人經(jīng)常被樹、車、其他行人遮擋全身只有部分可見。解決方法包括關(guān)鍵點(diǎn)引導(dǎo)的局部對齊、可見區(qū)域mask、生成對抗補(bǔ)全等。但老實(shí)說遮擋Re-ID目前還沒有一個(gè)通用且輕量的解決方案。第三換裝問題Cloth-Changing Re-ID。這是目前工業(yè)落地最頭疼的。人一旦換一件衣服基于外觀的特征基本失效。對應(yīng)方法有利用輪廓、步態(tài)、人體結(jié)構(gòu)等與衣服無關(guān)的特征以及利用CLIP這類語義模型的文本約束來提取身份級特征。第四跨模態(tài)檢索Visible-Infrared Re-ID。白天用可見光攝像頭晚上用紅外攝像頭這兩者的成像差異很大。研究者提出了雙流網(wǎng)絡(luò)、模態(tài)對齊等方法也配套發(fā)布了SYSU-MM01、RegDB等跨模態(tài)數(shù)據(jù)集。第五模型效率與實(shí)時(shí)性。很多先進(jìn)方法在GPU上可以跑到不錯(cuò)的指標(biāo)但到嵌入式設(shè)備或者單路實(shí)時(shí)檢索場景就會卡頓。輕量化網(wǎng)絡(luò)、特征量化和蒸餾是落地里最常聽到的三種手段。3.4 值得關(guān)注的新方向與工具庫如果你打算入門Re-ID或者找創(chuàng)新點(diǎn)我建議重點(diǎn)關(guān)注這幾個(gè)方向基于Transformer和Mamba架構(gòu)的行人檢索新模型針對長距離依賴和時(shí)序關(guān)系建模做文章。利用大語言模型/多模態(tài)大模型的語義先驗(yàn)做Re-ID比如用文本描述幫忙區(qū)分穿相似衣服的兩個(gè)人。生成式數(shù)據(jù)增強(qiáng)用擴(kuò)散模型生成更多視角、光照、遮擋情況的行人圖像擴(kuò)充訓(xùn)練集。分布外泛化評估框架不只是看單一數(shù)據(jù)集指標(biāo)而是構(gòu)建跨數(shù)據(jù)集benchmark考察模型的穩(wěn)定性。另外如果你想快速搭一套Re-ID模型做實(shí)驗(yàn)不用重復(fù)造輪子。目前開源生態(tài)里比較成熟的工具庫有TorchreidPython/PyTorch支持幾十篇論文的baseline、FastReID京東開源的Re-ID工具包工業(yè)級工程化做得好、OpenUnReID專門做無監(jiān)督/半監(jiān)督Re-ID和來自商湯的Person_REIN。初學(xué)者用Torchreid最多配置靈活、文檔清晰跑通整個(gè)訓(xùn)練評估流程大約只需要半天。4. Re-ID數(shù)據(jù)集下載全攻略渠道整理、目錄結(jié)構(gòu)與加載方法4.1 Market1501新手入門最推薦的數(shù)據(jù)集先說結(jié)論如果你是第一次做Re-ID實(shí)驗(yàn)先從Market1501開始。這是獲取渠道最規(guī)范、社區(qū)支持最好的數(shù)據(jù)集。官方頁面由作者鄭良博士維護(hù)原域名長期有效需要填一個(gè)簡單的申請表格說明使用目的一般會在幾個(gè)工作日內(nèi)收到下載鏈接。如果你覺得郵件申請麻煩也可以直接在GitHub上搜索“Market1501”很多復(fù)現(xiàn)倉庫會附帶百度網(wǎng)盤或Google Drive的分享鏈接注意核對文件指紋防止下載到壞檔。Market1501下載下來是解壓好的圖片目錄核心目錄結(jié)構(gòu)如下Market-1501-v15.09.15/ ├── bounding_box_train/ │ ├── 0002_c1s1_000451_03.jpg │ ├── 0002_c1s1_000551_01.jpg │ └── ... ├── bounding_box_test/ ├── query/ └── gt_query/文件名本身就有信息量我拆解一下前四位如0002是行人ID緊接著的c1s1表示來自攝像頭1在場景1下拍攝中間的000451是幀號最后一位數(shù)字是DPM檢測框序號其中-1表示該圖片是干擾負(fù)樣本也就是gallery里的背景誤檢圖計(jì)算mAP時(shí)需要處理。訓(xùn)練集和測試集已經(jīng)按官方要求劃分好了不需要自己額外split。唯一要注意的是有些版本還會多出gt_bbox、gt_query目錄推理評估一般用不到直接忽略即可。4.2 CUHK03、DukeMTMC-reID和MSMT17的獲取方式CUHK03由香港中文大學(xué)多媒體實(shí)驗(yàn)室發(fā)布。官方頁面提供了兩種版本一種使用人工標(biāo)注的行人框另一種使用DPM檢測器自動(dòng)得到的檢測框。復(fù)現(xiàn)不同論文時(shí)兩種版本的結(jié)果差異很大讀論文一定要看清它用的是哪一種。下載時(shí)還需要注意“新舊協(xié)議”的問題新協(xié)議New Protocol把數(shù)據(jù)集分成訓(xùn)練集和測試集且不再采用傳統(tǒng)的隨機(jī)劃分直接用固定劃分社區(qū)可復(fù)現(xiàn)性更高。DukeMTMC-reID這里我必須多說一句。原始數(shù)據(jù)集基于杜克大學(xué)校園監(jiān)控視頻制作后來因?yàn)樯婕皞€(gè)人隱私問題原作者已經(jīng)公開要求停止使用和下載網(wǎng)上還掛著的一些鏈接大多來自鏡像而非官方渠道。所以如果你是新論文盡量不要把DukeMTMC-reID作為唯一的主實(shí)驗(yàn)數(shù)據(jù)集以免后續(xù)審稿或復(fù)現(xiàn)時(shí)遇到數(shù)據(jù)合規(guī)問題。老論文里用它做對比沒什么問題但新工作再用它評審意見里很容易收到質(zhì)疑。MSMT17是北京大學(xué)發(fā)布的大規(guī)模數(shù)據(jù)集擁有15個(gè)攝像頭、4101個(gè)身份、12萬多張圖像是目前公開可下載的行人重識別數(shù)據(jù)集中挑戰(zhàn)性最高、覆蓋面最廣的之一。它的官方項(xiàng)目網(wǎng)站在北大視覺與媒體計(jì)算組名下申請時(shí)需要填寫使用協(xié)議。MSMT17下載后是一個(gè)壓縮包里面的圖片初始都在一個(gè)大目錄下需要通過官方提供的train_test_split本體txt文件來劃分訓(xùn)練、驗(yàn)證和測試集處理流程比Market1501稍繁瑣我在下一節(jié)給出具體代碼。4.3 下載渠道、校園網(wǎng)失敗與版權(quán)注意事項(xiàng)Re-ID數(shù)據(jù)集下載有幾個(gè)常見的“坑”我挨個(gè)提醒。第一個(gè)坑是校園網(wǎng)或某些網(wǎng)絡(luò)環(huán)境下訪問國外學(xué)術(shù)服務(wù)器很慢下載到一半就斷。建議優(yōu)先選擇支持?jǐn)帱c(diǎn)續(xù)傳的工具或者讓瀏覽器直接下載不要用某些下載器的多線程模式后者容易被服務(wù)器判定異常而封IP。第二個(gè)坑是有些網(wǎng)盤鏈接時(shí)效性很短博主掛出來的鏈接經(jīng)常失效。碰到這種情況我一般會去論文的GitHub官方倉庫里找issue如果有其他人也在找數(shù)據(jù)issue里大概率有人貼出新的可用鏈接。這是最靠譜的間接渠道。第三個(gè)坑是數(shù)據(jù)集版權(quán)。行人人臉和身份信息屬于個(gè)人隱私數(shù)據(jù)在研究用途內(nèi)使用一般沒有問題但商用必須逐條核對數(shù)據(jù)集的具體許可協(xié)議。尤其是DukeMTMC這類明確被作者撤回的數(shù)據(jù)集絕對不能用于任何商業(yè)項(xiàng)目。工業(yè)項(xiàng)目里如果無法獲取合規(guī)的公開數(shù)據(jù)我強(qiáng)烈建議自建數(shù)據(jù)采集和標(biāo)注流程不要抱僥幸心理。4.4 目錄整理與自定義Dataset加載代碼拿到數(shù)據(jù)集之后第一步不是急著訓(xùn)練而是先統(tǒng)一目錄格式。以Market1501為例官方目錄已經(jīng)規(guī)范直接喂給常見Re-ID訓(xùn)練框架即可。但如果用的是MSMT17這種大目錄結(jié)構(gòu)我給你寫一個(gè)簡單的劃分腳本把訓(xùn)練、驗(yàn)證和測試集文件整理到三個(gè)子目錄import os import shutil base_dir MSMT17_V1 # 原始目錄 output_dir MSMT17_reid split_file os.path.join(base_dir, list_train.txt) # 官方劃分文件 image_dir os.path.join(base_dir, images) def copy_images(file_list, target): os.makedirs(target, exist_okTrue) with open(file_list, r) as f: lines f.readlines() for line in lines: pid_info, path line.strip().split( ) # 文件里每行是“路徑 身份文件夾名” img_path os.path.join(image_dir, path) if os.path.exists(img_path): shutil.copy(img_path, target) copy_images(os.path.join(base_dir, list_train.txt), os.path.join(output_dir, bounding_box_train)) copy_images(os.path.join(base_dir, list_val.txt), os.path.join(output_dir, bounding_box_val))然后寫一個(gè)自定義Dataset類用于把行人圖像讀取成模型輸入。核心邏輯是按文件夾名稱解析出行人ID并給每個(gè)ID重新編號為從0開始的連續(xù)標(biāo)簽import os from PIL import Image from torch.utils.data import Dataset class ReidDataset(Dataset): def __init__(self, root_dir, transformNone): self.root_dir root_dir self.transform transform self.pid_map {} self.samples [] for name in sorted(os.listdir(root_dir)): pid_str name.split(_)[0] if not pid_str.isdigit(): continue if pid_str not in self.pid_map: self.pid_map[pid_str] len(self.pid_map) pid self.pid_map[pid_str] self.samples.append((os.path.join(root_dir, name), pid)) def __len__(self): return len(self.samples) def __getitem__(self, idx): img_path, pid self.samples[idx] img Image.open(img_path).convert(RGB) if self.transform: img self.transform(img) return img, pid這里我額外提醒一句不同論文對“行人ID”的定義不完全相同Market1501里ID小于1500的可以進(jìn)訓(xùn)練集但也有論文會把所有ID放在一起無監(jiān)督訓(xùn)練。在復(fù)現(xiàn)模型時(shí)一定要對齊目標(biāo)論文的數(shù)據(jù)劃分方式否則指標(biāo)對不上是正常的。5. 從數(shù)據(jù)集到模型訓(xùn)練配置、效果驗(yàn)證與避坑指南5.1 一套能直接上手的訓(xùn)練配置跑Re-ID訓(xùn)練我最常用的一套配置如下不追求榜單最頂尖但收斂穩(wěn)定、復(fù)現(xiàn)容易BackboneResNet50或ResNet50-IBN-a。后者的Instance Normalization對跨域有明顯幫助建議優(yōu)先使用。特征維度backbone輸出2072維ResNet50為2048通過BNNeck降維到512維再輸出。損失函數(shù)CrossEntropy Loss Triplet Loss兩者權(quán)重約1:1。Batch Size采用P×K采樣策略比如P16個(gè)身份每個(gè)身份K4張圖實(shí)際batch size64。優(yōu)化器Adam初始學(xué)習(xí)率3.5e-4加Warmup5個(gè)epoch隨后用Cosine Annealing或Step衰減。數(shù)據(jù)增強(qiáng)隨機(jī)裁剪、水平翻轉(zhuǎn)、Random Erasing、AutoAugment可選。Random Erasing對提升遮擋魯棒性非常有效。訓(xùn)練輪數(shù)60到120個(gè)epochMarket1501通常60輪足夠MSMT17建議跑滿120輪。學(xué)習(xí)率調(diào)整很多開原庫默認(rèn)在第40/70輪衰減一次具體看訓(xùn)練曲線調(diào)整。這套配置基本能保證在Market1501上達(dá)到Rank-1約90%、mAP約80%的水平在ResNet50基線下。如果換了更強(qiáng)的backbone或者Transformer結(jié)構(gòu)指標(biāo)還能再往上走。5.2 效果驗(yàn)證評估腳本與評測一致性訓(xùn)練完后驗(yàn)證模型效果時(shí)最容易犯的錯(cuò)是評測代碼里用了和訓(xùn)練階段不一致的數(shù)據(jù)增強(qiáng)。推理階段必須關(guān)閉Random Affine、Random Erasing等操作只保留Resize和Normalize。這種錯(cuò)誤我見過很多次模型表現(xiàn)看起來“很好”但其實(shí)是訓(xùn)練時(shí)增強(qiáng)泄露到測試?yán)?。評估腳本的核心邏輯分三步用訓(xùn)練好的模型分別提取query和gallery的特征做一次L2歸一化再計(jì)算query和gallery之間的余弦相似度矩陣按相似度降序排序計(jì)算Rank-1、Rank-5和mAP。有一個(gè)工程細(xì)節(jié)需要留意在Market1501中query圖像本身也可能出現(xiàn)在gallery里因?yàn)橥粋€(gè)人在不同攝像頭下有多張圖同一攝像頭的query圖有時(shí)候會被重復(fù)檢索到。標(biāo)準(zhǔn)評估流程會排除query來自同一攝像頭且同一幀號的圖片這部分排除規(guī)則論文里有明確說明復(fù)現(xiàn)時(shí)一定要對齊。5.3 我踩過的幾個(gè)坑劃重點(diǎn)第一個(gè)坑是大量依賴預(yù)訓(xùn)練模型。直接加載torchvision的ResNet50預(yù)訓(xùn)練權(quán)重做Re-ID訓(xùn)練是可以的但效果不一定最好。業(yè)界普遍使用在ImageNet上訓(xùn)練后、再在大規(guī)模行人數(shù)據(jù)上二次預(yù)訓(xùn)練的權(quán)重比如IM_ReID系列。這個(gè)差異在Market1501上可能只有一兩個(gè)點(diǎn)但在MSMT17上可能放大到三四個(gè)點(diǎn)。第二個(gè)坑是硬件限制導(dǎo)致的batch size過小。不少人用單張消費(fèi)級顯卡訓(xùn)練batch只能開到16甚至8。P×K采樣策略里如果P太小每個(gè)batch的身份多樣性不足Triplet Loss的困難樣本挖掘效果會很差。解決辦法是堅(jiān)持P≥8K盡量保持4實(shí)在不行可以退而求其次用更大的分辨率或者加長訓(xùn)練輪數(shù)來補(bǔ)償。第三個(gè)坑是數(shù)據(jù)集泄密。有些老代碼為了方便把所有數(shù)據(jù)目錄放在一起訓(xùn)練結(jié)果query的圖像也進(jìn)入了訓(xùn)練集導(dǎo)致指標(biāo)虛高。用Market1501時(shí)請嚴(yán)格遵守官方目錄劃分訓(xùn)練只能用bounding_box_train測試用querybounding_box_test二者不能交叉。第四個(gè)坑是跨域評估時(shí)不做任何適配。很多新手拿Market1501訓(xùn)練完直接拉到自己的業(yè)務(wù)視頻上測發(fā)現(xiàn)效果遠(yuǎn)不如預(yù)期就以為是模型沒訓(xùn)好。實(shí)際上真實(shí)業(yè)務(wù)視頻的分辨率、視角、光照和開源數(shù)據(jù)集差異極大建議在部署前先做目標(biāo)域微調(diào)或者用無監(jiān)督域適應(yīng)算法減少分布偏移。5.4 復(fù)現(xiàn)論文時(shí)如何快速判斷一個(gè)模型值不值得跑最后分享一個(gè)我自己的習(xí)慣拿到一篇Re-ID論文后不會立刻復(fù)現(xiàn)而是先做三個(gè)判斷第一看它有沒有公開代碼和模型權(quán)重。如果作者連代碼都不放除非方法特別有價(jià)值不然我不會花時(shí)間去摳細(xì)節(jié)。第二看它在MSMT17上的結(jié)果。如果一個(gè)模型只在Market1501和DukeMTMC上刷點(diǎn)而沒報(bào)MSMT17那多半是跨域能力不行或者實(shí)驗(yàn)做得不夠全面。第三看它的推理速度。如果論文只報(bào)FLOPs而不報(bào)真實(shí)GPU上的latency那模型很可能在落地時(shí)吃性能尤其是Transformer結(jié)構(gòu)參數(shù)大、部署難需要特別留意。這三個(gè)判斷能幫你快速過濾掉大部分“好看但難用”的方法把精力留給真正能解決業(yè)務(wù)問題的模型。行吧關(guān)于Re-ID的概述、研究現(xiàn)狀和數(shù)據(jù)集下載整理我目前想到的實(shí)操經(jīng)驗(yàn)基本就是這些。如果只挑一句話總結(jié)整個(gè)方向那是Re-ID的本質(zhì)是跨視角下的細(xì)粒度行人檢索現(xiàn)階段想刷榜Transformer或多模態(tài)預(yù)訓(xùn)練是主流路線想落地靠的還是數(shù)據(jù)工程、域適配和合理的評測閉環(huán)。建議新手從Torchreid框架加Market1501入手先跑通一個(gè)完整流程再逐步深入換裝、遮擋、跨域這些hard問題感受會直觀得多。