行人重识别ReID

目录git

AlignedReIDgithub

PCB: Beyond part models: person retrieval with refined part pooling (and A strong convolutional baseline)   ECCV2018算法

Good appearance feature for multi-target-camera tracking   CVPR2018网络

Human semantic parsing for person Re-identification   CVPR2018app

SCPNet: Spatial-Channel Parallelism Network for Joint Holistic and Partial Person Re-Identification  ACCV2018框架


https://zhuanlan.zhihu.com/p/31921944ide

CVPR2018 ReID论文简评 - 罗浩.ZJU的文章 - 知乎 https://zhuanlan.zhihu.com/p/36379467函数

ECCV2018 ReID论文简评 - 罗浩.ZJU的文章 - 知乎 https://zhuanlan.zhihu.com/p/44212707性能

在监控视频中,因为相机分辨率和拍摄角度的缘故,一般没法获得质量很是高的人脸图片。当人脸识别失效的状况下,ReID就成为了一个很是重要的替代品技术。ReID有一个很是重要的特性就是跨摄像头,因此学术论文里评价性能的时候,是要检索出不一样摄像头下的相同行人图片。方法能够分为大体如下几类:学习

  • 基于表征学习的ReID方法

  • 基于度量学习的ReID方法

  • 基于局部特征的ReID方法

  • 基于视频序列的ReID 方法

  • 基于GAN造图的ReID 方法

基于度量学习的reid方法

度量学习不一样于表征学习,度量学习旨在经过网络学习出两张图片的类似度。行人重识别问题中,具体为同一行人的不一样图片类似度大于不一样行人的不一样图片。最后的网络损失使得相同行人图片(正样本对)的距离尽量小,不一样行人(负样本对)的距离尽量大。经常使用度量学习损失包括:

  • 对比损失(Contrastive loss)

  • 三元组损失(Triplet loss)

  • 四元组损失(Quadruplet loss)

  • 难样本挖掘三元组损失(Triplet Hard loss with batch hard mining, Trihard loss)

  • 边界挖掘损失(Margin sample mining loss, MSML)

首先,假若有两张输入图片  和 ,经过网络的前馈咱们能够获得他们归一化后的特征向量 。咱们定义这两张图片的特征向量的欧氏距离为:

(1)对比损失(Contrastive loss)

(2)三元组损失(Triplet loss)

(3)四元组损失(Quadruplet loss)

(4)难样本采样三元组损失(Triplet loss with batch hard mining, TriHard loss)

(5)边界挖掘损失(Margin sample mining loss, MSML)

(6)各类loss性能比较

在论文[11]之中,对上面提到的主要损失函数在尽量公平的实验的条件下进行性能对比,实验结果以下表所示。做为一个参考

 

5.基于GAN造图的ReID方法

Reid一个很是大的问题就是数据获取困难,截止cvpr2018deadline以前,最大reid数据集也就小几千个ID,几万张图片(序列嘉定只算一张)。ICCV17 GAN造图作Reid挖了坑以后,就有大量GAN工做涌现。 Zheng Z, Zheng L, Yang Y. Unlabeled samples generated by gan improve the person re-identification baseline in vitro[J]. arXiv preprint arXiv:1701.07717, 2017.这篇文章发表在ICCV17,文章简单但做为挖坑鼻祖引出一系列很好的工做。以下图,这篇文章生成的图像质量还不是很高,另一个问题就是因为图像是随机生成的,也就是说没有能够标注的label能够用。为解决这个问题,论文提出一个标签平滑的方法。就是把label vector每个元素值都取同样,知足加起来为1.反正看不出属于哪一个人,那就一碗水端平。生成的图像做为训练数据加入到训练之中,因为当时baseline不像如今这么高,因此效果还挺明显,至少数据量多了过拟合能避免不少。

除了摄像头bias,reid还有个问题就是数据集存在bias,这个bias很大一部分缘由就是环境形成的。为了克服这个bias,论文 Wei L, Zhang S, Gao W, et al. Person Transfer GAN to Bridge Domain Gap for Person Re-Identification[J]. arXiv preprint arXiv:1711.08565, 2017.使用GAN把一个数据集的行人迁移到另一个数据集。为了实现这个迁移,GAN的loss稍微设计了一下,一个是前景的绝对偏差loss,一个是正常的判别器loss。判别器loss是用来判断生成的图属于哪一个域,前景loss为了保证行人前景尽量逼真不变。这个前景mask使用PSPNet来获得的,效果以下图。文章另一个贡献就是提出了一个MSMT17数据集,不知道有没放出来。

reid其中一个难点就是姿态不一样,为了克服这个问题论文 Qian X, Fu Y, Wang W, et al. Pose-Normalized Image Generation for Person Re-identification[J]. arXiv preprint arXiv:1712.02225, 2017.使用GAN造出了一系列标准的姿态图片。论文总共提取了8个pose,这8个pose基本涵盖了各个角度。每一张图片都生成这样标准的8个pose,那么pose不一样的问题就能够解决。最终用这些图片的feature进行一个average pooling获得最终的feature,这个feature融合了各个pose的信息,很好的解决pose bias问题。不管从生成图仍是从实验结果来看,这个工做都是很不错的。这个工做吧single query作成了multi query,可是没法反驳,这些图都是GAN生成的。除了生成这些图须要额外的时间开销之外,并无利用额外的数据信息。固然这个工做也须要一个预训练pose estimation网络来进行pose提取。

总的来讲,GAN造图都是为了从某个角度上解决Reid的困难,缺啥就让GAN来补啥,不得不说GAN还真是一个强大的东西。

 

PCB: Beyond part models: person retrieval with refined part pooling (and A strong convolutional baseline) 

论文包括两部分:

一个part-based的part-bsed convolutional based(PCB)框架,融合了水平切块的局部特征来获得一个强大的ReID特征

一个refined part pooling(RPP)方法,RPP会对水平切块边缘处的网格像素进行从新调整,将它们修正到正确的part分区。最终PCB+RPP不用任何re-ranking的方式来提点,在market1501上达到93.8%的rank-1.

Abstract:在行人检索中使用part-level features会给description提供细粒度(fine-grained)的信息。而part-level features能发挥做用的前提是每个part都须要有正确的定位。人体姿式估计(humen pose estimation)是定位part的其中一种方法,单该论文利用的是每一个part内部的上下文信息的一致性(content consistency)。

论文主要有两点贡献:

  • 一是设计了PCB(part-based convolutional baseline)网络,其输入是一张图像,输出是包含数个均分的part-level的descriptor。

  • 二是提出了RPP(refined part pooling)方法,因为PCB采用的是均分特征图的策略,这样就不可避免的在各个part中引用了outliers(outliers指的是其应该属于其余part,由于在信息的一致性上更接近于其余part),因而做者提出了RPP来从新分配这些outliers。

1.PCB:A Strong convolutional baseline。下图是PCB结构

  • PCB选用ResNet50做为backbone network,PCB在resnet50的基础上作了些修改。resnet50的GAP(global average pooling)以前的层保持不变,PCB修改的是GAP层以及以后的层。

  • 首先输入图像通过backbone network获得tensor T,定义channel维的列向量为f。而后,把PCB把T水平均分红p份,通过average pooling获得p个列向量g,再使用1x1的卷积核降维获得p个比g低维的h。最后把每一个h输入到由FC(fully-connected layer)和softmax function构成的classifier中,从而预测输入的ID(注意,这里有p个参数不共享的classifier,实验发现参数不共享的效果更好)

  • 在训练时,PCB使用p个classifier的交叉熵(cross-entropy)的和做为损失函数

  • 在测试时,PCB能够选择吧p个g或者p个h进行链接获得最后的descriptor G或者H,其中G=[g1,g2,...,gp],H=[h1,h2,...,gp]

2.Refined Part Pooling

PCB的均分策略是简单地有效的,而且仍能够进行改进(Refined)从而有所提高的。

2.1 Within-part Inconsistency

在PCB中,T是被均分红p个part的。而这样的直觉是同一个part中的f理应是近似的,不一样part中的f是不类似的,而事实却不是如此。

  • 做者作了一个这样的实验,在训练PCB收敛以后,而后计算每一个f和gi(i=1,2,3....,p)的类似度,例如可使用余弦距离做为度量标准。

  • 把p设置为6,并绘制出每一个f最接近的gi,在这里,用颜色相同来表示f属于哪一个part。经过下图能够得出两个结论。

    • 一是在同一个part中的大部分f是最近似的

    • 二是有些f彷佛和其余part更接近,这就是论文所说的Within-part inconsistency现象。好比,左上角那个蓝色的f就是outlier,它在位置上属于Part1,但在语义上更接近Part5

2.2 Relocating Outliers

