目标:
1. 使用预训练好的模型,进行
1.1 人脸验证
1.2 人脸识别
人脸验证
给出一组【人脸和身份】,在数据库中查找,【人脸】和【身份】是否匹配。
将两个图片送入CNN网络进行编码成128维的向量。
比较两个编码之间的距离,距离越小,越相似
CNN网络
使用FaceNet模型(别人已经训练好)
CNN的损失函数
三元组损失
- A是“Anchor”,是一个人的图像。
- P是“Positive”,是相对于“Anchor”的同一个人的另外一张图像。
- N是“Negative”,是相对于“Anchor”的不同的人的另外一张图像。
A-P的平方,每个维度相加 +
α
\alpha
α < A-N的平方,每个维度相加
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
P
i
)
∣
∣
2
+
α
<
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
N
i
)
∣
∣
2
\sum_i^n||f(A_i)-f(P_i)||^2 + \alpha < \sum_i^n||f(A_i) - f(N_i)||^2
i∑n∣∣f(Ai)−f(Pi)∣∣2+α<i∑n∣∣f(Ai)−f(Ni)∣∣2
A与P之间的距离要尽可能小,A与N之间的距离要尽可能大。
其中,
α
\alpha
α是【相同】和【不同】图像之间至少的区分度。
移项得,
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
P
i
)
∣
∣
2
−
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
N
i
)
∣
∣
2
+
α
<
0
\sum_i^n||f(A_i)-f(P_i)||^2 - \sum_i^n||f(A_i) - f(N_i)||^2 + \alpha < 0
i∑n∣∣f(Ai)−f(Pi)∣∣2−i∑n∣∣f(Ai)−f(Ni)∣∣2+α<0
我们定义,损失函数(三元组损失):
J
(
A
,
P
,
N
)
=
m
a
x
(
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
P
i
)
∣
∣
2
−
∑
i
n
∣
∣
f
(
A
i
)
−
f
(
N
i
)
∣
∣
2
+
α
,
0
)
J(A,P,N) = max(\sum_i^n||f(A_i)-f(P_i)||^2 - \sum_i^n||f(A_i) - f(N_i)||^2 + \alpha,0)
J(A,P,N)=max(i∑n∣∣f(Ai)−f(Pi)∣∣2−i∑n∣∣f(Ai)−f(Ni)∣∣2+α,0)
使J尽可能得小。
实现验证
输入【人脸】和【身份】。我们需要验证,该【人脸】是否是该【身份】。
我们可以事先将数据库中的所有【人脸】进行编码,并使用字典将【人脸】和【身份】一一对应。
之后,每当摄像头拍下一张照片,我们只需要将它放到CNN网络进行编码,然后将该编码与数据库中相应身份的编码一起计算二者的距离。若距离dist小于阈值就验证成功。
人脸识别
输入【人脸】。我们需要验证,该【人脸】是否在数据库中。
做法类似人脸验证,事先编码好数据库所有【人脸】
遍历数据库中所有人脸的编码,计算二者之间的距离。取所有距离的最小值。
如果该距离最小值小于阈值,则验证成功。