人脸验证与人脸识别
这两者不同的是,前者是一对一的,只需要对比两张图片,而后者是检验一张图片是否与数据库中的图片相同。一般来说,我们先构建好的人脸验证系统,然后再将它扩展到人脸识别的领域。
one-shot learning面对的问题是:在登记人脸图像的时候,每个员工只会提供一张图片,那么如果需要识别的数据库中只有4个成员的话,按照传统的卷积神经网络,训练集为4,训练样本过少;另外一个问题是,当成员组中每次加入一个员工时,我们需要重新训练网络。针对这个问题,我们提出的
Siamese network
提出的一种神经网络构架称为Siamese network
triplet loss
为训练神经网络的参数,定义一个损失函数triplet loss.
L
(
A
,
P
,
N
)
=
max
(
∣
f
(
A
)
−
f
(
P
)
∣
2
−
∣
f
(
A
)
−
f
(
N
)
∣
2
+
α
,
0
)
L(A,P,N)=\max(|f(A)-f(P)|^2-|f(A)-f(N)|^2+\alpha,0)
L(A,P,N)=max(∣f(A)−f(P)∣2−∣f(A)−f(N)∣2+α,0)
O
b
j
=
∑
i
=
1
m
L
(
A
i
,
P
i
,
N
i
)
\rm Obj=\sum_{i=1}^mL(A^i,P^i,N^i)
Obj=∑i=1mL(Ai,Pi,Ni)
(A,P,N分别是anchor,positive,negative的缩写。)
如何选择训练集?
首先要构成三元组,那么在训练集中一个人至少需要2张以上的照片,一般来说,选择1千人的1万张照片作为训练集。
要注意的是,当随机选择三元组的时候,网络很容易训练好,但效果却不会很好。(因为相同的人的照片本来就比不同人的照片相似度高)因此在选择三元组A,P,N的时候,我们要选择更难以区分的图片来训练。
在测试时,我们需要计算输入的图片与数据库中的图片编码之后的信号之间的距离,距离小则认为是同一个人。
face verification
除了使用triplet loss作为损失函数来训练网络之外,我们还可以选择使用交叉熵函数来解决人脸验证问题,在这种情景下,我们的训练输入是两张图片,输出是1or0.因此是一个二分类问题,可以使用逻辑回归来做。
Neural style transfer
一张图片的内容(content)混合另一种图片的风格(style)也就是对一张图片做了风格转换。
模型:卷积神经网络
对一张图片G的损失函数为:
J
(
G
)
=
α
J
c
o
n
t
e
n
t
(
C
,
G
)
+
β
J
s
t
y
l
e
(
S
,
G
)
J(G)=\alpha J_{\rm content}(C,G)+\beta J_{\rm style}(S,G)
J(G)=αJcontent(C,G)+βJstyle(S,G)
对损失函数做梯度下降,更新的是图片参数G
这里注意,神经网络的参数:权重都是不变的,变的是图片的pixel。
内容损失函数:
风格损失函数:
风格损失函数与内容损失函数不同,它的原理是计算某一层(l)层的各通道之间的相关系数,计算出风格矩阵
G
[
l
]
(
C
)
,
G
[
l
]
(
G
)
G^{[l](C)},G^{[l](G)}
G[l](C),G[l](G)(矩阵大小为
n
c
×
n
c
n_c×n_c
nc×nc),然后比较两张图片的风格矩阵的距离。