既然存在Within-Part Inconsistency的问题,那么能够从新分配outliers的位置从而解决这个问题,因而做者提出了RPP(Refined part pooling)。添加了RPP的PCB修改为下图的结构。

此结构相对于原来的PCB结构的变化是把原来的average pooling变成了GAP并添加了part classifier。(也就是由对每一个g或h分类变为对每一个f分类,将f类为p中的某一类)

  • 首先,在PCB收敛的基础上,对T中的每一个f执行分类的操做,具体操做能够看以下公式:其中Wi是全链接层的参数矩阵,上面这个公式是预测每一个f属于Pi的几率。而后使用来计算每一个Pi的值:其中F是tensor T的集合。这个公式的具体含义是对全部的f加权获得Pi,而这个权重是f属于该Pi的几率。

  • 经过上述操做,RPP修正了因为PCB的均分策略而产生的outliers。

2.3 Induced Training for Part Classifier

这部分主要介绍如何来训练part classifier中的W参数。具体算法以下:

  • 1.训练标注你的PCB至收敛

  • 2.移除PCB中T后面的average pooling层并添加part classifier和GAP

  • 3.固定PCB中除了part classifier之外的全部其余参数,在数据集上从新训练2中的PCB至收敛

  • 4.在数据集上微调整个网络的全部参数至收敛

3.Conclusion:文章主要有两点贡献,一是提出了PCB学习part-level features,二是提出了RPP进一步提高了PCB的性能

 

Good Appearance Feature for multi-target-camera tracking  

摘要:这是一篇将Multi-target multi-camera tracking(MTMCT)和Reid结合起来的文章。论文训练一个很好的特征表达,能够同时在MTMCT和Reid任务上取得很好的效果。算法上,文章在triplet loss基础上提出了一种新的hard mining思想,谈久了reid模型性能对MTMCT任务准确度的影响。主要贡献:

  • 为训练设计一个自适应权重的三重损失。

  • 一种新的难样本挖掘技术

文章先给出了一个用Reid作MTMCT的pipeline。这个pipeline和大多数人作法同样,先将人检测出来,而后用Reid模型提取特征,以后根据特征类似度将单摄像头和多摄像头轨迹关联起来。

Triplet loss with hard identity mining

 

  • 文中针对triplet loss提出了一个新的改进方案,其中包括两个特性:自适应的权重和新的难样本挖掘方法。首先文章分析了最流行的triple loss 和 trihard loss,认为triplet loss对于batch里每一对正负样本都是一视同仁,权重是相同的1/N,而另一个改进版的trihard loss则是挑选batch里最难的正负样本对,即只有一对正负样本对的权重是1,其余都是0.论文提出了一种新的自适应权重方法,首先计算每对样本对特征之间的距离,而后根据距离作一个softmax归一化。对于负样本对,距离越小的样本对则权重越大;同理,对于正样本对,距离越大的样本对则权重越大。这样能保证难样本对所占的权重较大,而且每对样本对都参与了loss的计算。

  • 论文第二个改进点是改变了样本对选择的方式,传统的triplet咱们都是从训练样本中随机组成。论文将hard mining的思想进一步扩展到采集样本这一环节。针对每个id,论文挑选出一些很是类似的负样本组成样本池,当训练模型挑选样本的时候,就选择这些很是难区分的样原本当negtive。这种作法进一步强化了hard mining的思想。结果显示很是有效

 

 

Human Semantic Parsing for Person Re-identification

摘要:论文提出了SPReID,经过一个预训练的Human Semantic Paarsing网络获得person图像的每个语义部分。以后将图片分为前景,头部,上身,下身和鞋子五个部分,提取每一个部分的局部特征。容易想到也能work

SPReID网络有两个分支,一个是正常的ReID分支,另一个语义分割分支。对于语义分割分支,SPReID在刚发布不久的Looking into Person(LIP)上预训练,最后获得五个语义部分,前景,头部,上身,下身和鞋子。以后将语义分割获得的结果和ReID分支获得的feature map相乘,通过global pooling分别获得5个feature,而后concatenate到一块儿获得最终的feature。整体来讲仍是比较简单的。

 

SCPNet: Spatial-Channel Parallelism Network for Joint Holistic and Partial Person Re-Identification  

开源代码:https://github.com/xfanplus/Open-SCPNet

https://zhuanlan.zhihu.com/p/56418084

