Large-Scale Pre-training for Person Re-identification with Noisy Labels
-
中科大,微软
-
CVPR2022
-
实用,预训练模型拿来用一般就有提升
这是一篇主要讲预训练的文章,使用大尺度自动标注的数据预训练,再在reid任务中监督训练。主要的工作在于预训练的方法,可以归类为弱监督吧。
前人为reid任务预训练模型时,是在ImageNet上训的,这不能带来什么提升,他们认为是由于imagenet里图片和reid任务中的图片有着很大的domain gap。后来也有人用大量无标注的行人数据LUPerson预训练,超过了用ImageNet的效果。进一步,他们假设如果直接用来自原始视频做预训练,就能够融入视频中空间和时间的相关性作为弱监督信号,产生更好的特征表达。
于是他们基于LUPerson的原始视频,使用FairMOT跟踪算法抽取行人检测框,为算法跟上的人赋予一个id,制作了有1千万图片43w id的数据集——LUPerson-NL, LUPerson本身是没标注的,NL意味着Noisy Labels.
他们又提出了使用这些带有噪声的标记的训练框架,Pre-training framework utilizing Noisy Labes(PNL), 包含三个模块:
-
分类监督学习模块
-
prototype based的对比学习模块
-
label guided对比学习模块
PNL框架如上图,输入图片xi,经两种数据增强T、T‘,生成 x i ~ \tilde{x_i} xi~和 x i ′ ~ \tilde{x'_i} xi′~。再分别送入编码器Eq和Ek, 和自监督训练中的Siamese网络类似,Ek没有梯度更新,其参数由Eq滑动平均得到(借鉴了自监督中常规操作)。
1. 分类学习模块
Eq的输出接fc预测分类概率,pi, 它和修正后的标签
y
i
~
\tilde{y_i}
yi~计算cross entropy损失。
L
c
e
i
=
−
log
(
p
i
[
y
i
~
]
)
L^i_{ce}=-\log{(p_i[\tilde{y_i}])}
Lcei=−log(pi[yi~])
2. prototype based的对比学习模块
怎么修正标签?这里用了一个很直觉的想法:特征距离哪些类簇中心最近就是什么类别(和kmeans聚类的想法类似,都属于EM的思想),它需要维护各个类簇的中心{c1, c2, …, ck},称作prototype(原型),以softmax的形式定义特征qi与各个类别的相似性, s i k s^k_i sik表示特征qi与ck的相似性,注意下式中分母的k和分子的k的区别。
s i k = exp ( q i ⋅ c k / τ ) ∑ k = 1 K exp ( q i ⋅ c k / τ ) s^k_i=\frac{\exp{(q_i \cdot c_k / \tau)}}{\sum^K_{k=1}\exp{(q_i \cdot c_k / \tau)}} sik=∑k=1Kexp(qi⋅ck/τ)exp(qi⋅ck/τ)
他们又认为这个相似性和当前预测的类别概率的作用各占一半,依下式去修正标签,在训练过程中,这种修正是online的。
l i = 1 2 ( p i + s i ) l_i=\frac{1}{2}(p_i+s_i) li=21(pi+si)
y i ~ = arg max j l i j \tilde{y_i}=\argmax_jl^j_i yi~=argmaxjlij if m a x j l i j > T max_jl^j_i>T maxjlij>T
y i ~ = y i \tilde{y_i}=y_i yi~=yi otherwise
T就是一个阈值,实验中,取T=0.8, τ \tau τ=0.1。接下来,怎么计算prototype?其实就是用同一修正标签下特征的滑动平均, 实验中m=0.999
c y i ~ = m c y i ~ + ( 1 − m ) q i c_{\tilde{y_i}}=mc_{\tilde{y_i}}+(1-m)q_i cyi~=mcyi~+(1−m)qi
接下来就可以计算prototype-based对比损失了,是softmax形式的cross entropy loss
L p r o i = − log e x p ( q i ⋅ c y i ~ / τ ) ∑ j = 1 K e x p ( q i ⋅ c j / τ ) L^i_{pro}=-\log \frac{exp(q_i \cdot c_{\tilde{y_i}}/ \tau)}{\sum^K_{j=1}exp(q_i\cdot c_j/\tau)} Lproi=−log∑j=1Kexp(qi⋅cj/τ)exp(qi⋅cyi~/τ)
3. label guided对比学习模块
这里参考了自监督常用的NCEloss, 简言之这个loss是为了让原图特征和它增强图的特征相近,和其他图的增强图的特征不相近。分子和分母的左边是query与正例的相似性,分母右边是query与负例的相似性(自监督里一般把当前输入的原图的特征称为query, 队列里的特征称为key)
L i c i = − l o g exp ( q i ⋅ k i + / τ ) exp ( q i ⋅ k k + / τ ) + ∑ j = 1 M exp ( q i ⋅ k j − / τ ) L^i_{ic}=-log\frac{\exp(q_i\cdot k^+_i / \tau)}{\exp(q_i \cdot k^+_k / \tau)+\sum^M_{j=1}\exp(q_i \cdot k^-_j / \tau)} Lici=−logexp(qi⋅kk+/τ)+∑j=1Mexp(qi⋅kj−/τ)exp(qi⋅ki+/τ)
这个loss只是拉开不同instance的距离,所以也会拉开同一类别中不同instance的距离,在Imagenet上使用时就发现了同类别的图片被拉远的问题,在reid的数据上,同一个人不同的图片是非常普遍的,他们也很自然地想到按标签去区分正例负例。
现在更流行的做法是像BYOL, SimSiam那样只用正例来算对比loss, 我觉得他们可以试试。
总loss就是全部加起来,参数都是1
L i = L c e i + λ p r o L p r o i + λ l g c L l g c i L_i=L^i_{ce}+\lambda_{pro}L^i_{pro}+\lambda_{lgc}L^i_{lgc} Li=Lcei+λproLproi+λlgcLlgci
分别以ImageNet数据监督、无监督,用LUPerson数据无监督,用LUPerson-NL数据PNL框架预训练,再分别用Triplet loss, 分类的loss,MGN(Learning discriminative features with multiple granu-larities for person re-identification)来finetune(这几个算法都不太新)的实验如下。
看下消融实验,观察到
-
1vs2, 只用实例对比loss比只用分类loss好
-
3vs1/2, 联合训练实例对比loss和分类loss, 比只用一个好
-
1vs4, 3vs6, 5vs7: 在原来基础上加上prototype-based 对比loss会更好
-
3vs5, 6vs7: 在原来基础上加上label-guided对比loss会更好
还可以看到, 5vs6, 6vs7, 在联合训练分类loss和prototype-based对比loss的基础上,使用实例对比loss和使用label-guided对比loss效果差别不明显.