来源: 阿里巴巴和浙大
时间: arXiv:2102.04378v1
这篇文章在ViT的基础上提出了一种仅利用Transformer结构实现的ReID方法,并获得了较好的实验性能。
这篇文章的创新点包括三部分:
- 在ViT的基础上,结合BagofTricks提出了baseline方法ViT-BoT
- 在baseline上引入了Side Information Embedding(SIE),即相机的编号和图像的视角信息
- 在baseline上引入了Jigsaw Patches Module (JPM), 即类似于PCB中的stripe划分方式融合全局与局部信息。
ViT-BoT
VitBoT的结果如图2所示,
首先, 将目标区域划分成相同大小的不同patches, 这些patches可以重叠也可以不重叠,图中表示不重叠的情况。假设步长为S,每个patch的边长为P,那么patch的个数可以计算为
然后,每个patch都进行了特征的编码,除此之外还配备了一个可学习的embedding,成为class token,即途中的0索引对应的embedding,这个embedding用于编码patch的整体特征,最后一层transformer 层对于每个patch以及class token都输出了对应的特征向量,分别表示每个patch的局部可鉴别特征全局特征,这些特征可以通过组合用于ReID,也可单独利用全局信息进行ReID
另外,transformer中对于每个query都进行了位置编码,因此此处对于每个patch的编码特征以及class token的embedding都提供了位置编码,整个模型使用ImageNet上训练的ViT参数进行初始化,而位置编码由于位置和尺度不同无法直接赋值,这时通过二次线性插值计算获得初始值。
最后,计算训练损失,损失只在全局特征上计算(为什么没有在patch上也进行计算呢?),采用的结构使用了BNNeck结构,即将分类损失和度量损失进行了剥离,之前我们介绍过。度量损失计算如下:
正负样本以及anchor分别以下标 标记。
TransReID
TransReID结构如图3所示,相对于ViT-BoT主要两点不同,第一个是embedding层引入了SIE即边缘信息,第二个是局部分支的处理。
SIE
主要目的是缓解跨摄像机、跨视角等条件下的表观偏置,一般的基于CNN的方法通过设计专门的损失函数或者设计特殊的网络结构融合side information,比如相机id和视角信息等。
本文的方法直接对相机编码和视角进行了编码,然后与表观编码和位置编码进行融合。具体而言,相机id编码表示为, 视角编码表示为, 如果相机id和视角信息同时存在,则编码为, 而非,作者分析认为是避免了的相互抵消,但我觉得其原因在于联合分布优于边缘分布。对于相机id的编码对整张图像相同,而对于视角的编码则对一个目标的所有patch相同。
注意:这里是和位置编码一样的直接学习的参数,他和位置编码不同点在于对同一图像中同一目标的不同patch是相同的,而位置编码这是不同图像中相同位置的patch是相同的。
JPM
文章中将最后一层transformer分成并行的两个transformer,一个和原来的一样用于提供全局特征。另一个则用于提供局部特征。
问题的关键是如何构建局部特征,最直接的想法是将patches分成个group,然后学习个局部特征。如果按顺序划分的话,由于patch本身就是按距离有序的,因此会导致信息局限在有限连续区域内。所以本文对patch进行了随机的划分成不重叠的组。
文章中说了很多,什么shift operation, shuffle operation。本质就是随机分组。
分组之后,每组的特征再加上token class的特征放入到transformer中输出一个token class 的特征表示该组提供的局部特征,所有的组共享一个transformer,每组使用的损失函数和全局的损失函数相同。
注意 这里在获得局部特征时,不是讲每一组特征cat在一起,然后输入query数为k+1的transformer中,而是每一组单独输入query 数为的的transformer中。这样的话,其position embedding可以与整个Trans'R'eID对应起来。
实验
-
数据集
注意不是所有的数据集同时训练,而是每个数据集进行独立的训练与测试。
执行细节
- 行人的尺寸: 256x128, 车辆尺寸:256x256
- 数据增强:随机水平翻转、随机裁剪和随机擦除,padding with 10 pixels这个不是很懂
- batch构造,每个id抽4张,batchsize=64
- 优化器 SGD, 学习率从0.01采用cosine 衰减,就是将整个epoch周期作为cosine函数的
- k=4, 还设置了shift operation的shift步数m,但不知道有什么意义,实验也没有分析
- 硬件:1张V100, FP16 精度
-
ViT-BoT
表2中主要对比了使用不同backbone下的BoT下reid性能, 发现本文的ViT-BoT相对于ResNet系列性能提升明显,和ResNeSt系列差不多,但是训练时间相对于同等性能的ResNeSt要小一些。
这部分有些不清楚的地方在于不同backbone下BoT的策略和ViT-BoT是否相同? -
SIE
MSMT17仅提供了Cam ID信息, 而VeRi-776同时提供了Cam ID和View信息。可以发现:
- 使用SIE信息肯定能带来性能提升
- 两种SI融合会互相促进,文章还对比了采用S(C)+S(V)的方式,mAP为78.3, 可以发现相对于什么都不用是由提升的,但是相对于任何单独一个性能是下降的。
图4给出的是使用SIE前后对于相机id,视角产生的特征偏置的弥合作用。
a,b两个图表示的不使用SIE时,在相机ID和视角两个方面同类和不同类中样本相似度的分布,我们希望的是样本特征能够与是否同类无关,也就是说希望绿色和粉色的两个分布重合,但可以发现不用SIE时两个分布差别较明显。
c,d分别表示使用SIE之后的分布差异,可以发现两个分布有靠拢的趋势,但其实差别还是挺大的。
图5给出的是超参数的影响,文章没有讨论的是对于VeRi-776中Rank-1的非规律变化是怎么回事??
-
JPM
解释:
- groups表示k的大小
- w/o shuffle 表示不使用shuffle, 那么问题来了,是否使用了shift呢??
- w/o local 表示训练和JPM一样配置,只是测试的时候仅使用了全局特征。那么又有一个问题,使用local特征,由于存在shuffle,那相同的数据多次测试的性能会一样吗??
- 还有一个问题如果group的过程中存在overlapping会怎么样呢?
-
TransReID
没啥要说的,两个模块是能够相互促进的。
-
SOTA
撇开算法配置是否相同,单独论整个系统而言,本文提出的TransReID确实在性能上相较于一些SOTA方法有较大的提升。
结论
提出了一种纯依赖transformer的ReID方法,包括SIE和JPM两个模块。其实个人觉得JPM这块还有挺大的值得讨论的空间。