2024最强SoTA行人重识别(ReID)项目实战

本文聚焦2024行人重识别模型,先拆分问题,将pipeline分为行人检测、MOT、Search engine、Person Reid四大模块;接着调研核心算法确定baseline;然后改进模型,虽指标提升有限但给出改进意见;最后介绍落地项目,包括GUI设计、模型转换等,还给出简单的安装和运行步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2024年SoTA 行人重识别模型复现和提升最后再加前端展示

Person Reid(行人重识别2024SoTA)

任务目的: 使用一张人的全身照,在视频or图像中找到这个人出现的时刻。

1. 问题拆分:

我们如果要落地一个行人重识别的应用项目.我们需要按照pipeline的任务模块将其拆解。简单来说,如图所示,对于图像来说,我们的一般流程是先行人检测,将目标行人的位置提取出来,进行裁剪后面送到reid模型中。对于视频来说,特别是背景稳定的视频如监控,不同的点在于,我们可以使用MOT(多目标跟踪)其是使用滤波位置等信息采用低计算量的方式跟踪一个人。我们在这里就可以设计一个缓存,对于跟踪的一个人只去调reid模型一次(这个可以设置超产),这里其实就是工业界常用的抓拍机策略。

  • For image: 行人检测-> person reid -> vector search -> matching.
  • For video: 行人检测 -> 多目标跟踪(MOT) -> person reid -> vector search -> matching
    请添加图片描述

在这里插入图片描述

pipeline拆分为四大模块:

  • 行人检测: YOLO检测器 or 其他的detection模型(技术成熟).
  • MOT: 使用滤波/位置等信息跟踪, 来减少调用reid 模型的次数,从而来加速(reid相对track耗时很多,技术成熟)。
  • Search engine: Faiss 向量检索库支持物理加速和算法加速(有损)。
  • Person Reid: 将目标图像映射到特征空间上, 即输入图像输出vector。这一类属于metric learning, 核心思想是类内相近,类间相远。

2. 攻克难关:

1.调研核心算法reid端到端模型.

  • step1:找目前该任务学术界的SOTA.
  1. 找到该任务的公开数据集.MSMT17数据集更大ID更多,为我们参考的主metircs.

请添加图片描述

  1. 在paperswithcode.com上找到该数据集指标最高的几篇论文。

请添加图片描述

3.认真阅读这些论文,看看论文的idea与method(是否存在秀技但泛化性弱),拿上图为例,公平的对比是without re-ranking & without extra trainning data. 最后我们选择clip-ReID作为我们的baseline.

NOTE: cam_id和view这些先验信息对于通用模型是没有这些标签的,所有最好不加。

4.认真阅读论文和代码请添加图片描述

一句话讲清做了什么:
挑战:几乎所有的ReID方法都需要在ImageNet上训练的初始模型,该数据集包含了手动给定的图像和预定义集合中的一组标签。完全忽略了描述丰富语义的视觉内容。

作者方案: 想把多模态大模型上视觉和文本描述两个对齐模态的能力迁移到纯视觉下游任务上.
作者分了两步.

  • 1.训练不动clip的参数,构建类似person_num个可学习token,每个token代表一个人。(本质:Textual Inversion)
  • 2.训练只动visual encoder参数,让它和文本模态对齐。Inference也只有visualencoder

3.改进模型.

几乎所有DNN模型就两个结构: backbone + task head。训练模型只有三步: 1.改写dataloader(数据增强等trick) 2.模型结构调试(比如:a.backbone换成更深的网络,用更强的预训练参数;) 3.make loss.
由于up主的时间有限: 尝试了1与3, 最终将mAP 0.734 ->0.737, R1 0.887 ->0.891
请添加图片描述

up主尝试将market-1501的所有数据再加上msmt17的training set 来训练, eval在msmt17的val set上。但很奇怪指标没提升:
请添加图片描述

4.up主的一些改进意见

4.1 如果要打竞赛

  • 最简单的方法: backbone换一下/预训练的参数换成更强的,目前用的的是opanai-clip-vit-b-16 排名71.

请添加图片描述

4.2 不成熟的idea(也许指标有提升可到顶会borderline水平).

  • a. 论文作者已经证明了camid与view这些信息有用,但这些信息对于有些数据集是缺失的,设计一个learnable memory bank.用网络参数去学习这些差异性
  • B. 借助多模态大模型,生成文本物料, 比如:文本形式为:上身为x色的_衣服.等.模型结构采用cross encoder,设计masking modeling预训练任务去加强细粒度的对齐。

