论文:Beyond Part Models: Person Retrieval with Refined Part Pooling
链接:http://openaccess.thecvf.com/content_ECCV_2018/papers/Yifan_Sun_Beyond_Part_Models_ECCV_2018_paper.pdf
代码:https://github.com/syfafterzy/PCB_RPP
这篇是ECCV2018关于行人重识别(Person Re-ID)的文章,由清华大学孙奕帆(SVDNet的作者)、郑良大神等人提出。
本文主要是提出一种既能精确划分部件信息(part-level features)而又不借助姿态估计的方法——PCB+RPP的网络框架。
PCB硬划分提取局部特征,然而简单粗暴的划分会使得对齐不够精确,于是作者考虑加入了软划分来辅助精修,但一般的软划分需要借助分割甚至是关键点和姿势估计,需要昂贵的标注成本,因此提出PCB+RPP。
这里做下补充,目前利用局部特征做 Re-ID 的方法大致分为下面两类:
1. 利用在其他数据集上训练好的姿势估计模型无监督迁移到 Re-ID 数据集上,得到局部特征的定位,根据这些提取到的关键点信息,利用图像处理(图像区域联结)的方法,得到各个部件(如头、上身,下身、手,脚等),然后基于这些分割开的部件,提取局部特征信息(part-level features),如下图CVPR2017的工作Spindle Net (http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhao_Spindle_Net_Person_CVPR_2017_paper.pdf) 就利用了14个人体关键点来提取局部特征,Spindle Net直接利用这些关键点来抠出ROI;
2.不使用额外的类似于姿势估计的模型,因此也就不需要单独对每个人体部件进行标注,而是用统一的分块方式,最常用的就是水平切块(stripe)(例如对一个行人均匀分割为固定数目的水平块)或者采用 attention 机制去locate等。
使用第一种方法虽然可以显式的定位这些人体的部件,但是也要忍受从姿势估计这个任务迁移到行人重识别任务过程中,由于 姿势估计的数据集和Re-ID的数据集之间肯定存在很大的数据偏差(datasets bias ),从而引入了新的误差,如果通过姿势估计定位带来的提升大于引入误差导致的性能降低,那么整体也是可以接受的;但是引入姿势估计一方面是模型训练的时间消耗较大,另一方面是标注的成本增加。
这篇文章第一部分PCB模型属于第二类方法,使用得是均匀水平切块(分成6块)。且对不同part用不同loss去训练(6块对应6个loss)。但是对于均匀分割来说,一个致命的问题就是:不同图像在同一part可能因为没有对齐而出现不同的语意信息(比如第一张图的从上到下的第一个水平块对应这个人的头部,但是由于第二张图顶部有很大的背景空余,导致同一个ID的人的头部出现在第四个水平块,这样会给模型的学习带来很大的干扰)。具体可以看下面这张图:
因此,有一些论文就针对分块提出了对齐的策略,如AlignedReID (https://arxiv.org/pdf/1711.08184.pdf) 就提出了基于SP距离的自动对齐模型,在不需要额外信息的情况下来自动对齐局部特征。而采用的方法就是最短路径距离。
而本文作者提出了 RPP(Refined Part Pooling) 对统一分割进行精修,这也是本文的一大亮点。(给我的感觉有那么一点像目标检测里two stages的Faster RCNN,第一步先得到proposals也就是比较粗略的信息,然后通过第二步进行回归精修得到准确的信息,只不过这边的第二步利用了局部信息,相当于在全局信息上增加了attention)
论文摘要部分首先提到,提取局部特征(part-level features)对于Re-ID这种细粒度程度很大的图像识别任务是十分重要的一步,不过先决条件是,一个行人图像的各part之间要能准确的 located 到,也就是能准确定位到行人的各part部件,不能只是严格的均匀的分割区域方式如前面提到水平切块(stripe),否则就会有很大的对齐问题需要解决,因此有时水平切块会被学界吐槽太过于“简单粗暴”,因为人体也不是方方正正的网格结构而是要考虑各part之间信息过渡的连续性。
作者没有引入姿势估计的模型,而是注重于让模型学习到有区分性的有益的部件信息,文章主要有以下2点贡献:
1.作者首先设计了新的更强的baseline网络-PCB(Part-based Convolutional Baseline),输入一张行人的图片,其能得到由几个part级别的特征得到的综合描述子用于Re-ID任务的行人匹配,PCB网络达到了state-of-the-art的程度,可以很好地作为Re-ID的baseline网络;
2.用于后续精修(refined)的池化部分RPP(Refined Part Pooling),统一的划分(PCB)不可避免地会在每一个part多多少少带来些误差,可能有些part明明更像下一部分,却因为强制划分被分在了上一部分去了,因此RPP重新指定和分配这些part到更接近真实part的那部分去,使得精修后每一part更具有代表性,也就是学习到更具有区分性的部件信息。实验证明,RPP加上PCB,可以达到很好的实验效果,例如在Market-1501数据街上,达到了 (77.4+4.2)% mAP 和 (92.3+1.5)%
rank-1 accuracy,+号后面的数字代表加上RPP后提升的效果。
主要是介绍Re-ID是在一个大的数据库里,给你一个query,检索到和这个query身份一致的人,目前大部分都是用到深度学习的方法,而且当全局信息能够很好地荣誉局部信息,一般都能取得比较好的效果,最新的取得 state of the art 的方法基本都是借助了 part-informed deep features,如下图所示:
a-e是其他借助了局部信息的方法,f是本文提出的方法:本文的方法先依靠整体划分(PCB),然后对每一个小块进行精修(RPP)(Our method employs a uniform partition and then refines each stripe)
前面提到过,要想学习到有区分性的局部特征,一个很重要的先决条件是:各part之间要能准确的 located 到。近期的这些state of the art 的方法主要就是在行人划分partition的方法上做五花八门的改变,目前利用局部特征做 Re-ID 的方法主要分为两类,前面也提到了,这里就不再详细介绍了。
作者思考如何能够使得部件更好地对齐,考虑到如果引入语义分割肯定会得到比较好的指引信息,更好地学习到局部特征,但是同时也不可避免地引入了姿势估计的误差,因此本文就从另一个角度出发,强调each part的一致性,因此作者就想到了先得到一个粗略的划分,然后通过refined来得到更好的更一致性的局部信息(单从思想出发,真的好像目标检测里二阶段的方法啊!不知道其他同学有没有这样的想法?)
这里再补充一下PCB和RPP:
PCB不会准确地划分部件,整张行人图作为输入,经PCB后输出特征图,作为一个分类网络,PCB的结构也是很简洁的,只是在backbone network上进行稍微的修改得到,而且训练过程没有用很多花里花俏的技巧。效果提升也很明显:在Market-1501数据集上,rank-1 accuracy从 85.3% 提升到 92.3% (+7.0%) , mAP从 68.5% 提升到 77.4% (+8.9%) 。
RPP是一个自适应的pooling方法,主要是改善PCB的粗划分效果,因为经PCB划分后,每一个part之间还是存在或多或少的对齐误差,即有些part的小部分信息靠近另一部分的part,这样就导致另一部分part内的部信息不一致(例如头的部分信息被划分到了上身,那就会影响上身的学习)。因此通过重新分配这些划分错误的部分到离真实信息更近的part,使得part内信息更近一致,可以有效提升效果,且在训练的时候不需要各个part的标签。具体做法:某part边缘部分的outliers重新划分到临近的parts上,这样就产生了一个part内连续性(连贯性),这使得应用part的model性能得到增强。效果:在Market-1501数据集上,RPP 在PCB上更进一步地提升了效果,达到了93.8% (+1.5%)的 rank-1 accuracy 和 81.6% (+4.2%) 的mAP。
这部分就不详细介绍了,有需要的同学自己看看paper哈,主要就是介绍Re-ID以及利用局部特征做 Re-ID 的方法的相关工作。
这部分就是本文的主体啦,详细介绍PCB和RPP的实现和细节。
1.Backbone network
本文的 Backbone network 主要用了 ResNet50,因为它的表现效果好,以及相对简洁的结构。
2.From backbone to PCB
从Backbone network到PCB只做了很小的修改,具体如下图所示:
在 全局平均池化GAP层(global average pooling)之前的结构和原始的Backbone模型也就是Resnet50完全一样,主要不同在于GAP层的改变,以及Resnet50 GAP后面的层都被移除了。
PCB的具体实现如下:
当输入一张行人图片H,经过 图中的 convolutional layers from backbone network 后,得到一个激活后的三维 tensor变量T ,定义深度特征 tensor T 中每个channel axis为 column vectors,即图中的 f ;
接着将 tensor T 分成 p个 horizontal stripes(水平块),再分别对p个 horizontal stripes 做 average pooling 就得到了p个局部特征 g ;
然后再用 1x1 conv降低 g 的维度,使其降到256维,得到新的局部特征 h;
最后每一个 h 单独经过一个全连接层后,都会被单独送入一个分类器中,即用 p个n(训练集ID数目)分类的 softmax 作为分类器进行训练;
在训练阶段时,通过 最小化(minimizing)交叉熵损失函数的 sum (p个分类器p个loss) 来优化PCB的训练;
在测试阶段时,分别串联向量g和h作为行人图像的特征表示。
PCB的重要参数和细节:
一些超参数如
对PCB的效果影响很大,因此需要选择正确的超参数。
其中,深度特征 tensor T的空间size——M和N是由backbone模型的空间降采样的比例决定的。
同时还借鉴了目标检测中的 SSD 和 R-FCN算法思想——减少降采样(down-sampling)的比例可以有效地提高特征的细粒度,于是作者去掉了 Resnet50 的最后一次 down-sampling ,从而增大了 tensor T的 size ,这是PCB取得好的效果的原因之一,
这步操作在仅仅增加了很少的时间消耗,却取得了可观的准确率提升。
因此,通过实验对比,作者得出PCB的最优设置参数如下:
这部分描述了part内部信息不一致的现象,揭示了这种强制划分存在的问题。
因此虽然这种强制均等划分简单有效,但同样是需要进的,因为它不可避免地由于划分的不精准带来的part与part之间的误差,必然会降低模型学习区分性特征的能力。
因此本文从一个新的视角去分析这种 partition errors :从 the within-part inconsistency 方面,也就是part内部的不一致性。
作者认为 column vector f in a same part of T should be similar to each other and be dissimilar to column vectors in other parts,也就是同一个part内的column vector f应该彼此之间相似,而不同part之间应该有差异。(感觉有点像triplet loss,同个ID的人靠近,不同ID的人推开)
训练PCB到收敛后,通过比较每一个column vector f 和 g 的相似度,即测量它们之间的余弦距离,找到离每一个column vector f 距离最近的 part ,具体看下面图3 ,每一个 column vector 通过一个小矩形块来表示,而且根据距离其最近的part画上不同的颜色,这样就很容易进行观察。
我们可以看到存在很多前面说到的误差 outliers,比如Part 1 里面有一些其他颜色的小矩形,这就说明,有些column vectors更像另一个part的,所以这样的强制均匀划分是存在问题的,需要进一步改进。
这一部分就介绍重点的RPP啦,由于上面提到的存在很多误差 outliers ,所以作者提出了 refined part pooling (RPP) 来纠正这些part内的不一致现象,目标是通过 column vectors f 和其最相似的 part 来对齐所有的column vectors f ,让他们回到属于自己的那个part去,这些误差 outliers就能被重新定位,找到属于它自己的位置。
更具体是,在数值上测量 f 和 每一个P(part)相似度S
然后 column vector f 根据计算得到的 S 值来重采样到最相似的那个 part 上,公式如下:
(其中,F是tensor T中所有 column vector f 的集合;{ }表示重采样操作,形成一个新的集合)
假定我们已经完成了上面公式1的重采样操作,并更新了每一个 part ,然后之前测过的相似度 S 就不起作用了,因为位置都发生变化了,所以就需要不断地重复 “相似度测量” ——> “重采样” 操作,直到收敛。
所以,RPP不再通过测量每一个 f 和 P之间的相似度,而是对每一个 f 用 6个 part classifier (假设共有6个parts)去预测的值(即 f 属于某一个P 的概率),文中是通过线性函数W加Softmax来实现 ,公式2如下:
(其中,p是设定的分成的part的数目,这里取6;W是提到的part classifier 分类器中可训练的权重矩阵)
因此RPP做的是一个“soft”的和自适应的划分操作,来精修前面PCB的“hard”和均匀划分,且由于均匀划分带来的误差 outliers 会被重新分配它们应该属于的位置,这些都是RPP带来的好处。
因此结合了RPP之后,PCB就进化成下图4这样:
RPP 和 part classifier 和后续的降采样操作,取代了原来的 average pooling 操作,而其他层跟图2是一样的,没有变化。
把每个part对应的 attention map 权值叠加回 tensor T 里(即上图的 GAP过程),得到各 part 的spatial 空间压缩后的 feature vector g ~ 后续步骤都和PCB一样~
权重矩阵W不需要各部件的label就可以训练,下面3.4节会介绍如何训练 part classifier .
这一小节主要介绍如何训练RPP,因为没有part label 信息的辅助训练,所以使用已经学习到的PCB训练好的模型,来引导新加入的RPP的训练,RPP 只有一项参数 W,训练分如下几步:
在上面的训练过程中,第一步训练好的PCB模型会引导后续的 part classifier 的训练。第三步和第四步收敛得非常快,大约总共只需要10 多个 epochs 即可。
文中的训练流程图如下:
这一小节主要介绍实验数据集和配置。
这一小节主要介绍一些实验的细节部分。
进行IDE作为对比实验(IDE is a commonly used baseline in deep re-ID systems),且做了一些改进(same backbone network,i.e., ResNet50, and with several optimizations over the original one),最终作者实验出来的IDE模型效果稍好过原来的(On Market-1501, our implemented IDE achieves 85.3% rank-1 accuracy and 68.5% mAP, which is a bit higher than the implementation)。
然后是2种PCB的结构进行实验比较,用相同的 backbone network ,有不同的结构to learn part-level features :
训练时,对训练集进行了水平翻转和normalization的增强操作,batch size 设置为64,以0.1的基础学习率训练模型60个epochs ,在40个epochs之后降低到 0.01 。backbone model 在 ImageNet 上进行预训练。
实验用2块NVIDIA TITAN XP GPUs ,框架使用Pytorch , 在 Market-1501 (12,936 training images)上训练一个 IDE model 和一个标准的 PCB大约分别需要 40 和 50分钟。PCB训练上消耗多的10多分钟主要是因为去掉了最后的降采样层,使得 tensor T 扩大了4倍。
最后实验的结果如下Table 1所示:
结论:
Table 2是Market-1501数据集上 state of the art 方法之间的对比:
分为3组
——Group 1:手工设计模型(hand-crafted methods)
——Group 2:利用全局特征的深度学习方法(deep learning methods employing global feature)
——Group 3:利用局部特征的深度学习方法(deep learning methods employing part features)
*号表示需要额外的辅助part labels
本文提出的方法在最下面,PCB以及PCB+RPP
只依靠统一均匀划分的PCB就超过了其他所有的方法,甚至包括那些需要额外的辅助part labels 来故意对齐part的方法。(可见PCB是个挺强大的baseline模型,因此作者也希望以后可以有更多人在Re-ID领域使用PCB作为baseline模型)
当PCB通过RPP精修后,每一项指标均达到最优!
Table 3是在DukeMTMC-reID and CUHK03数据集上的比较:
最终,本文的PCB+RPP方法对于Market-1501, Duke and CUHK03这三个最权威的Re-ID数据集:mAP = 81.6%, 69.2%, 57.5% 以及 Rank-1= 93.8%, 83.3% and 63.7% ,在三个数据集上均达到了 state of the art !且没有用到re-ranking,当用了re-ranking之后,在Market-1501数据集上,mAP 和 Rank-1 提升到了 91.9% and 95.1%!
这一小节是对一些重要的超参数如何设置进行试验分析,在Market-1501数据集上进行实验,但确定好参数后同样可以在其他数据集上使用(Once optimized, the same parameters are used for all the three datasets.):
1.The size of images and tensor T
image size 在 192 × 64 到 576 × 192之间的范围, 并使用 96 × 32 作为不同组实验之间的间隔;而且还设置了2个不同的降采样率进行对比,蓝色曲线为原始的降采样率,红色为对半的降采样率。
结果:
大的图像尺寸有利于学习到局部特征(a larger image size benefits the learned part feature);
小一些的 down-sampling rate (因为降采样率低了,所以 larger spatial size of tensor T)更有效,特别是对于输入的图片尺寸较小时,提升很明显。
因此,在(a)中,我们可以看到,使用384×128的图像尺寸并使用对半的down-sampling rate,与使用 576 × 192图像尺寸并使用原始的down-sampling rate达到几乎一样的表现效果。
2.The number of parts p
对比划分part数目p的效果进行实验探究
直观上看,p决定了part feature 的细粒度(即划分的p数量越多,细粒度程度越大),当p=1时,就退化成为了全局特征
结果:
由上图(b)可以看出:
当p增大时,一开始mAP和 Rank-1均提升,但不是一直提升下去,当 p = 8 或者 12 时, 准确率突然急剧下降,无论是否使用了RPP(红色曲线和蓝色曲线均呈现一致的下降趋势)
具体实验效果可以参考下图Fig6的可视化:
当p增大到 8(b) 或者 12(c),一些refined parts会和其它refined parts之间有很大程度的相似性,有些又没有分配到
因此,不是说p越大越好,而要区分的几个part之间有明显的可比性(比如人的头,人的上半身,下半身,鞋子等等)
因此实际使用中,p=6是最好的。
这一小节主要介绍PCB引导训练的重要性以及与另一篇基于 attention 机制方法的对比。
我们在前面3.4小节介绍RPP的训练时,提到使用已经学习到的PCB训练好的模型,来引导新加入的RPP的训练
原文提到:Without PCB pre-training,the network learns to partition T under no induction and becomes similar to methods driven by attention mechanism
也就是说如果没有PCB的预训练模型,网络在没有引导的情况下去学习T,来训练RPP,效果就跟基于 attention 机制方法差不多(网络自己去学)。文章做了实验,如下Table4:
无论PCB中用何种partition strategy,PCB效果总是优于基于attention的PAR方法(which learns to partition through attention mechanism)
如果没有引导,the network learns to focus on several parts through attention mechanism ,效果比加了引导的下降很多。(看图中只要RPP的那一行)
使用RPP通过预训练的PCB来引导,比通过attention mechanism来学习局部特征效果要好。
本文主要有2点贡献来解决Re-ID的问题:
1.设计了新的更强的baseline网络-PCB(Part-based Convolutional Baseline)来学习 part-informed features,目的是作为后续的RPP的引导信息,PCB采用的是强制统一均匀划分,PCB 达到了 state of the art 的水平, 未来应该会是一个广泛应用于Re-ID任务的 strong baseline 模型;
2.不过PCB太过于暴力,因此还需要 refined 一下,于是作者又提出了用于后续精修(refined)的池化部分RPP(Refined Part Pooling),用来增强每一个 part 内部的信息一致性。Refinement 之后,相似的 column vectors 会被划分到相同的 part 内,使得每一个 part 内部信息更加趋于一致。RPP不需要 part labeling information ,并且能够很大程度改善PCB的效果。