什么是人脸识别
人脸验证和人脸识别
人脸验证(face verification)
- 输入图片,ID / 人名
- 判断二者是否对应(1对1问题)
人脸识别(face recognition)(
- 有 K 个人的数据库
- 输入图片
- 输出这个人的 ID 或者 未识别(1对多问题,判断是否在数据库中)
One-Shot学习
人脸识别面临的挑战:要解决一次学习问题,仅通过 一张图片/人脸 去识别是不是这个人
采用Similarity函数,表示两张图片的差异性,若差异小于某个阈值τ,则认为是同一个人的两张照片。
Siamese 网络
对于两个不同的输入,运行相同的卷积网络,然后比较,叫做Siamese网络架构
输入一个x(i),得到 f(x(i)) ,是128维的向量,求两个输入的的最终向量之间的范数,用以衡量相似程度。
衡量向量之差的范数:
改变这个网络所有层的参数,得到不同的编码结果,用反向传播来改变这些所有的参数,以确保满足条件(相同的人,d 小,不同的人,d 大)
Triplet 损失
三元组:APN
- Anchor:锚定图 是小秦
- Positive:正图 也是小秦
- Negative:负图 不是小秦
我们期望 锚定与正图的差异 < 锚定与负图 差异:
这里使用一个参数: α 作为间隔(margin)使这两种情况分的足够开。
假如d(A,P) = 0.5 ,d(A,N) = 0.51,就不满足公式中α的限定, 我们会期望d(A,P)更小 or d(A,N)更大
损失函数
- 损失函数:
取绿色部分和0的较大值,只有绿色部分>0时 L>0,而绿色部分 ≤0 时,损失直接为0,,即 不再刻意优化
- 整个网络的代价函数:单个三元组损失的总和
数据集选择
-
如果随机选择,很多样本太简单,不同人的照片使d(A,N) 很容易 比d(A,P)大很多,网络并不能从中学到什么
-
要选择比较难的组合来训练 d(A,P) ≈ d (A,N) ,这样还可以增加学习的效率
面部验证与二分类
将两个路径的输出当做逻辑回归的输入,x(i)是第 i 张图片,k代表128维度中的某个值
在人脸验证中,不使用三元组,而是创建一对儿一对儿的图片,目标标签是1表示是一个人,0表示不同的人。
利用不同的成对图片,使用反向传播算法去训练Siamese神经网络。
神经风格迁移
深度卷积网络在学什么
浅层的隐藏单元通常会找一些简单的特征,比如边缘或者颜色阴影
深层的隐藏单元会看到一张图片更大的部分,在极端的情况下,可以假设每一个像素都会影响到神经网络更深层的输出,靠后的隐藏单元可以看到更大的图片块
代价函数
代价函数,分别衡量图G和图C相似程度+图G和图S相似程度:
算法步骤:
- 随机生成白噪声图片
- 使用代价函数J(G),梯度下降将其最小化
- 更新变量G,更新函数值
内容代价函数
通常选择网络的中间层l层计算损失:
其中,a[l] [C],a[l] [G]代表图片C和图片G在l层的激活函数值,如果激活值越相似,Jcontent(C,G)函数越小。
风格代价函数
将各个高度和宽度的激活值都遍历一遍,并将通道k和通道k’的对应位置激活值相乘,得到风格矩阵Gk k’[l][S],可以表示两个通道的相关程度,同时对风格图像S和生成图像G都进行本运算。
上面手写的不清楚,就是下面的G矩阵:
对各层都使用风格代价函数,会让结果变得更好,在神经网络中使用不同的层,包括类似边缘的低级特征的层,以及高级特征的层,使得神经网络在计算风格时能够同时考虑到这些低级和高级特征
一维到三维推广
一维推广:
三维推广: