文章目录
表征学习和度量学习是行人重识别最基本的两种方法,目前几乎所有的行人重识别算法都是基于表征学习或度量学习进行拓展的。
1.表征学习
表征学习的方法没有直接在训练网络的时候考虑图片间的相似度, 而是把行人重识别任务当做分类问题或者验证问题来看待。
1.1分类损失
分类损失又称ID损失:利用行人的ID作为训练标签来训练模型,每次只需要输入一张图片。(例如market1501有751个类别,那最后一层输出神经元就有751个,损失函数即定义为分类错误率)
只有ID损失的网络称为ID Embedding网络(IDE网络)。IDE网络是ReID领域最基础的一个网络模型,类似于程序语言设计中的Hello world。特征层后接一个全连接层改变输出维度(与类别数匹配),经过Softmax激活函数计算交叉熵损失。 测试阶段使用倒数第二层的特征向量进行检索,分类FC层丢弃。
可以同时连接几个属性分类损失,增强ReID特征的性能。每一个属性损失都是一个分类的交叉熵。可以等效于一个multi-task的网络。测试阶段将所有分类FC丢弃,只使用ReID特征。
1.2验证损失
验证损失:输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人,等效于二分类问题(是或否)。
每次输入一对(两张)图片,进入同一个Siamese网络(连体网络)提取特征。融合两个特征信息计算一个二分类损失(验证损失)。训练阶段可以和ID损失一起使用。测试阶段输入两张图片,直接判断该两张图片是否属于一个行人。
1.3表征学习总结
1)通过构造网络来直接得到鲁棒的ReID特征,不直接学习图片之间的相似性
2)通常需要额外的FC层来辅导特征学习,测试阶段FC层会被丢弃
3)ID损失的FC层维度与ID数量一致,当训练集太大时网络巨大,训练收敛很难
4)验证损失测试的时候需要输入一对图片,识别效率很低
5)表征学习通常而言训练比较稳定,结果易复现
6)表征学习的分布式训练通常比较成熟
2.度量学习
度量学习旨在通过神经网络学习出两张图片的相似度。在行人重识别问题上, 表现为同一行人的不同图片间的相似度大于不同行人的不同图片。表征学习和度量学习最大的区别在于:前者没有距离度量函数,后者得loss function则是在距离度量函数的基础上进行考虑的。
2.1 Introduction
度量学习旨在学习出两张图片的相似性。定义一个映射:
f
(
x
)
:
R
F
→
R
D
f(x):{\mathbb{R}^F} \to {\mathbb{R}^D}
f(x):RF→RD
其中,
R
F
{R}^F
RF 为图像空间,
R
D
{R}^D
RD为特征空间,
f
(
x
)
f(x)
f(x)为我们要学习的网络模型。
将图片从原始域映射到特征域, 之后再定义一个距离度量函数:
D
(
x
,
y
)
:
R
D
×
R
D
→
R
D(x,y):{\mathbb{R}^D} \times {\mathbb{R}^D} \to \mathbb{R}
D(x,y):RD×RD→R
通过这个距离度量函数来计算两个特征向量之间的距离。最后通过最小化网络的度量损失, 来寻找一个最优的映射
f
(
x
)
f(x)
f(x) , 使得相同行人两张图片(正样本对)的距离尽可能小, 不同行人两张图片(负样本对)的距离尽可能大。这个映射
f
(
x
)
f(x)
f(x) , 就是我们训练得到的深度卷积网络。
欧氏距离:
d
I
1
,
I
2
=
∥
f
I
1
−
f
I
2
∥
2
{d_{{I_1},{I_2}}} = {\left\| {{f_{{I_1}}} - {f_{{I_2}}}} \right\|_2}
dI1,I2=∥fI1−fI2∥2
余弦距离:
d
I
1
,
I
2
=
1
−
f
I
1
⋅
f
I
2
∥
f
I
1
∥
2
∥
f
I
2
∥
2
{d_{{I_1},{I_2}}} = 1 - \frac{{{f_{{I_1}}} \cdot {f_{{I_2}}}}}{{{{\left\| {{f_{{I_1}}}} \right\|}_2}{{\left\| {{f_{{I_2}}}} \right\|}_2}}}
dI1,I2=1−∥fI1∥2∥fI2∥2fI1⋅fI2
距离函数是连续的,所以可以训练一个End-to-End 的网络模型。
度量学习就是使相同ID的图片在特征空间内尽量靠近,不同ID的图片在特征空间内尽量远离(类似于聚类)。
假设有
i
,
j
i,j
i,j两张图片,它们通过神经网络学习到的特征向量为
x
^
i
,
x
^
j
{\hat x_i},{\hat x_j}
x^i,x^j,这两个特征向量之间的距离为:
D
M
(
x
^
i
,
x
^
j
)
=
(
x
^
i
−
x
^
j
)
T
M
(
x
^
i
−
x
^
j
)
{D_M}({\hat x_i},{\hat x_j}) = {({\hat x_i} - {\hat x_j})^T}M({\hat x_i} - {\hat x_j})
DM(x^i,x^j)=(x^i−x^j)TM(x^i−x^j)
传统的度量学习就是在
x
^
i
,
x
^
j
{\hat x_i},{\hat x_j}
x^i,x^j固定的前提下选取合适的方阵
M
M
M ,但是现在的深度学习正好反过来。深度学习中,如果使用欧氏距离,则方阵
M
M
M 就是单位矩阵,我们不需要再学习方阵
M
M
M ,而是通过学习不同的网络参数来获得更好的特征向量(传统度量学习中特征向量是不变的,因为网络参数固定)。
另一方面,从数学的角度看,方阵
M
M
M如果对称的话,则一定可以分解成
M
=
A
T
A
M = {A^T}A
M=ATA的形式,如果不对称,也可以找到符合
M
≈
A
T
A
M \approx {A^T}A
M≈ATA的近似解,这就相当于将矩阵A放在了网络参数中进行学习。
度量学习的损失函数类型有很多,其中比较经典的有以下几种:
对比损失(Contrastive loss),三元组损失(Triplet loss),改进三元组损失( lmproved triplet loss),四元组损失(Quadruplet loss),TriHard loss。
2.2 对比损失
损失函数形式为
L
c
=
y
d
I
a
,
I
b
2
+
(
1
−
y
)
(
α
−
d
I
a
,
I
b
)
+
2
{L_{\text{c}}} = yd_{{I_a},{I_b}}^2 + (1 - y)(\alpha - {d_{{I_a},{I_b}}})_ + ^2
Lc=ydIa,Ib2+(1−y)(α−dIa,Ib)+2
其中
d
I
1
,
I
2
=
∥
f
I
1
−
f
I
2
∥
2
{d_{{I_1},{I_2}}} = {\left\| {{f_{{I_1}}} - {f_{{I_2}}}} \right\|_2}
dI1,I2=∥fI1−fI2∥2,
(
z
)
+
{(z)_ + }
(z)+ 表示
max
(
z
,
0
)
\max (z,0)
max(z,0)。对于该损失函数,可以这么理解:每次输入一对(两张)图片,拉近正样本对(y=1)间距离趋于0,推开负样本对(y=0)间距离大于
α
\alpha
α 。
2.3 三元组损失
选三张图片:anchor(锚点),positive(与原点属于同类别的正样本),ngative(与原点属于不同类别的负样本)。
我们希望:
d
a
,
p
+
α
<
d
a
,
n
{d_{a,p}} + \alpha < {d_{a,n}}
da,p+α<da,n
所以损失函数形式为:
L
t
=
(
d
a
,
p
−
d
a
,
n
+
α
)
+
{L_t} = {({d_{a,p}} - {d_{a,n}} + \alpha )_ + }
Lt=(da,p−da,n+α)+
即正样本对的距离应比负样本对的距离小
α
\alpha
α 。
三元组损失有一个缺点:它更关注相对距离,不考虑绝对距离。换句话说,它控制的是
d
a
,
p
−
d
a
,
n
{d_{a,p}} - {d_{a,n}}
da,p−da,n,而不是
d
a
,
p
{d_{a,p}}
da,p。
2.4 改进三元组损失
为了改善三元组损失的缺陷,又提出了改进三元组损失:
L
t
=
d
a
,
p
+
(
d
a
,
p
−
d
a
,
n
+
α
)
+
{L_t} = {d_{a,p}} + {({d_{a,p}} - {d_{a,n}} + \alpha )_ + }
Lt=da,p+(da,p−da,n+α)+
此时,
d
a
,
p
{d_{a,p}}
da,p 的值也会影响损失函数的值。
2.5 四元组损失
输入四张图片,一个anchor,一个正样本,两张负样本,共3个ID。
L
t
=
(
d
a
,
p
−
d
a
,
n
1
+
α
)
+
+
(
d
a
,
p
−
d
n
1
,
n
2
+
β
)
+
{L_t} = {({d_{a,p}} - {d_{a,n1}} + \alpha )_ + } + {({d_{a,p}} - {d_{n1,n2}} + \beta )_ + }
Lt=(da,p−da,n1+α)++(da,p−dn1,n2+β)+
损失函数中,第一项为正常的三元组损失,第二项为弱推动的三元组损失(
β
\beta
β通常小于
α
\alpha
α )。此外,四元组损失的第二项也在一定程度上解决了三元组损失不考虑绝对距离的缺陷。
2.6 TriHard loss
难样本挖掘:传统的度量学习方法是随机采样组成元祖样本,但是这样采集的样本通常是一些非常容易识别的样本,不利于训练表达能力强的ReID网络。为了解决这个问题,提出了TriHard loss(有时也称Hard loss)。
TriHard loss(Triplet loss with hard example mining)的核心思想是:对于每一个训练batch挑选P个ID的行人,每个行人,随机挑选K张不同的图片,即一个batch含有P×K张图片。之后对于batch中的每一张图片a,我们可以挑选一个最难的正样本和一个最难的负样本和a组成一个三元组。首先我们定义和a为相同ID的图片集为A,剩下不同ID的图片集为B,则TriHard损失表示为:
L
t
h
=
1
P
×
K
∑
a
∈
b
a
t
c
h
(
max
p
∈
A
d
a
,
p
−
min
n
∈
B
d
a
,
n
+
α
)
+
{L_{th}} = \frac{1}{{P \times K}}\sum\limits_{a \in batch} {{{(\mathop {\max }\limits_{p \in A} {d_{a,p}} - \mathop {\min }\limits_{n \in B} {d_{a,n}} + \alpha )}_ + }}
Lth=P×K1a∈batch∑(p∈Amaxda,p−n∈Bminda,n+α)+
这个定义其实有点类似于聚类中簇间最大相似度(簇间最小距离),即将两簇之间距离最近的样本间距作为簇间距,使得簇间距满足模型要求。
2.7 Triple loss with adaptive weights
三元组损失选取的样本通常是一些非常容易识别的样本,而TriHard loss选取样本过于极端。针对这个缺陷,有人提出了自适应权重的Triplet loss,该损失函数考虑到了所有的样本对,并根据距离赋予不同的权重。其函数形式为:
L
3
=
[
m
+
∑
x
p
∈
P
(
a
)
w
p
d
(
x
a
,
x
p
)
−
∑
x
n
∈
N
(
a
)
w
n
d
(
x
a
,
x
n
)
]
+
w
p
=
e
d
(
x
a
,
x
p
)
∑
x
∈
P
(
a
)
e
d
(
x
a
,
x
)
,
w
n
=
e
−
d
(
x
a
,
x
n
)
∑
x
∈
N
(
a
)
e
−
d
(
x
a
,
x
)
\begin{array}{c} {L_3} = {[m + \sum\limits_{{x_p} \in P(a)} {{w_p}d({x_a},{x_p}) - } \sum\limits_{{x_n} \in N(a)} {{w_n}d({x_a},{x_n})} ]_ + }\\ {w_p} = \frac{{{e^{d({x_a},{x_p})}}}}{{\sum\limits_{x \in P(a)} {{e^{d({x_a},x)}}} }},{\rm{ }}{w_n} = \frac{{{e^{ - d({x_a},{x_n})}}}}{{\sum\limits_{x \in N(a)} {{e^{ - d({x_a},x)}}} }} \end{array}
L3=[m+xp∈P(a)∑wpd(xa,xp)−xn∈N(a)∑wnd(xa,xn)]+wp=x∈P(a)∑ed(xa,x)ed(xa,xp),wn=x∈N(a)∑e−d(xa,x)e−d(xa,xn)
自适应权重损失根据样本对之间的距离计算自适应权重。对于正样本对,距离越大,权重越大;对于负样本对,距离越大,权重越小。
2.8 度量学习总结
• 通过构造网络来直接学习图片之间的相似性
• 不需要额外的FC层来辅导特征学习
• 网络大小与训练集规模无关,但是数据采样器时间消耗会增加
• TriHard Loss为目前业界度量学习的标杆
• 度量学习通常而言训练比较随机,需要一定的训练经验
• 度量学习的分布式训练不太成熟,通常需要自己实现部分代码
3. 总结
表征学习的趋势是得到每个ID间的分界面;度量学习类似于聚类,将相同ID的样本聚合在一起,不同ID的样本尽量分开。
可以结合表征学习和度量学习联合训练,但是测试阶段表征学习的FC层还是要丢弃。