论文地址:https://arxiv.org/abs/2102.04378
代码:https://github.com/damo-cv/TransReID
这篇笔记是按照自己本人的习惯写的(一些词语、句子喜欢用英语表示);在看这篇论文之前,最好了解下ViT。感谢指教:)
程序框图如果有人想看的话,我就整理一下= =
one of the key challenges in ReID:Extracting robust feature representation.
CNN:(缺点)一次只处理一个局部邻域,由于卷积和下采样(池化、跨步卷积)操作容易造成细节信息丢失。
ReID
框架:CNN存在的问题→trandformer的优点→仍需改进的地方→提出TransReID
CNN存在的问题
ReID的关键:提取鲁棒、区分性的特征。
CNN-based method存在的问题:
Trandformer的优点
与CNN相比,ViT、DeiT证明纯transformer模型在 图像识别的特征提取 这一方面也很有效。
由于multi-head attention的引入和下采样的移除,transformer更适合解决上面提到的两个问题,理由:
仍需改进的地方
针对ReID的一些问题(遮挡、姿势变化、相机视角),仍需做出改进。
对于transformer来说,要想解决以上问题,特定模块的设计必不可少。
提出TransReID
相关损失函数:cross-entropy loss (ID loss) 和triplet loss
细粒度特征
Side information
ViT DeiT
3.1 :一些关键的改进(策略)得到baseline:Overlapping Patches+position embeddings(双线性插值)+监督学习(交叉熵损失函数+三元损失函数)
3.2 :JIM:baseline只用到全局特征→遇到遮挡、错位时需要局部特征→CNN采用局部细粒度特征→简单直接的方法不可行→提出JPM(shift+patch shuffle)
3.3:SIE
JIM、SIE以端到端方式联合训练。
两个主要阶段:特征提取+监督学习。
baseline的结构与ViT大致一致:
Overlapping Patches:ViT、DeiT将图像分割成不重叠的patches→patches周围的局部邻近结构信息丢失→我们使用滑动窗口来生成patches with overlapping pixels。
步长: S S S、patch的大小 P P P(一般 S S S比 P P P小),则相邻两个patch重叠区域的大小: ( P − S ) × P (P−S)×P (P−S)×P。像素 H × W H×W H×W的输入图像被分割成 N N N个patches:
N = N H × N W = [ H + S − P S ] × [ W + S − P S ] N=N_H×N_W=[\frac{H+S-P}S]×[\frac{W+S-P}S] N=NH×NW=[SH+S−P]×[SW+S−P]
补丁越多,性能越好,但计量算也更大。
Position Embeddings:与ViT相同,Position Embeddings编码相对应patches的位置信息,由于ReID任务的图像像素可能会与分类任务的图像像素不同,ImageNet中预训练的position embeddings不能直接拿来用,这里引入双线性插值。
监督学习:损失函数包括ID loss L I D L_{ID} LID——cross-entropy loss without label smooth、三元损失函数(with soft-margin) L T = l o g [ 1 + e x p ( ∣ ∣ f a − f p ∣ ∣ 2 2 − ∣ ∣ f a − f n ∣ ∣ 2 2 ) ] L_T=log[1+exp(||f_a-f_p||_2^2-||f_a-f_n||_2^2)] LT=log[1+exp(∣∣fa−fp∣∣22−∣∣fa−fn∣∣22)]
transformer-based strong base line利用图像的全局信息。
但遇到遮挡、错位时,我们只能观察到物体的部分信息,CNN一般使用细粒度局部特征解决这些问题。
在transformer中,简单直接的方式是将原模型最后一层的特征 Z l − 1 = [ z l − 1 0 ; z l − 1 1 , . . . , z l − 1 N ] Z_{l-1}=[z_{l-1}^0;z_{l-1}^1,...,z_{l-1}^N] Zl−1=[zl−10;zl−11,...,zl−1N]( Z l − 1 = [ z l − 1 0 ; z l − 1 1 , . . . , z l − 1 N ] Z_{l-1}=[z_{l-1}^0;z_{l-1}^1,...,z_{l-1}^N] Zl−1=[zl−10;zl−11,...,zl−1N]=[cls]token+N个patch embedings)中的 [ z l − 1 1 , . . . , z l − 1 N ] [z_{l-1}^1,...,z_{l-1}^N] [zl−11,...,zl−1N]分k组,每组都concate [cls] token z l − 1 0 z_{l-1}^0 zl−10 。将这k个特征组送入到一层transfoemer layer中,得到输出,得到输出{ f l j ∣ j = 1 , 2... , k f_l^j|j=1,2...,k flj∣j=1,2...,k},以此学习k个局部特征。
但这一方法没有充分利用global dependencies。
JPM:shuffle the patch embeddings,先置换再分组,即shuffle=shift+patch shuffle 。另外,在训练中引入干扰帮助提高模型的稳健性。具体步骤如下:
(要记得 Z l − 1 = [ z l − 1 0 ; z l − 1 1 , . . . , z l − 1 N ] Z_{l-1}=[z_{l-1}^0;z_{l-1}^1,...,z_{l-1}^N] Zl−1=[zl−10;zl−11,...,zl−1N]=[cls]token+N个patch embedings)
通过shift和shuffle操作,生成的局部特征 f l j f_l^j flj覆盖了来自不同部位的patches,具有全局判别能力。
总结:如下图所示,在原Vit/basline 模型transformer block模块中的最后一层( l l l层)transformer layer的基础上,增加了一个分支,变成两个分支(两个分支的输入都是上一层即 l − 1 l-1 l−1层的输出 Z l − 1 = [ z l − 1 0 ; z l − 1 1 , . . . , z l − 1 N ] Z_{l-1}=[z_{l-1}^0;z_{l-1}^1,...,z_{l-1}^N] Zl−1=[zl−10;zl−11,...,zl−1N])
在推理阶段,将全局特征与局部特征进行concate 作为最终的特征表达 [ f g , f l 1 , . . . , f l k ] [f_g,f_{l}^1,...,f_{l}^k] [fg,fl1,...,flk]。如果仅使用全局特征 f g f_g fg([cls] token)会减少计算量,但是性能也会稍许下降。
摄像头、视点变化,容易导致模型分辨不出不同角度的同一物体。
受Postion embeddings(encode positional information adopting learnable embeddings)启发,我们将非视觉信息整合到patch embeddings中,同样用可学习的一维embeddings保存side information。
数据集camera ID的总数量为 N C N_C NC,初始化learned side information 为 S C ∈ R N C × D S_C\in\R^{N_C×D} SC∈RNC×D,(D:embeddings dimension)。例如,如果一个图像的camera ID是 r r r,那么它的camera embedding表示为 S C [ r ] S_C[r] SC[r]。
同一副图像不同patch的Postion embeddings是不同的,但是camera embeddings是相同的。
如果可以通过视角估计算法、人工标注获得对象的视角信息,我们也可以编码视角标签为 S V [ q ] S_V[q] SV[q], S V ∈ R N V × D S_V\in\R^{N_V×D} SV∈RNV×D。
如何整合这两种信息?如果直接相加 S C [ r ] + S V [ q ] S_C[r]+S_V[q] SC[r]+SV[q],由于冗余或对抗性信息,这两个embeddings可能会相互抵消。因此,我们提出将这两个信息联合编码: S ( C , V ) ∈ R N C × N V × D S_{(C,V)}\in\R^{N_C×N_V×D} S(C,V)∈RNC×NV×D。
这样,带有camera ID是及viewpoint ID的输入序列变为 Z 0 ′ = Z 0 + λ S ( C , V ) [ r ∗ N k + q ] Z_0^{'}=Z_0+\lambda S_{(C,V)}[r*N_k+q] Z0′=Z0+λS(C,V)[r∗Nk+q], Z 0 Z_0 Z0为原始输入序列, λ \lambda λ为平衡SIE权重的超参数。
Size:256×128(Person )、256×256(Vehicle);
Data Augmention:random horizontal flipping、 padding、 random cropping 、random erasing;
Batch Size:64 with 4 images per ID;
Optimizer:SGD with a momentum of 0.9 and the weight decay of 1e-4
Learning rate :初始0.008 with cosine learning rate decay
JPM:m= 5、 k= 4(person), m= 8、k= 4(vehicle)
评测指标:CMC、mAP
当减小Overlapping Patches中滑动窗口的步长 S 时,baseline的性能有所提高,但推理时间会增加。
作者认为DeiT/ViT在计算效率方面仍有很大的提升空间。
“w/o rearrange”表示patches feature被直接分割成几部分,没有重排(shift+shuffle),“w/o local”表示仅使用全局特性监督.