深度学习系列11:ReID概述和资源

1. ReID算法介绍

综述相关资料:https://zhuanlan.zhihu.com/p/31921944
综述文章:https://arxiv.org/pdf/1610.02984.pdf
2005的论文提出了ReID的概念,并使用基本的图像特征和时空特征,通过贝叶斯网来推断是否同一个人;2014年ReID开始引入深度学习的方法。

1.1 定义

行人重识别(Person Re-identification)也称行人再识别,简称为ReID,给定一个监控行人图像,检索跨设备下的该行人图像。一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。

1.2 难点

行人重识别数据集是由一系列监控摄像头拍摄得到,并用检测算法将行人抠出,做行人的匹配。在这些数据集中,人脸是十分模糊的,无法作为匹配特征,而且由于多个摄像头拍摄视角不同,同个人可能被拍到正面,侧面,背面,具有不同的视觉特征,因此是一个比较难的图像匹配问题。

1.3 评价指标

常用评价指标包括:
rank-k:算法返回的排序列表中,前k位为存在检索目标则称为rank-k命中。eg:rank1:首位为检索目标则rank-1命中。
Cumulative Match Characteristic (CMC) curve:计算rank-k的击中率,形成rank-acc的曲线。
mAP(mean average precision):反应检索的人在数据库中所有正确的图片排在排序列表前面的程度,能更加全面的衡量ReID算法的性能。如下图,第一个人的mAP=(1/1+2/3+3/4+4/8+5/20)/5=0.633,同样可以算出第二个人的mAP = 0.756,平均值为69.45%。

1.4 损失函数

损失函数有两种定义方法:
一种是输入两张图片,预测相同则为1,否则为0,是Verification模型
另一种是输入一张图片,预测ID号,称为identification问题,是classification模型。
融合后效果如下图:

1.5 数据集

1.5.1 完整人像数据集

Market1501。用得比较多,拍摄地点在清华大学,图片数量有 32000 张左右,行人数量是 1500 个,相当于每个人差不多有 20 张照片,它是用 6 个摄像头拍的。
DukeMTMC-reID,拍摄地点是在 Duke 大学,有 36000 张照片,1800 个人,是 8 个摄像头拍的。
CUHK03,香港中文大学,13000 张照片,1467 个 ID,10 个摄像头拍的。
在 ReID 研究里,现在图片的数量集大概在几万张左右,而 ID 数量基本小于 2000,摄像头大概在 10 个以下,而且这些照片大部分都来自于学校,所以他们的身份大部分是学生。
这可以跟现在人脸数据集比较一下,人脸数据集动辄都是百万张或者千万张照片,一个人脸的 ID 多的数据集可以上百万,而且身份非常多样。这个其实就是 ReID 面对前面那么复杂的问题,但是数据又那么少的一个比较现实的情况。

1.5.2 不完整人像数据集

Occluded-REID dataset:在这篇论文中《OCCLUDED PERSON RE-IDENTIFICATION》首次制作的行人遮挡数据集。由移动相机拍摄的200个遮挡行人的2000张图像组成。每个ID由5张全身图片和5张遮挡图片组成。行人图像都被reseize成 128 × 64的大小。

P-DukeMTMC-reID dataset:该遮挡行人数据集是从DukeMTMC-reID dataset数据集人工挑选出来的,该数据集有1299个ID总共24143张图片。

P-ETHZ dataset:该遮挡行人数据集是从DukeMTMC-reID dataset数据集人工挑选出来的,该数据集有85个ID总共3847张图片。

Partial-REID dataset:在《Partial person re-identification》这篇论文首次提出的遮挡数据集,包含60个ID900张图像,每个ID由5个全身图片,5个partial(部分截断)图片,5个遮挡图像组成。

1.6 基本流程

首先需要做行人检测,接下来做ReID,抽取查询图片特征,与底库所有图片的特征计算距离,然后按照距离进行排序,取出排在前面的图片。
深度学习系列11:ReID概述和资源_第1张图片

