- 作者:韩信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/224
- 声明:所有版权,请联系平台和作者,注明来源
- 收藏ShowMeAI查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习和总结收入,相应的课程视频可以在查看。
引言
在ShowMeAI前一篇文章 我们介绍了以下内容:
- 目标定位
- 特征点检测
- 目标检测
- 边框预测
- 非极大值抑制
- YOLO
- RCNN
本文主要介绍计算机视觉中的其他应用,包括人脸识别和神经风格迁移。
1.人脸识别
本节将介绍人脸的一些计算机视觉应用。首先,我们将验证人脸(Face Verification)和人脸识别(Face Recognition)区分:
-
:一般指一对一的问题,只需验证输入的人脸图像是否与已知的身份信息对应。
-
:一对多问题比较复杂,需要验证输入的人脸图像是否与多个已知身份信息中的一个匹配。
在上述两项任务中,人脸识别比人脸识别更难。因为假设人脸验证系统的错误率是1%,在人脸识别中,如果输出分别与K模板进行比较,相应的错误率就会增加K%。模板越多,错误率越大。
1.1 One-Shot 学习
人脸识别面临的一个挑战是,系统只需收集一个人的面部样本,就可以快速准确地识别这个人,即只使用一个训练样本来获得准确的预测结果。这被称为。
One-shot learning在数据库中 N N N个人,对于每张输入图像,Softmax输出 N 1 N 1 N 1种标签(N个人 都不是=N 1类),这种处理方法有两个缺点:
- 每个人只有一张图片,训练样本少,构建CNN网络不够强大。
- 如果数据库增加了另一个人,输出层Softmax维度会改变,相当于重建CNN网络大大增加了模型计算,不够灵活。
为了解决One-shot引入类似函数的学习问题(similarity function)。用相似函数表示两张图片的相似性 d ( i m g 1 , i m g 2 ) d(img1,img2) d(img1,img2)来表示。。
:
S i m i l a r i t y = d ( i m g 1 , i m g 2 ) Similarity = d(img1, img2) Similarity=d(img1,img2)
- d ( i m g 1 , i m g 2 ) ≤ τ d(img1,img2)\leq \tau d(img1,img2)≤τ则判定图片相似
- d ( i m g 1 , i m g 2 ) > τ d(img1,img2)> \tau d(img1,img2)>τ则判定图片不同
具体的,在人脸识别问题中,会计算测试图片与数据库中 K K K个目标的相似函数,取其中 d ( i m g 1 , i m g 2 ) d(img1,img2) d(img1,img2)最小的目标为匹配对象。若所有的 d ( i m g 1 , i m g 2 ) d(img1,img2) d(img1,img2)都很大,则表示数据库没有这个人。
1.2 Siamese 网络
我们在前面的内容里,看到CNN对于图像有很好的表征能力,训练好的模型可以通过网络层次计算对图像做非常有效的向量化表征,基于此基础我们可以构建图像相似度度量学习的网络,这就是著名的Siamese 网络,它是一种对两个不同输入运行相同的卷积网络,然后对它们的结果进行比较的神经网络。
:
上图中2张图片 x ( 1 ) x^{(1)} x(1)、 x ( 2 ) x^{(2)} x(2)分别输入两个相同的卷积网络中,经过全连接层后不再进行Softmax,而是得到特征向量 f ( x ( 1 ) ) f(x^{(1)}) f(x(1))、 f ( x ( 2 ) ) f(x^{(2)}) f(x(2))。
这时,可以通过各自网络层的输出向量之差的范数来表示两幅图片的差异度:
d ( x ( 1 ) , x ( 2 ) ) = ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 2 d(x^{(1)}, x^{(2)}) = ||f(x^{(1)}) - f(x^{(2)})||^2_2 d(x(1),x(2))=∣∣f(x(1))−f(x(2))∣∣22
注意到,在Siamese网络中,不同图片使用的是同一套CNN网络结构和参数。我们会训练网络,不断调整网络参数,使得属于同一人的图片之间 d ( x ( 1 ) , x ( 2 ) ) d(x^{(1)},x^{(2)}) d(x(1),x(2))很小,而不同人的图片之间 d ( x ( 1 ) , x ( 2 ) ) d(x^{(1)},x^{(2)}) d(x(1),x(2))很大。最终:
- 若 x ( i ) x^{(i)} x(i)、 x ( j ) x^{(j)} x(j)是同一个人,则 ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 ||f(x^{(1)})-f(x^{(2)})||^2 ∣∣f(x(1))−f(x(2))∣∣2较小
- 若 x ( i ) x^{(i)} x(i)、 x ( j ) x^{(j)} x(j)不是同一个人,则 ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 ||f(x^{(1)})-f(x^{(2)})||^2 ∣∣f(x(1))−f(x(2))∣∣2较大
相关论文:Taigman et al., 2014, DeepFace closing the gap to human level performance
1.3 Triplet 损失
回到人脸识别的任务,要构建出合适的CNN模型,我们需要引入Triplet Loss这个损失函数。
Triplet Loss需要每个样本包含三张图片:靶目标(Anchor)、正例(Positive)、反例(Negative),所以它也译作「三元组损失」。
如图所示,靶目标和正例是同一人,靶目标和反例不是同一人。Anchor和Positive组成一类样本,Anchor和Negative组成另外一类样本。
我们希望前面提到的Siamese网络中的CNN输出图像表征 f ( A ) f(A) f(A)接近 f ( D ) f(D) f(D),即 ∣ ∣ f ( A ) − f ( D ) ∣ ∣ 2 ||f(A)-f(D)||^2 ∣∣f(A)−f(D)∣∣2尽可能小,而 ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 ||f(A)-f(N)||^2 ∣∣f(A)−f(N)∣∣2尽可能大,数学上满足:
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 ≤ ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 ||f(A)-f(P)||^2\leq ||f(A)-F(N)||^2 ∣∣f(A)−f(P)∣∣2≤∣∣f(A)−F(N)∣∣2
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 ≤ 0 ||f(A)-f(P)||^2-||f(A)-F(N)||^2\leq 0 ∣∣f(A)−f(P)∣∣2−∣∣f(A)−F(N)∣∣2≤0
上述不等式约束有个问题:如果所有的图片都是零向量,即 f ( A ) = 0 , f ( P ) = 0 , f ( N ) = 0 f(A)=0,f(P)=0,f(N)=0 f(A)=0,f(P)=0,f(N)=0,那么上述不等式也满足。但是这对我们进行人脸识别没有任何作用。
我们希望得到 ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 ||f(A)-f(P)||^2 ∣∣f(A)−f(P)∣∣2远小于 ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 ||f(A)-F(N)||^2 ∣∣f(A)−F(N)∣∣2。所以,我们添加一个超参数 α \alpha α,且 α > 0 \alpha>0 α>0,对不等式约束修改如下:
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 ≤ − α ||f(A)-f(P)||^2-||f(A)-F(N)||^2\leq -\alpha ∣∣f(A)−f(P)∣∣2−∣∣f(A)−F(N)∣∣2≤−α
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 + α ≤ 0 ||f(A)-f(P)||^2-||f(A)-F(N)||^2+\alpha \leq 0 ∣∣f(A)−f(P)∣∣2−∣∣f(A)−F(N)∣∣2+α≤0
不等式中的 α \alpha α也被称为边界margin,和支持向量机中的margin类似(详细算法可以参考ShowMeAI文章 )。举个例子,若 d ( A , P ) = 0.5 d(A,P)=0.5 d(A,P)=0.5, α = 0.2 \alpha=0.2 α=0.2,则 d ( A , N ) ≥ 0.7 d(A,N)\geq0.7 d(A,N)≥0.7。
接下来,基于A,P,N三张图片,就可以定义Loss function为:
L ( A , P , N ) = m a x ( ∣ ∣ 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)
那么对于m组训练样本的数据集,我们的cost function为:
J = ∑ i = 1 m L ( A ( i ) , P ( i ) , N ( i ) ) J=\sum_{i=1}^mL(A^{(i)},P^{(i)},N^{(i)}) J=i=1∑mL(A(i