ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

行人重识别(Re-ID)全面解析:从原理到数据集下载与训练实战

2026/10/5 9:09:43 拓冰建站 浏览量
行人重识别(Re-ID)全面解析:从原理到数据集下载与训练实战 平时跑跨摄像头检索任务的时候经常有人问我“行人重识别Re-ID到底是什么和普通的目标检测、人脸识别有啥区别数据集到底去哪下载”今天干脆把这些内容一次讲透。我会从问题定义、技术演进、研究现状讲到数据集获取和训练踩坑全程按我实际做项目时的经验来写不堆名词只说能用得上的东西。1. 行人重识别到底在解决什么问题定义拆解与业务场景1.1 Re-ID的问题定义与形式化表达行人重识别英文全称是Person Re-identification业内一般直接写Re-ID。它的核心任务是给定一张查询图像query在跨摄像头、跨时间段的候选图像库gallery中检索出所有包含同一个人的图片。形式化一点说训练时你有一批带身份标签的行人图像每个身份在多个摄像头下面都有若干张图。模型要学习一个特征提取器把“不同摄像头下同一个人的差异”类内差异压缩同时放大“不同人之间的差异”类间差异。推理阶段把query和gallery里的每张图都提取成特征向量算相似度余弦距离或欧氏距离按相似度排序返回最靠前的结果。这和人脸识别最本质的区别在于人脸识别假设人脸区域是清晰的、正面的、光照可控的而Re-ID面对的是低分辨率、大角度变化、严重遮挡、光照剧烈变化的全身图像。换句话说人脸识别靠的是稳定的生物特征Re-ID更多靠的是衣服、体型、背包、发型这些外观属性所以一旦目标换衣服跨域性能往往会掉得很厉害。这也是Re-ID领域长期以来的痛点和研究热点。1.2 真实业务场景我为什么关注Re-IDRe-ID并不是实验室自嗨的方向实际业务里需求非常大。我在安防项目里最常遇到的场景是一个走失老人出现在某个路口监控画面里需要检索他在过去24小时内出现在周边20个摄像头下的所有轨迹。商场里顾客A在门店拿走了商品没付款需要从整个商场的几百路摄像头里找到他离开的路径。展会、机场、火车站这种人流密集场景需要追踪一个人在不同登机口、安检口之间的移动过程。这些场景如果靠人眼一小时一小时翻录像效率极低。而Re-ID算法可以先自动搜索出候选结果再由人工二次确认能把几十个小时的排查压缩到几分钟。不过有一点需要提醒Re-ID目前更适合做“辅助检索”而不是“绝对身份确认”。尤其是换装、跨天、跨场景的情况下直接拿Re-ID结果当确证证据风险很高。正规的落地流程一般是Re-ID粗筛候选人工或者人脸识别做最终确认。1.3 与普通图像检索和人脸识别的区别很多初学者会把Re-ID和图像检索、人脸识别混在一起这里我做个简明的对比任务类型输入形式核心难点常用手段图像检索任意物体/场景狗、建筑、商品语义相似但真实类别不同通用表征学习、多模态匹配人脸识别人脸裁剪图正面/侧面、年龄变化、光照人脸关键点对齐、大间隔分类行人重识别全身行人图像跨摄像头、换装、遮挡、低分辨率ID分类度量学习、局部特征理解这个区别很重要因为Re-ID算法设计时很多技巧都是针对“全身图像跨摄像头”这个特定场景的。比如局部特征建模就是考虑到行人图像有非常强的结构化先验头、上身、下身这是通用图像检索不会特别关注的。2. Re-ID技术演变从手工特征到Transformer的路线图2.1 早期的手工特征时代与词语袋思路2015年之前Re-ID的主流做法是手工设计特征再配合距离度量学习。比较有代表性的特征有颜色直方图、颜色命名Color Names利用HSV、Lab等颜色空间统计行人外观颜色分布。纹理特征如LBP局部二值模式、Gabor滤波器用于刻画衣服纹路。最典型的流程是用词语袋模型Bag of WordsBoW把行人图像表示成特征向量然后再学一个度量。度量学习这一步在早期比特征本身还关键。常见的有KISSMEKeep It Simple and Straightforward Metric Learning、XQDACross-view Quadratic Discriminant Analysis。这些方法在Market1501上的Rank-1大概只有40%~55%放到今天的标准看确实不高但思路很值得了解——先提取局部描述子再通过统计学习得到距离函数这个“特征抽取度量学习”的两段式框架和现在的深度学习方法本质上是一个套路只是特征抽取器从手工模板换成了CNN。2.2 表征学习时代用分类训练得到一个“人形特征提取器”2016年前后深度学习开始统治Re-ID。当时最直接的做法是把Re-ID当成图像分类任务来训练用ImageNet预训练的ResNet50作为backbone在行人训练集上把最后的分类层改成N个身份的分类头用交叉熵损失训练。训练完去掉分类层取倒数第二层或加了降维层之后的特征作为行人特征向量。这种做法大家称之为表征学习Representation Learning。它的好处是复现简单、训练稳定。直到今天ID损失CrossEntropy Loss Triplet Loss联合训练依然是Re-ID领域最稳的baseline组合。不过只用分类损失会有一个问题分类任务只要求模型能把不同身份区分开并不直接保证“同一人的不同图片在特征空间里距离足够近”。所以后来大家开始引入度量损失让训练目标更贴近检索任务本身。2.3 度量学习为什么是Re-ID的灵魂度量学习的目标是构造一个特征空间让正样本对同一人的不同图距离近负样本对不同人距离远。常用的损失函数包括Contrastive Loss对比损失给定一对样本优化目标是最小化正对距离、最大化负对距离到某个margin之外。Triplet Loss三元组损失每次取锚点图anchor、正样本positive、负样本negative各一张要求anchor到positive的距离加上margin小于anchor到negative的距离。Circle Loss对三元组损失做进一步改进对正负样本分别做自适应加权。三元组损失是Re-ID训练里最常用的但直接把所有三元组都拿来训练效率很低。实际操作中一般用困难样本挖掘Hard Mining只取距离最近的负样本和距离最远的正样本参与梯度更新。这也是为什么很多Re-ID训练代码里会专门实现一个“HardExampleMiner”的原因。这里有一点要注意分类损失和度量损失解决的是不同层面的问题。分类损失帮助模型快速收敛到合理的特征空间度量损失在局部上“拉近同类、推开异类”两者组合效果通常远好于只用其中任何一个。行业内把这种组合叫“ID损失Triplet损失双头训练”。2.4 局部特征、注意力机制与Transformer时代的到来随着ResNet特征越来越好研究者发现细分局部特征能进一步提升效果尤其是在解决“不同人穿相似衣服”这种极端情况时。代表工作是PCBPart-based Convolutional Baseline把特征图水平切成6块每块分别做一次分类最后拼接得到细粒度特征。MGNMulti-Granularity Network整合全局分支和多粒度局部分支进一步提升精度。注意力机制如Relation Network、OSNet等用注意力让模型更关注可辨识的区域比如背包、鞋子、发型。到了2021年之后Transformer架构进入Re-ID领域比较有代表性的工作是TransReID。它把行人图像切成patch序列输入ViT在分类token之外引入了两个很关键的改进一是Jigsaw Patch Module随机打乱部分patch强迫模型学习全局轮廓而不只是局部拼接规律二是Side Information Embeddings把摄像头编号、视角等信息编码进网络缓解跨摄像头特征漂移。另外还有个值得关注的方向是CLIP-ReID这一系列工作用大规模图文预训练模型做行人检索。和传统的ImageNet预训练相比CLIP类模型学到了更强的语义先验换装和遮挡鲁棒性有明显提升缺点是模型参数量大、训练开销高落地时需要考虑算力成本。3. 研究现状速览通用数据集、关键评测指标与当下的主流难点3.1 学术界公认的Re-ID基准数据集既然要深入这个方向数据集是绕不开的。我在下面的表格里整理了目前学术界最常用的几个行人重识别数据集这些也是你在读论文、复现实验时出现频率最高的。数据集名称发布时间身份数量图像数量摄像头数量特点与使用提示VIPeR200763212642规模小每身份只有2张图仅供早期算法快速验证Market150120151501326686入门首选标注规整划分方式社区统一CUHK0320141467131642同时提供手工标注框和DPM检测框注意新旧划分协议DukeMTMC-reID20171812364118场景更复杂但原作者因隐私问题已要求停止使用MSMT172018410112644115数据量大、场景丰富最能反映真实监控环境的表现目前新论文一般要求至少在Market1501和MSMT17两个数据集上做实验因为前者是“入门门槛”后者是“真实压力测试”。很多老方法在Market1501上刷到95%的Rank-1已经是极限但到了MSMT17上通常会掉到70%~85%之间这中间的差距正好反映了模型的泛化能力。3.2 Rank-1、mAP和CMC曲线到底怎么算Re-ID论文里密密麻麻都是指标最常见的三个是Rank-1、mAP和CMC曲线。我用自己的话解释一下Rank-1对于每个查询图像取相似度最高的那一张检索结果。如果这张图是正确目标就算命中。所有查询的命中率就是Rank-1。CMC曲线横轴是Rank k即取前k个结果纵轴是命中率。Rank-1就是CMC曲线上k1的那一个点。mAPmean Average PrecisionRank-1只关心第一个结果对不对mAP则更严格它会统计检索结果里所有正确目标的排序位置。如果某个query在gallery里对应了5张正确的图理想的排序是这5张全部排在最前面那么AP1。所有query的AP平均就是mAP。mAP特别能反映“把所有目标找全”的能力实际业务里往往比Rank-1更关键。因为用户看结果时通常不止看第一张而是看前10张里有没有正确目标mAP高意味着正确目标整体排序靠前用户翻几页就能找到。复现论文时我建议别只用Rank-1一个指标。两个不同方法可能在Rank-1上差距很小但mAP差好几个点说明后者在完整检索性能上更优。论文对比表里如果只报Rank-1基本可以判断作者要么没跑全要么有意回避了弱势指标。3.3 当前五大研究难点与主流对策拿2025年的视角回头看Re-ID还没有完全解决的热点问题主要集中在以下五个方向第一跨域泛化Domain Generalization。在Market1501上训练好的模型直接放到MSMT17上测试性能通常会明显下跌因为不同数据集的光照、摄像头视角、人群密度差异太大。针对这个问题目前主流方案是域适应Domain Adaptation和大模型预训练。域适应通过伪标签、风格迁移等方式让源域模型适应目标域大模型预训练则是让模型见过足够多样的图像语义从而对域偏移不那么敏感。第二遮挡问题Occluded Re-ID。行人经常被树、车、其他行人遮挡全身只有部分可见。解决方法包括关键点引导的局部对齐、可见区域mask、生成对抗补全等。但老实说遮挡Re-ID目前还没有一个通用且轻量的解决方案。第三换装问题Cloth-Changing Re-ID。这是目前工业落地最头疼的。人一旦换一件衣服基于外观的特征基本失效。对应方法有利用轮廓、步态、人体结构等与衣服无关的特征以及利用CLIP这类语义模型的文本约束来提取身份级特征。第四跨模态检索Visible-Infrared Re-ID。白天用可见光摄像头晚上用红外摄像头这两者的成像差异很大。研究者提出了双流网络、模态对齐等方法也配套发布了SYSU-MM01、RegDB等跨模态数据集。第五模型效率与实时性。很多先进方法在GPU上可以跑到不错的指标但到嵌入式设备或者单路实时检索场景就会卡顿。轻量化网络、特征量化和蒸馏是落地里最常听到的三种手段。3.4 值得关注的新方向与工具库如果你打算入门Re-ID或者找创新点我建议重点关注这几个方向基于Transformer和Mamba架构的行人检索新模型针对长距离依赖和时序关系建模做文章。利用大语言模型/多模态大模型的语义先验做Re-ID比如用文本描述帮忙区分穿相似衣服的两个人。生成式数据增强用扩散模型生成更多视角、光照、遮挡情况的行人图像扩充训练集。分布外泛化评估框架不只是看单一数据集指标而是构建跨数据集benchmark考察模型的稳定性。另外如果你想快速搭一套Re-ID模型做实验不用重复造轮子。目前开源生态里比较成熟的工具库有TorchreidPython/PyTorch支持几十篇论文的baseline、FastReID京东开源的Re-ID工具包工业级工程化做得好、OpenUnReID专门做无监督/半监督Re-ID和来自商汤的Person_REIN。初学者用Torchreid最多配置灵活、文档清晰跑通整个训练评估流程大约只需要半天。4. Re-ID数据集下载全攻略渠道整理、目录结构与加载方法4.1 Market1501新手入门最推荐的数据集先说结论如果你是第一次做Re-ID实验先从Market1501开始。这是获取渠道最规范、社区支持最好的数据集。官方页面由作者郑良博士维护原域名长期有效需要填一个简单的申请表格说明使用目的一般会在几个工作日内收到下载链接。如果你觉得邮件申请麻烦也可以直接在GitHub上搜索“Market1501”很多复现仓库会附带百度网盘或Google Drive的分享链接注意核对文件指纹防止下载到坏档。Market1501下载下来是解压好的图片目录核心目录结构如下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是帧号最后一位数字是DPM检测框序号其中-1表示该图片是干扰负样本也就是gallery里的背景误检图计算mAP时需要处理。训练集和测试集已经按官方要求划分好了不需要自己额外split。唯一要注意的是有些版本还会多出gt_bbox、gt_query目录推理评估一般用不到直接忽略即可。4.2 CUHK03、DukeMTMC-reID和MSMT17的获取方式CUHK03由香港中文大学多媒体实验室发布。官方页面提供了两种版本一种使用人工标注的行人框另一种使用DPM检测器自动得到的检测框。复现不同论文时两种版本的结果差异很大读论文一定要看清它用的是哪一种。下载时还需要注意“新旧协议”的问题新协议New Protocol把数据集分成训练集和测试集且不再采用传统的随机划分直接用固定划分社区可复现性更高。DukeMTMC-reID这里我必须多说一句。原始数据集基于杜克大学校园监控视频制作后来因为涉及个人隐私问题原作者已经公开要求停止使用和下载网上还挂着的一些链接大多来自镜像而非官方渠道。所以如果你是新论文尽量不要把DukeMTMC-reID作为唯一的主实验数据集以免后续审稿或复现时遇到数据合规问题。老论文里用它做对比没什么问题但新工作再用它评审意见里很容易收到质疑。MSMT17是北京大学发布的大规模数据集拥有15个摄像头、4101个身份、12万多张图像是目前公开可下载的行人重识别数据集中挑战性最高、覆盖面最广的之一。它的官方项目网站在北大视觉与媒体计算组名下申请时需要填写使用协议。MSMT17下载后是一个压缩包里面的图片初始都在一个大目录下需要通过官方提供的train_test_split本体txt文件来划分训练、验证和测试集处理流程比Market1501稍繁琐我在下一节给出具体代码。4.3 下载渠道、校园网失败与版权注意事项Re-ID数据集下载有几个常见的“坑”我挨个提醒。第一个坑是校园网或某些网络环境下访问国外学术服务器很慢下载到一半就断。建议优先选择支持断点续传的工具或者让浏览器直接下载不要用某些下载器的多线程模式后者容易被服务器判定异常而封IP。第二个坑是有些网盘链接时效性很短博主挂出来的链接经常失效。碰到这种情况我一般会去论文的GitHub官方仓库里找issue如果有其他人也在找数据issue里大概率有人贴出新的可用链接。这是最靠谱的间接渠道。第三个坑是数据集版权。行人人脸和身份信息属于个人隐私数据在研究用途内使用一般没有问题但商用必须逐条核对数据集的具体许可协议。尤其是DukeMTMC这类明确被作者撤回的数据集绝对不能用于任何商业项目。工业项目里如果无法获取合规的公开数据我强烈建议自建数据采集和标注流程不要抱侥幸心理。4.4 目录整理与自定义Dataset加载代码拿到数据集之后第一步不是急着训练而是先统一目录格式。以Market1501为例官方目录已经规范直接喂给常见Re-ID训练框架即可。但如果用的是MSMT17这种大目录结构我给你写一个简单的划分脚本把训练、验证和测试集文件整理到三个子目录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))然后写一个自定义Dataset类用于把行人图像读取成模型输入。核心逻辑是按文件夹名称解析出行人ID并给每个ID重新编号为从0开始的连续标签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的可以进训练集但也有论文会把所有ID放在一起无监督训练。在复现模型时一定要对齐目标论文的数据划分方式否则指标对不上是正常的。5. 从数据集到模型训练配置、效果验证与避坑指南5.1 一套能直接上手的训练配置跑Re-ID训练我最常用的一套配置如下不追求榜单最顶尖但收敛稳定、复现容易BackboneResNet50或ResNet50-IBN-a。后者的Instance Normalization对跨域有明显帮助建议优先使用。特征维度backbone输出2072维ResNet50为2048通过BNNeck降维到512维再输出。损失函数CrossEntropy Loss Triplet Loss两者权重约1:1。Batch Size采用P×K采样策略比如P16个身份每个身份K4张图实际batch size64。优化器Adam初始学习率3.5e-4加Warmup5个epoch随后用Cosine Annealing或Step衰减。数据增强随机裁剪、水平翻转、Random Erasing、AutoAugment可选。Random Erasing对提升遮挡鲁棒性非常有效。训练轮数60到120个epochMarket1501通常60轮足够MSMT17建议跑满120轮。学习率调整很多开原库默认在第40/70轮衰减一次具体看训练曲线调整。这套配置基本能保证在Market1501上达到Rank-1约90%、mAP约80%的水平在ResNet50基线下。如果换了更强的backbone或者Transformer结构指标还能再往上走。5.2 效果验证评估脚本与评测一致性训练完后验证模型效果时最容易犯的错是评测代码里用了和训练阶段不一致的数据增强。推理阶段必须关闭Random Affine、Random Erasing等操作只保留Resize和Normalize。这种错误我见过很多次模型表现看起来“很好”但其实是训练时增强泄露到测试里。评估脚本的核心逻辑分三步用训练好的模型分别提取query和gallery的特征做一次L2归一化再计算query和gallery之间的余弦相似度矩阵按相似度降序排序计算Rank-1、Rank-5和mAP。有一个工程细节需要留意在Market1501中query图像本身也可能出现在gallery里因为同一个人在不同摄像头下有多张图同一摄像头的query图有时候会被重复检索到。标准评估流程会排除query来自同一摄像头且同一帧号的图片这部分排除规则论文里有明确说明复现时一定要对齐。5.3 我踩过的几个坑划重点第一个坑是大量依赖预训练模型。直接加载torchvision的ResNet50预训练权重做Re-ID训练是可以的但效果不一定最好。业界普遍使用在ImageNet上训练后、再在大规模行人数据上二次预训练的权重比如IM_ReID系列。这个差异在Market1501上可能只有一两个点但在MSMT17上可能放大到三四个点。第二个坑是硬件限制导致的batch size过小。不少人用单张消费级显卡训练batch只能开到16甚至8。P×K采样策略里如果P太小每个batch的身份多样性不足Triplet Loss的困难样本挖掘效果会很差。解决办法是坚持P≥8K尽量保持4实在不行可以退而求其次用更大的分辨率或者加长训练轮数来补偿。第三个坑是数据集泄密。有些老代码为了方便把所有数据目录放在一起训练结果query的图像也进入了训练集导致指标虚高。用Market1501时请严格遵守官方目录划分训练只能用bounding_box_train测试用querybounding_box_test二者不能交叉。第四个坑是跨域评估时不做任何适配。很多新手拿Market1501训练完直接拉到自己的业务视频上测发现效果远不如预期就以为是模型没训好。实际上真实业务视频的分辨率、视角、光照和开源数据集差异极大建议在部署前先做目标域微调或者用无监督域适应算法减少分布偏移。5.4 复现论文时如何快速判断一个模型值不值得跑最后分享一个我自己的习惯拿到一篇Re-ID论文后不会立刻复现而是先做三个判断第一看它有没有公开代码和模型权重。如果作者连代码都不放除非方法特别有价值不然我不会花时间去抠细节。第二看它在MSMT17上的结果。如果一个模型只在Market1501和DukeMTMC上刷点而没报MSMT17那多半是跨域能力不行或者实验做得不够全面。第三看它的推理速度。如果论文只报FLOPs而不报真实GPU上的latency那模型很可能在落地时吃性能尤其是Transformer结构参数大、部署难需要特别留意。这三个判断能帮你快速过滤掉大部分“好看但难用”的方法把精力留给真正能解决业务问题的模型。行吧关于Re-ID的概述、研究现状和数据集下载整理我目前想到的实操经验基本就是这些。如果只挑一句话总结整个方向那是Re-ID的本质是跨视角下的细粒度行人检索现阶段想刷榜Transformer或多模态预训练是主流路线想落地靠的还是数据工程、域适配和合理的评测闭环。建议新手从Torchreid框架加Market1501入手先跑通一个完整流程再逐步深入换装、遮挡、跨域这些hard问题感受会直观得多。