这里是一篇入门的文章:https://zhuanlan.zhihu.com/p/50387521

2. 模型

2.1 基于表征学习的模型

论文地址:https://arxiv.org/pdf/1611.05244.pdf
CNN可以自动从原始的图像数据中根据任务需求自动提取出表征特征(Representation)。由于每个ID对应的照片并不多,不足以训练出推断ID的神经网络,因此还要结合一对图像是否属于同一个人来训练网络,损失函数分为两部分:(1)分类问题是指利用行人的ID或者属性等作为训练标签来训练模型;(2)验证问题是指输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人。
深度学习系列11:ReID概述和资源_第2张图片

上图训练需要输入两组图片,通过相同的base network(这篇论文的base network基于GoogleLeNet),因此这个网络又叫做Siamese Network,用于提取图像特征。后面的Verification网络获取这一对特征,计算是否来自于同一个人;Classification网络则用于判断特征是否能正确分类到person ID,两者的损失函数组合起来进行训练。
在进行预测时,只需要使用Verification网络,判断底库图片中哪些和检索图片一样即可。

2.2 加上行人属性的APR网络

相关资料:https://zhuanlan.zhihu.com/p/37931822
论文地址:https://arxiv.org/pdf/1703.07220.pdf
除了行人ID外,还可以为数据集添加其他的属性进行训练,包括:性别、头发长短、袖子长短、下衣长短、下衣类型、戴帽子、背包、年龄、上衣颜色 、下衣颜色。当我们识别两个人是不是一个人的时候,其实不会直接得出答案,而是先看他们的属性,是不是同性,或者说他们是不是穿一样的衣服(短时间内),这有助于我们得出最后的判断。APR模型包含两个分类模型,第一个是属性分类模型,后面跟着ID分类模型,两者的损失按照一定的比例结合起来,如下图:
深度学习系列11:ReID概述和资源_第3张图片

2.3 基于度量学习的S-CNN

论文地址:https://arxiv.org/pdf/1607.08378.pdf
表征学习里面其实已经有度量学习的成分在了。度量学习旨在通过网络学习出两张图片的相似度。在行人重识别问题上,具体为同一行人的不同图片相似度大于不同行人的不同图片。最后网络的损失函数使得相同行人图片(正样本对)的距离尽可能小,不同行人图片(负样本对)的距离尽可能大。常用的度量学习损失方法有对比损失(Contrastive loss)、三元组损失(Triplet loss)、 四元组损失(Quadruplet loss)、难样本采样三元组损失(Triplet hard loss with batch hard mining, TriHard loss)、边界挖掘损失(Margin sample mining loss, MSML)。
深度学习系列11:ReID概述和资源_第4张图片

不同的度量学习结果如下:

2.4 基于局部特征的ReID方法

2.4.1. 直接切块方法PCB

论文地址:https://arxiv.org/pdf/1607.08381.pdf
深度学习系列11:ReID概述和资源_第5张图片

如下图所示,图片被垂直等分为若干份,之后被分割好的若干块图像块按照顺序送到一个长短时记忆网络(Long short term memory network, LSTM),最后的特征融合了所有图像块的局部特征。但是这种缺点在于对图像对齐的要求比较高,如果两幅图像没有上下对齐,那么很可能出现头和上身对比的现象,反而使得模型判断错误。

2.4.2. 仿射变换对齐

论文地址:https://arxiv.org/pdf/1701.07732
使用关键点,然后通过仿射变换进行对齐:

2.4.3. ROI共享学习Spindle Net/GLAD

论文地址:http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhao_Spindle_Net_Person_CVPR_2017_paper.pdf
Spindle Net获得关键点后,抠出7个ROI区域图来,和原始图并行进行训练,如下图。橙色的部分表示参数是共享的:
深度学习系列11:ReID概述和资源_第6张图片

论文地址:https://arxiv.org/pdf/1709.04329.pdf
GLAD利用提取的人体关键点把图片分为头部、上身和下身三个部分。之后将整图和三个局部图片一起输入到一个参数共享CNN网络中,最后提取的特征融合了全局和局部的特征。为了适应不同分辨率大小的图片输入,网络利用全局平均池化(Global average pooling, GAP)来提取各自的特征。和Spindle Net略微不同的是四个输入图片各自计算对应的损失,而不是融合为一个特征计算一个总的损失。

2.4.4. 自动对齐方法AlignedReID

论文地址:https://arxiv.org/pdf/1711.08184.pdf
AlignedReID提出基于SP距离的自动对齐模型,在不需要额外信息的情况下来自动对齐局部特征。而采用的方法就是动态对齐算法,或者也叫最短路径距离。这个最短距离就是自动计算出的local distance。
深度学习系列11:ReID概述和资源_第7张图片

这个距离加上全局距离作为优化目标函数:
深度学习系列11:ReID概述和资源_第8张图片

2.4.5 多粒度网络MGN

论文地址
Mutiple Granularity Network,将全局信息和各粒度局部信息结合的端到端特征学习策略:通过将图片划分成多个条带,并且改变不同局部分支的条带数量来获得多粒度局部特征表示。这一点还挺重要的,实际应用中经常出现不完整的身体,使用MGN可以确保在部分维度上图像比较接近。
深度学习系列11:ReID概述和资源_第9张图片
主干网络使用resnet50,并且将block res_conv4_1之后的部分分成三个分支,这三个分支的结构相似,但是下采样率不同。
深度学习系列11:ReID概述和资源_第10张图片
最上面的分支为全局分支(global branch),在res_conv5_1中使用了stride=2的卷积进行下采样,对得到的feature map采用全局最大池化(global max pooling)生成2048维的特征向量,并通过1✖️1的卷积压缩为256维的特征向量。

为了让网络具备辨别的能力,论文将用于分类的softmax函数和用于度量学习的三元损失函数(triplet loss)用作训练过程中的损失函数,其中softmax loss借鉴了人脸识别中的Normface loss。

中间和下面的分支用于学习局部的特征表示,为了保留适合局部特征的感受野,这两个分支都没有使用下采样。通过在水平方向上均匀的将feature map划分为N个条带,并对N个条带分别全局最大池化和1×1卷积来得到对应的局部特征,不同的N表示不同的粒度,N越大粒度越细。中间的分支N=2,可以理解为将行人分为上半身和下半身;下面的分支N=3,可以理解为将行人分为上,中,下三个部分。

在测试的时候,将3个256维的全局特征向量和5个256维的局部特征向量concat起来得到的2048维向量作为行人的特征表示,用于相似性搜索。

2.4.6 部件定位与提取VPM

对于 partial re-ID,VPM 具有两方面的优势:1)VPM 引入了部件特征,因此,与在传统全身的行人再识别(holistic re-ID)问题中一样,部件特征受益于细粒度信息,获得更好的鉴别能力;2)由于具备可见部件感知能力,VPM 可估计出两张图像之间的共享区域,并在评估其相似性时聚焦在共享区域,这种做法符合人脑识别行人的思维习惯。
深度学习系列11:ReID概述和资源_第11张图片
VPM的结构如下,核心就是预测每个点属于哪个部件,然后计算每个部件之间的距离。
深度学习系列11:ReID概述和资源_第12张图片

2.5 基于视频序列的ReID方法

论文地址:https://arxiv.org/pdf/1711.08766.pdf
主要思路是通过landmark detector,诱导网络去对图片进行一个质量判断,用多帧的其他信息来弥补质量差的帧。
深度学习系列11:ReID概述和资源_第13张图片

2.6 基于GAN的ReID方法

总之就是缺啥就让GAN来补齐。
第一种:背景迁移

第二种:姿势迁移

第三种:摄像头迁移

2.7 基于贝叶斯推断的时空图像模型融合

相关资料:https://zhuanlan.zhihu.com/p/34778414
论文地址:https://arxiv.org/pdf/1803.07293.pdf
首先,统计同一个人不同摄像头之间时间差的分布
深度学习系列11:ReID概述和资源_第14张图片

在其他数据集上(于是我们就可以说这是一个跨数据集的任务了)预训练一个卷积神经网络,然后用这个卷积神经网络去目标数据集上提特征,用余弦距离算特征相似度
将相似度排在前十的当做同一个人,用这种“同一个人”的信息+极大似然估计构造时空模型,计算公式为:
视觉相似度*同一人产生这种移动的概率/任意两个时空点组成这种移动的概率。
对于弱图像分类器来说,融合时空特征后效果明显变好。

2.8 基于语义的方法

例如EANet:
深度学习系列11:ReID概述和资源_第15张图片
直接添加一个语义分割模块,让网络同时进行ReID任务和语义分割任务的训练,相当于把人体分割定位的约束施加给了模型,从而增强网络的定位能力。如上图,PS模块由一个stride=2的3x3 Deconv 和一个1x1 Conv层组成,Deconv用于上采样,而Conv层用于求pixelwise的loss。而语义分割的标签需要自己生成,作者另外使用一个语义分割网络在COCO Densepose数据集预训练,再用于source/target domain的数据集生成分割伪标签,再再用于ReID PS模块的训练,以此引入语义分割对位置定位的监督。

3. 应用

使用deepo的docker镜像

3.1 FastReID

原版叫ReID strong baseline,新版本里面去掉了ignite,github地址为:
https://github.com/JDAI-CV/fast-reid。
toolbox 中内置了这两种方法,一种是基于 global feature 的 strong baseline,一种是基于分块的 MGN。 然后在 BagofTricks 的基础上,将其他可能有用的 tricks 都实现了一下。
深度学习系列11:ReID概述和资源_第16张图片
在 partial re-id 上,在三个 partial 库上有了持续的提升:
深度学习系列11:ReID概述和资源_第17张图片

项目的结构遵循:https://github.com/L1aoXingyu/PyTorch-Project-Template
深度学习系列11:ReID概述和资源_第18张图片

下面介绍一下使用方法:

3.1.1 数据

数据从https://pan.baidu.com/s/1ntIi2Op下载,放到datasets下,如下:
深度学习系列11:ReID概述和资源_第19张图片
深度学习系列11:ReID概述和资源_第20张图片
使用 cd fastreid/evaluation/rank_cylib; make all 加速evaluation。

3.1.2 模型和数据配置

模型示例:
./configs/Market1501/bagtricks_R50.yml
深度学习系列11:ReID概述和资源_第21张图片
数据也写在里面:
深度学习系列11:ReID概述和资源_第22张图片

3.1.3 开始训练

可以输入./tools/train_net.py -h查看可以配置的训练项:
深度学习系列11:ReID概述和资源_第23张图片

./tools/train_net.py --config-file ./configs/Market1501/bagtricks_R50-ibn.yml MODEL.DEVICE "cuda:0"
python tools/train_net.py --config-file ./configs/Market1501/bagtricks_R50.yml --num-gpus 4

3.1.4 训练监督

笔者是P100的显卡,只能把numworkers改为0.
运行起来后,截图如下:
深度学习系列11:ReID概述和资源_第24张图片

3.1.5 验证

觉得收敛的差不多了,就中断掉,然后运行:

CUDA_VISIBLE_DEVICES=0 python tools/train_net.py --config-file "logs/market1501/bagtricks_R50/config.yaml" --eval-only  MODEL.WEIGHTS "logs/market1501/bagtricks_R50/model_0012399.pth" 

深度学习系列11:ReID概述和资源_第25张图片

3.2

https://github.com/KaiyangZhou/deep-person-reid

3.3

https://github.com/layumi/Person_reID_baseline_pytorch

你可能感兴趣的:(深度学习系列)