摘要:全身reid取得了很好进展,但一些场景中会有遮挡状况,这种场景就须要局部reid(partial reid)。本文提出了spatial-channel parallelism network(SCPNet)。SCPNet中每组channel的特征提供了行人身体某一块空间区域的reid特征,并利用空间-通道相关性来监督网络学习一个鲁棒的特征。这个特征在全身行人重识别和遮挡行人重识别两个任务上均达到了sota性能。

 

    PCB和Aligned reid是local feature的表明方法。PCB最终要的贡献就是发现,对图像的每一个水平local feature进行loss监督训练能够提升特征的性能。而SCPNet给了咱们启示,为何监督local feature可以提升网络的性能。直观上感受,遮挡区域主要会影响遮挡区域的local feature,剩下的local feature应该还不错。而global pooling会致使遮挡区域影响整个global feature。所以local feature多是解决遮挡的一个思路。

    AlignedReID [2]是咱们的另一篇工做,我我的认为AlignedReID里面有个很不错的思路是利用local feature来监督global feature,而后在使用的时候只用global feature,达到提速的效果。而SCPNet一样传承了AlignedReID的这个思路。

    然这些方法基本都是在Market1501和DukeMTMC这些数据集下完成的,这些数据集都是通过数据清洗的,整体来讲行人图像比较完整。可是在真正实用场景下,遮挡一直是若干个痛点中的一个很大的痛点。以下图,partial-ILIDS是机场场景下拍摄的图片,行人被行李箱遮挡是很是频繁的。而遮挡场景下,行人的表观特征会被遮挡物污染,形成特征产生变化,从而使得识别错误。

    CVPR2018何凌霄师兄的DSR工做把partial ReID从新拉了回来。虽然最近出现了少许partial ReID的工做,可是有大部分都是专门针对于partial ReID的,并无对person ReID(备注:下文person ReID就默认指全身ReID,而ReID指person ReID和partial ReID)有任何促进,甚至不能应用于person ReID。而从实用的角度来说,咱们固然但愿一个方法既能提升person ReID的性能,又能提升partial ReID的性能。而这就是SCPNet的设计的初衷。

    综上,SCPNet产生的motivation有以下几点:

  • PCB显示对每一个local feature监督可以提升reid的性能,(而且在直观上咱们认为local feature有助于遮挡条件下partial ReID)

  • Aligned Reid显示了用local feature监督global feature是可行的,但愿继续传承这一思路

  • 从实用角度考虑,咱们但愿设计一个网络,既能提升person reid的性能,又能提升partial reid的性能

SCPNet

    上图是SCPNet的结构图,整体来讲是比较简单的,backbone用的是你们都用的Resnet50。和AlignedReID同样,SCPNet总共有两个分支,一个是local分支,一个是global分支。local分支也是比较传统的水平pooling获得local features。而global分支作了一点点的轻微改变,就是用一个1×1的conv层将feature map的通道维度从C维提高到4C维。

     接下来是SCPNet的核心了,对于local分支,咱们经过水平pooling能够获得四个局部特征,就是上图右上角的蓝、红、黄、绿的四个特征向量,也就是按照spatial分块获得的特征。另外,对于global分支,咱们经过升维能够获得一个  的feature map,通过pooling以后获得4C维的全局特征, 而后咱们按照channel进行分组,一样分为四组,也能获得4个global features,就是上图右下的蓝、红、黄、绿的四个特征向量,这是按照channel分组获得的特征。

     传承AlignedReID的思想,咱们设计了SCP loss将local分支的spatial信息传递给global分支,这一点后面再详细介绍。由于咱们已经将local features的信息传递global features了,传承PCB的结论,咱们对每一个global特征进行ReID loss的监督。根据目前主流的做为,每一个global feature都计算ID loss和triplet loss。

    接下来咱们可视化feature map的激活性,咱们按照channel维度将feature map分为四块,而后用local feature进行监督,最后咱们可视化了这四个feature map。结果发现,每一个feature map都重点关注图像的某个空间区域,而这也验证了咱们的想法,SCP loss将空间信息传递给了global feature的channel维度。

  • 由上面这个激活图能够猜想一下PCB有效原理:通过水平池化以后获得的局部特征,他们都会重点关注图像中的某一块区域,可是因为网络很深,其实感觉野是很大的,因此他们是能看见整张图像的,结果就是每一个局部特征都重点关注于某个区域却又能看见整张图像,经过监督若干个这种既有专攻又有全局的特征,网络可以学习到更鲁棒的特征。