5.落地项目:

    1. 设计GUI,画交互图和UI.
      请添加图片描述
      请添加图片描述
      请添加图片描述
    1. trainning的checkpoint删除梯度等信息转化为跨平台的inference模型(onnx)
    1. 串联pipeline,参考设计模式,多线程/异步/同步/数据库同步等
    1. 设计测试用例,测试debug

这样我们就丝滑地做成了在算法上非常有竞争力的一个项目。

6. Install & Run (我们的安装和测试非常简单,只需你会装conda就行)

博主测试:win11/macbook正常运行。

  • step1: conda create -n reid_gui python=3.8
  • step2: conda activate reid_gui
  • step3: If mac or linux OS: sh install.sh; or win OS: ./install.bat
  • step4: cd GUI; python main.py

7. 结束语

对于创意项目,我会倾向于选择那些具有较大工作量、相对较难且有未来前景的项目进行实现。这也导致完成一个课题项目可能需要2到3个月甚至更长的时间,因此更新的频率会相对较慢。

同时,欢迎大家在评论区留言,分享任何新颖有趣的课题,我将考虑并予以实现。

项目代码和更新地址见我的面包多平台。

### 车辆ReID模型训练方法及教程 #### 一、环境搭建 为了顺利开展车辆重识别(Vehicle Re-ID)项目的开发工作,需先准备好相应的运行环境。推荐使用的配置如下: - **Python 版本**:3.7 或更高版本[^4] - **PyTorch 版本**:1.6 或以上版本[^4] - **CUDA 版本**:建议使用 CUDA 10.1 来支持 GPU 加速计算 安装必要的库文件可通过执行命令 `pip install -r requirements.txt` 完成,这一步骤会依据项目需求自动下载并安装所需的第三方包。 #### 二、数据准备与预处理 高质量的数据集对于构建有效的车辆重识别系统至关重要。通常情况下,需要收集大量的标注图像作为训练样本,并对其进行适当的数据增强操作以增加模型泛化能力。具体措施包括但不限于随机裁剪、颜色抖动以及水平翻转等变换方式[^3]。 此外,还需注意对输入图片做尺寸统一和像素值范围规范化处理,确保所有待分析对象具有相同规格以便于后续特征提取层的学习过程。 #### 三、模型架构设计 针对车辆重识别任务特点而定制化的神经网络结构往往能带来更好的性能表现。当前主流方案多采用卷积神经网络(CNN),特别是那些经过精心设计的基础骨干网如ResNet系列,在此基础上加入注意力机制或其他改进模块可进一步提升效果。 值得注意的是,除了单模态视觉信息外,还可以考虑引入其他辅助线索比如视角角度估计(Orientation ReID)[^1]或摄像头位置关系(Camera ReID)[^1]来进行跨视域匹配优化。 #### 四、损失函数定义 合理的损失度量标准有助于引导整个学习流程朝着预期方向前进。常见的做法是在Softmax分类器基础上附加Triplet Loss或者Contrastive Loss项来强化同类间相似性约束的同时拉大异类间距;另外还有些研究尝试利用中心损失(Center Loss)等方式促进聚簇紧凑性的形成。 #### 五、训练策略实施 实际训练过程中涉及到多个超参数的选择问题,例如初始学习率设定、批量大小(batch size)选取等等都会影响最终收敛速度乃至整体精度指标。因此有必要根据实际情况灵活调整这些关键因素直至找到最优组合。 同时也可以借鉴一些实用技巧如逐步退火法(Scheduler Warmup)或是混合精度(Mixed Precision)加速手段来加快迭代周期内的探索进度。 ```python import torch.optim as optim from warmup_scheduler import GradualWarmupScheduler optimizer = optim.Adam(model.parameters(), lr=initial_lr) scheduler_steplr = optim.lr_scheduler.StepLR(optimizer, step_size=step_size, gamma=gamma) scheduler_warmup = GradualWarmupScheduler(optimizer, multiplier=warmup_multiplier, total_epoch=warmup_epochs, after_scheduler=scheduler_steplr) for epoch in range(num_epochs): scheduler_warmup.step() train_one_epoch(...) ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血小蚂蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值