行人重识别(ReID)基本介绍
行人重识别(ReID)基本介绍
行人重识别(ReID)是计算机视觉领域的一个重要研究方向,主要用于在不同摄像头或场景下识别同一行人。本文将详细介绍ReID的基本概念、应用场景、系统架构、传统方法、深度学习方法、基于GAN的方法以及相关的工程实践和优化技巧。
行人重识别(ReID)基本介绍
应用
- 视频监控
- 人脸识别&检测
- 视频结构化
- 道路上人车的属性等
- 行人重识别ReID
行人重识别ReID
- 拿到图片,检测到图片中的行人,得到一系列行人图片,拿到一张想要检索的人图片,在行人图片中检索的到该人的行为
- 人脸识别失效的情况下用的比较多
- 衣着、配饰、体态等方面看
行人重识别ReID也成行人再识别,被认为是一个图像检索的子问题,是利用计算机视觉技术判断图像或者视频中是否存在特定行人的技术,即给定一个监控行人图像检索跨设备下的该行人图像。
- 弥补固定摄像头的视觉局限
应用
- 刑事侦查(短时)
- 行人理解
- 行人跟踪
- 单摄像头单目标
- 单摄像头多目标
- 多摄像头多目标
行人重识别系统
- 行人重识别主要关注点在特征提取和相似度度量
过程
- 特征提取:学习能够应对在不同摄像头下行人变化的特征
- 度量学习:将学习到的特征映射到新的空间使相同的人更近不同的人更远
- 图像检索:根据图片特征之间的距离进行排序,返回检索结果
数据集
- 数据集通常是通过人工标注或者检测算法得到的行人图片,目前与检测独立,注重识别
- 数据集分为训练集、验证集、Query、Gallery
- Query:probe,待检索的行人图片
- Gallery:图像库
- 在训练集上进行模型的训练,得到模型后对Query和Gallery中的图片提取特征计算相似度,对于每个Query在Gallery中找出前N个与其相似的图片
- 训练、测试中的人物身份不重复
常用数据集
单帧
CUHK03
Market1501
DukeMTMC-ReID
MSMT17
以上数量依次递增
序列- 多帧
LPW
MARS
LVReID
挑战
- 分辨率低
- 遮挡
- 视角、姿势变化
- 光照变化
- 视觉模糊性
常用评价指标
- rank-k:算法返回的排序列表中,前k位为存在检索目标则称为rank-k命中
- CMC曲线:计算rank-k的击中率,形成rank-acc曲线
- mAP曲线:反映检索的人在数据库中所有正确的图片排在排序表前面的程度,能更加全面的衡量ReID算法的性能
评价模式
- single shot:gallery中每个人的图片为一张
- multi shot:gallery中每个人的图片为N张,N越大识别率越高
- single query:probe中每个人的图片为一张
- multi query:probe中每个人的图像为n张,融合多张图片特征为最终特征
通常ReID模型的性能采用single shot+ single query模式
传统方法-手工设计特征+距离度量
手工特征
- 颜色空间:RGB、HSV、LAB、XYZ、YCbCr、ELF、ELF16
- 纹理空间:LBP、Gabor
- 局部特征:SIFT、HOG、SURF
- 专用特征:LDFV、ColorInv、SDALP、LOMO
距离度量
- 常用距离:欧氏距离、马氏距离、余弦距离
- 度量学习:LFDA、MFA、LMNN、LADF、XQDA、KISSME
深度学习方法
表征学习与度量学习
表征学习
- 把行人重识别任务当作分类问题或者验证问题来看待,没有直接在训练网络的时候考虑图片间的相似度
- 分类损失和验证损失
- 分类损失(ID分类):利用行人的ID作为训练标签来训练模型,每次只需要输入一张图片
- IDE网络
- 属性损失
- 验证损失:输入一对图片,判断两张图片是否为同一个人,等效于二分类问题
度量学习
- 通过网络学习出两张图片的相似度,在行人重识别问题上表现为同一行人的不同图片间的相似度大于不同行人的不同图片
- 损失
- 对比损失:输入两张图片,分别提取特征,计算距离
- 三元组损失:输入三张图片,一张锚点图片,一张正样本,一张负样本,学习网络,拉近正样本之间的距离,远离负样本之间的距离
- 改进三元组损失:在前面的前提下约束正样本之间的距离
- 四元组损失:一对正样本,两张不同的负样本,第三张为三元组损失,第四张为弱推动的三元组损失,目的是推开负样本之间的距离,推近正样本之间的距离
- TriHard loss(标杆)
- 核心思想:对每一个训练batch挑选p个id的行人,每个行人随机挑选k张不同的图片,即一个batch含有p✖️k张图片。之后对于batch中的每一张图片a,挑选一个最难的正样本和最难的负样本和a组成一个三元组。
- TriHard loss with adaptive weights
- 难样本挖掘
全局特征
- 每一张行人图片的全局信息进行一个特征抽取,没有任何空间信息
- 缺点
- 噪声区域对全局特征干扰大
- 姿态不对齐使全局特征无法匹配
局部特征
水平切块
Gate Siamese
- 一张图片分为n快,每一块图像经过CNN网络的到特征,局部特征按顺序输入到LSTM网络,自动表达为图像的最终的特征
- 比较早期的工作,目前不常用
AlignedReID
- 旷视提出
- 主要解决姿态不对齐的问题
- 骨架网络为ResNet50
- DMLI
- 全局与局部一起训练,在局部中引入DMLI思想
PCB
- 提取局部特征,最后合起来
ICNN
- PCB+global branch with triplet loss
- 融合全局特征和局部特征
SCPNet
- 用空间信息监督通道信息
姿态信息
PIE
Spindle Net
PDC
GLAD
PABP
分割信息
行人分割
数据集
COCO
LIP
分割算法
FCN
PSPNet
DeepLabV2
Mask RCNN
SPReID
网格特征
- IDLA
- PersonNet
- DSR
序列重识别
- Baseline(单帧–>序列)
- Baseline(CNN+LSTM)
- AMOC
- DFGP
- RQEN
基于GAN的方法
Generative adversarial networks:生成对抗网络
研发ReID产品的痛点
- 数据不够用
- 数据有偏差
GAN的作用
- 生成图像
- 减小偏差
GAN的组成
相互博弈
- 生成器:随机数–生成样本(随机输入噪声)
- 判别器:判断生成样本是否真实
警察和造假钞的犯人,警察看作是判别器,犯人看作是生成器
CycleGAN(A–>B)
- 两个生成器,一个判别器
- A域到B域
常用的GAN方法
- GAN:无法控制,随机生成样本图像
- CGAN:可以给GAN进行条件约束生成图像
- Pix2pix:可以将A域和B域的成对图像进行转换
- CycleGAN:可以将A域和B域的任意图像进行转换
基于GAN的行人重识别
- GAN+LSRO
- CamStyle
- 利用CycleGAN来实现任意两个相机之间的风格转换,再用LSRO技术对标签进行平滑
- PTGAN
- 通过将A场景的图像生成B场景的图像,提升A数据集训练的模型在B场景的性能,A数据集需要标注信息,B数据集无需标注信息
- SPGAN
- 与PTGAN类似
- PNGAN
- 生成目标姿态的样本,原图与生成的图分别使用ReID网络,最终融合两个特征
pytorch
- pytorch与caffe2之间转换用ONXX
常用类
- torch:类似numpy的张量库
- torch.autograd:自动微分库
- torch.nn:神经网络库
- torch.optim:常用的优化器,如SGD、Adam
- torch.multiprocessing:python多运算
- torch.utils:数据加载器、训练器等
常用库
- torchvision:计算机视觉库
- torchtext:自然语言处理库
- torchaudio:语音识别库
- tensorboardX:基于pytorch的tensorboard,可视化模型的训练过程和结果
工程中的小tricks
- 将ResNet的最后一个block的stride从2改为1,增大feature map
- 针对业务场景使用合适的augmentation
- Random erase可以增强泛化能力–github上可以搜到
- 随机在某块区域打码
- 用GAN造图配合label smooth可以扩充数据
- 增大batchsize可以提高TriHard损失的效率
- Label noise和长尾效应是普遍存在的
Bag of Tricks and a Strong Baseline for Deep Person Re-Identification
ID Loss Triplet Loss的不一致
ID Loss
- 分类loss
- 表征
Triplet Loss
- 度量
- 聚类
优化点
Warmup learning rate
Linearly Warmup Strategy
Random erasing augmentation
随机擦除(随机在某些区域打码)
Label smoothing
代替onehot策略,用概率的方式表示标签,正确的标签概率大,其余的平分
Lake stride=1
最后一层下层样步长由2改为1
BNNeck
加入BN层,在使用BN前计算triplet loss,BN后计算ID loss
Center loss