1. 行人重识别(ReID)项目概述
行人重识别(Person Re-identification,简称ReID)是计算机视觉领域的一个重要研究方向,其核心目标是在不同摄像头拍摄的非重叠视野范围内,识别出同一个行人。Deep-Person-ReID作为当前主流的技术方案,通过深度学习模型提取行人特征,实现了跨摄像头、跨场景的行人匹配。
这个项目最实用的价值在于:它完整覆盖了从原始数据到最终模型训练的全流程,特别是解决了自定义数据集制作这个关键痛点。在实际项目中,我们往往无法直接使用公开数据集(如Market1501、DukeMTMC等),而是需要基于业务场景采集自己的数据。这时,如何规范地构建ReID专用数据集就成为了首要难题。
我在多个安防和零售分析项目中验证过这套方法,它能将原始监控视频或图片快速转化为符合ReID训练要求的结构化数据。相比公开数据集,自定义数据集的优势在于:
- 完全匹配实际业务场景的行人特征
- 可针对特定环境(如光线、角度、遮挡)进行优化
- 避免公开数据集与真实场景间的domain gap问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 自定义数据集制作全流程
2.1 原始数据采集规范
制作ReID数据集的第一步是采集原始数据。根据我的项目经验,这些注意事项能显著提升后续模型效果:
摄像头布设原则:
- 至少需要2个以上非重叠视角的摄像头(理想情况4-6个)
- 每个行人应被至少3个不同摄像头捕获
- 相邻摄像头间应有30%-50%的重叠区域(非视野重叠,而是场景过渡)
数据质量要求:
- 单张图片分辨率不低于640×480
- 每个行人ID在不同摄像头下的样本数尽量均衡
- 包含多种光照条件(早中晚、室内外)
- 建议采集周期覆盖不同季节的服装变化
实际案例:在某商场项目中,我们使用6个摄像头覆盖3个出入口,连续采集2周,最终获得412个行人ID,每个ID平均23张跨摄像头图像。
2.2 数据标注标准与工具
与常规检测任务不同,ReID数据集需要特殊的标注格式。关键要素包括:
-
行人ID分配规则:
- 同一行人在所有摄像头中保持唯一ID
- 新ID分配采用递增整数(如0001,0002...)
- 遮挡超过50%或严重模糊的样本应标记为"junk"
-
文件命名规范:
code复制{camera_id}_{person_id}_{frame_num}.jpg示例:
c1_0015_0082.jpg表示1号摄像头拍摄的ID为15的行人第82帧 -
标注工具选型对比:
| 工具 | 适用场景 | ReID适配性 | 效率 |
|---|---|---|---|
| LabelImg | 单张标注 | 低 | 慢 |
| DarkLabel | 视频连续标注 | 中 | 较快 |
| 自研工具 | 批量处理 | 高 | 最快 |
我推荐使用改进版的DarkLabel,它支持:
- 自动追踪同一ID跨摄像头
- 批量重命名导出
- 生成Market1501格式的标注文件
2.3 数据集目录结构设计
规范的目录结构能大幅提升后续训练效率,这是我的推荐方案:
code复制DeepPersonReID/
├── datasets/
│ ├── custom_data/
│ │ ├── bounding_box_test/ # 测试集
│ │ ├── bounding_box_train/ # 训练集
│ │ ├── query/ # 查询图像
│ │ └── gt_bbox/ # 标注文件
├── images/
│ ├── c1_0015_0082.jpg # 原始图像
│ └── ...
└── splits.json # 数据集划分记录
关键细节:
- 训练测试集按7:3划分
- 查询集应包含每个ID在不同摄像头的样本
- 每个目录下需有对应的meta文件记录ID映射
3. 模型训练关键技术点
3.1 数据增强策略
针对ReID任务的特殊性,需要设计专门的数据增强方案:
必须包含的增强:
- 随机擦除(Random Erasing):模拟遮挡
- 颜色抖动(Color Jitter):适应光照变化
- 水平翻转(概率0.5)
推荐参数配置:
python复制transform_train = transforms.Compose([
transforms.Resize((256, 128)),
transforms.RandomHorizontalFlip(p=0.5),
transforms.Pad(10),
transforms.RandomCrop((256, 128)),
transforms.ColorJitter(brightness=0.2, contrast=0.15, saturation=0.1),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
RandomErasing(probability=0.5, mean=[0.485, 0.456, 0.406])
])
3.2 骨干网络选型
基于最新论文和实际测试,推荐以下网络架构:
| 模型 | 参数量 | mAP@Market1501 | 推理速度(FPS) |
|---|---|---|---|
| ResNet50 | 25M | 85.3% | 62 |
| OSNet | 3.2M | 88.1% | 105 |
| TransReID | 22M | 91.4% | 48 |
对于大多数应用场景,我的建议是:
- 计算资源有限:选择OSNet(轻量高效)
- 追求最高精度:TransReID+局部特征
- 平衡型方案:ResNet50-IBN(添加IBN层提升跨域能力)
3.3 损失函数组合
有效的损失函数组合是ReID模型的关键。推荐采用:
-
分类损失:CrossEntropy Label Smoothing
python复制criterion_cls = CrossEntropyLabelSmooth(num_classes=num_ids, epsilon=0.1) -
度量学习损失:Triplet Loss with Hard Mining
python复制criterion_tri = TripletLoss(margin=0.3) -
辅助损失(可选):
- Center Loss:增强类内紧凑性
- PCB部分分类损失:提升局部特征判别力
实际训练中,建议采用动态加权策略:
- 前期:分类损失权重=1.0,三元组损失=0.5
- 后期:分类损失=0.7,三元组损失=1.0
4. 训练技巧与调优经验
4.1 学习率设置策略
不同于常规CV任务,ReID训练需要特殊的学习率规划:
-
预热阶段(前10个epoch):
python复制lr = base_lr * (batch_idx + 1) / warmup_iters -
周期性衰减:
- 每40个epoch衰减为原来的0.1
- 配合余弦退火效果更佳
-
最后一层学习率倍增:
python复制optimizer = torch.optim.SGD([ {'params': model.backbone.parameters(), 'lr': lr}, {'params': model.classifier.parameters(), 'lr': lr * 10} ], momentum=0.9)
4.2 难样本挖掘技巧
提升模型判别力的关键是对难样本的有效利用:
-
跨batch记忆库:
- 维护一个特征队列(建议长度=8192)
- 计算损失时结合当前batch和队列中的样本
-
动态margin调整:
python复制margin = base_margin * (1 + 0.1 * (epoch - start_epoch)) -
ID内多样性增强:
- 对同一ID的样本进行特征插值
- 生成困难正样本对
4.3 模型评估与部署
评估指标解读:
- mAP:综合考量召回率和准确率
- CMC@k:前k名命中率(重点关注Rank-1和Rank-5)
测试时需注意:
python复制# 测试集应包含多个查询图像和对应的gallery
# 每个查询图像应在gallery中有相同ID的不同摄像头图像
部署优化技巧:
- 模型量化:
python复制
model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) - 特征缓存:
- 对静态摄像头预先提取gallery特征
- 实时只处理query图像
5. 常见问题与解决方案
5.1 数据相关问题
问题1:不同摄像头间颜色差异大
- 解决方案:
- 使用IBN-Net作为backbone
- 添加颜色对齐预处理:
python复制def color_transfer(source, target): # 将source图像的色彩分布匹配到target ...
问题2:样本ID不均衡
- 解决方案:
- 过采样少数ID
- 采用ID平衡采样器(IDBalancedSampler)
5.2 训练异常排查
现象:loss震荡不收敛
可能原因及解决:
- 学习率过高 → 减小10倍试运行
- 数据标注错误 → 检查ID冲突样本
- 难样本比例过高 → 调整mining策略
现象:过拟合严重
应对措施:
- 增加RandomErasing概率
- 添加Dropout层(p=0.5)
- 采用early stopping策略
5.3 实际部署问题
跨场景性能下降
解决方案路线:
- 在目标场景少量数据上finetune
- 添加领域适应模块(如MMD损失)
- 采用无监督域适应技术
实时性不达标
优化方向:
- 模型剪枝(移除冗余通道)
- TensorRT加速
- 多尺度特征共享计算
在多个实际项目中验证过的经验是:先用ResNet50作为基线模型快速验证流程,待数据质量稳定后,再切换为OSNet或TransReID追求更高性能。对于监控摄像头部署场景,建议输入分辨率保持在256×128,这样能在精度和速度间取得较好平衡。
