TransReID模型介绍
(侧重于方法及实现,结合代码进行介绍)
论文TransReID: Transformer-based Object Re-Identification 2021ICCV
参考:
论文:TransReID: Transformer-based Object Re-Identification
代码:https://github.com/heshuting555/TransReID
实验结果
本文率先将Transformer应用于重识别.
创新主要是在baseline的基础上加入了JPM模块和sie信息.其中sie信息为相机和视角等信息为可学习tensor,在计算中为数值相加,不改变输入的维度
下图分别为baseline和TransReID示意图
本文主要的主要方法和实现基于ViT,baseline与vit的主要差别在于损失的计算
本文主要贡献:
1 the pure transformer for ReID tasks for the first time
2 design a jigsaw patches module (JPM)
3 introduce a side information embeddings (SIE) that encodes side information by learnable embeddings
baseline方法:经Overlapping patch embed后,拼接一个[cls] token(这个拼接是对维度产生变化的),加入位置和SIE信息后(这里的+是指数值上的加),输入blocks(图中transformer layer,即为代码中block)
[cls] token,位置,SIE均为可学习的张量
Overlapping Patches 纯transformer 的方法如ViT, DeiT,把图片划分成无重叠的patches,失去了patches之间的局部邻接关系.本文使用滑动窗口生成有重叠像素的的patches,在实际代码中即为卷积操作,stride_size小于卷积核的尺寸(即patch_size).
block 本文中的block使用的是transformer中的encoder,即多头自注意力+前馈式神经网络(mlp),与VIT实现代码一致(github rwightman 实现版本),大致流程和核心代码如下:
在特征提取后,分两部分计算损失. global部分使用原始vit中的第一个[cls]最终得到的全局特征计算损失.流程及核心代码如下:
另一部分是本文的创新点之一,使用JPM模块(主要是shuffle_unit)并计算损失.计算损失的流程与global分支基本一致,特征的维度不同
关于JPM模块,主要有两步,通俗解释一下,步骤一是将前几个位置的特征直接拼接到最后,步骤二是进行shuffle操作
步骤二的操作以group=2为例进行简化举例示意,就是将图中编号1-8的patch分成两个group,然后进行transpose操作,最后view在一起,实现了按照固定规则进行shuffle
其他:
Position Embeddings.分辨率不同,不能直接用预训练,使用二线插值进行处理
使用的损失函数. 使用ID loss and triplet loss
The ID lossis the cross-entropy loss without label smoothing. For a triplet set the triplet loss LT with soft-margin is shown as follows: