文章目录
1. What is face recognition
首先简单介绍一下人脸验证(face verification)和人脸识别(face recognition)的区别。
-
人脸验证:输入一张人脸图片,验证输出与模板是否为同一人,即一对一问题。
-
人脸识别:输入一张人脸图片,验证输出是否为K个人中的某一个,即一对多问题。
一般地,人脸识别比人脸验证更难一些。因为假设人脸验证系统的错误率是1%,那么在人脸识别中,输出分别与K个模板都进行比较,则相应的错误率就会增加,约K%。模板个数越多,错误率越大一些
2.One Shot Learning
One-shot learning就是说数据库中每个人的训练样本只包含一张照片,然后训练一个CNN模型来进行人脸识别。若数据库有K个人,则CNN模型输出softmax层就是K维的。
One Shot Learning问题
- 对于存在于数据库中的人脸图片,系统能够识别到对应的人;而不在数据库中的人脸图片,则系统给出无法通过识别的结果。
- 每个人只有一张图片,训练样本少,构建的CNN网络不够健壮。
- 若数据库增加另一个人,输出层softmax的维度就要发生变化,相当于要重新构建CNN网络,使模型计算量大大增加,不够灵活。
similarity function
为了解决One-shot learning的问题,需要让神经网络学习 Similarity 函数:
- d(img1, img2):两张图片的差异度
- 输入:两幅图片
- 输出:两者之间的difference
- 如果 d(img1,img2)⩽τ,则输出“same”;
如果d(img1,img2)>τ,则输出“different”
若所有的d(img1,img2)都很大,则表示数据库没有这个人。
3.Siamese Network
利用Siamese 网络来实现 Similarity 函数。
若一张图片经过一般的CNN网络(包括CONV层、POOL层、FC层),最终得到全连接层FC,该FC层可以看成是原始图片的编码encoding,表征了原始图片的关键特征。这个网络结构我们称之为Siamese network。也就是说每张图片经过Siamese network后,由FC层每个神经元来表征。
Similarity 函数实现:
将Similarity 函数表示成两幅图片编码之差的范数:
4. Triplet Loss
如何通过学习神经网络的参数,得到优质的人脸图片的编码?方法之一就是定义 Triplet 损失函数,并在其之上运用梯度下降。
为了使用Triplet 损失函数,我们需要比较成对的图像(三元组术语):
- Anchor (A): 目标图片;
- Positive(P):与Anchor 属于同一个人的图片;
- Negative(N):与Anchor不属于同一个人的图片。
对于Anchor 和 Positive,我们希望二者编码的差异小一些;
对于Anchor 和Negative,我们希望他们编码的差异大一些。
所以我们的目标以编码差的范数来表示为:
也就是说:
上面的公式存在一个问题就是,当f(A) = f(P ) =f(N) =0时,也就是神经网络学习到的函数总是输出0时,或者f(A) = f(P ) = f(N))时,也满足上面的公式,但却不是我们想要的目标结果。
所以为了防止出现这种情况,我们对上式进行修改,使得两者差要小于一个较小的负数α(margin ):
不同 margin 值的设置对模型学习具有不同的效果,margin 的作用就是拉大了 Anchor与Positive 图片对 和 Anchor与Negative 图片对之间的差距。
Triplet 损失函数
Triplet 损失函数的定义基于三张图片:Anchor、Positive、Negative。
整个网络的代价函数:
三元组(A,P,N)的选择
增加学习算法的计算效率,避免那些太简单的三元组。
最终通过训练,我们学习到的参数,会使得对于同一个人的图片,编码的距离很小;对不同人的图片,编码的距离就很大。
对于大型的人脸识别系统,常常具有上百万甚至上亿的训练数据集,我们并我容易得到。所以对于该领域,我们常常是下载别人在网上上传的预训练模型,而不是从头开始。
5. Face Verification and Binary Classification
除了利用 Triplet 损失函数来学习人脸识别卷积网络参数的方法外,还有其他的方式。我们可以将人脸识别问题利用Siamese网络当成一个二分类问题,同样可以实现参数的学习。
Siamese 二分类改进
对两张图片应用Siamese 网络,计算得到两张图片的N维编码,然后将两个编码输入到一个logistic regression 单元中,然后进行预测。
- 如果是相同的人,那么输出是1;
- 如果是不同的人,输出是0。那么这里我们就将人脸识别的问题,转化为一个二分类问题。
对于最后的sigmoid函数,我们可以进行如下计算:
我们以两个图片编码向量对应元素之间的差值作为特征输入到logistic regression 的单元中,增加参数wi和b,通过训练得到合适的参数权重和偏置,进而判断两张图片是否为同一个人。
同时输入逻辑回归单元的特征可以进行更改,如还可以是:
在实际的人脸验证系统中,我们可以对数据库的人脸图片进行预计算,存储卷积网络得到的编码。当有图片进行识别时,运用卷积网络计算新图片的编码,与预计算保存好的编码输入到逻辑回归单元中进行预测。这样可以提高我们系统预测的效率,节省计算时间。
总结:
利用Siamese 网络,我们可以将人脸验证当作一个监督学习,创建成对的训练集和是否同一个人的输出标签。
我们利用不同的图片对,使用反向传播的算法对Siamese网络进行训练,进而得到人脸验证系统。
6. What is neural style transfer
神经风格迁移是CNN模型一个非常有趣的应用。它可以实现将一张图片的风格“迁移”到另外一张图片中,生成具有其特色的图片。比如我们可以将毕加索的绘画风格迁移到我们自己做的图中,生成类似的“大师作品”,很酷不是吗?
一般用C表示内容图片,S表示风格图片,G表示生成的图片。
7. What are deep ConvNets learning
在进行神经风格迁移之前,我们先来从可视化的角度看一下卷积神经网络每一层到底是什么样子?它们各自学习了哪些东西。
典型的CNN网络如下所示:
我们希望看到不同层的隐藏单元的计算结果。依次对各个层进行如下操作:
- 在当前层挑选一个隐藏单元;
- 遍历训练集,找到最大化地激活了该运算单元的图片或者图片块;
- 对该层的其他运算单元执行操作。
首先来看第一层隐藏层,遍历所有训练样本,找出让该层激活函数输出最大的9块图像区域;然后再找出该层的其它单元(不同的滤波器通道)激活函数输出最大的9块图像区域;最后共找9次,得到9 x 9的图像如下所示,其中每个3 x 3区域表示一个运算单元。
可以看出,第一层隐藏层一般检测的是原始图像的边缘和颜色阴影等简单信息。
继续看CNN的更深隐藏层,随着层数的增加,捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体。
8.图片风格迁移的Cost Function
为了实现神经风格迁移,我们需要为生成的图片定义一个代价函数。
对于神经风格迁移,我们的目标是由内容图片C和风格图片S,生成最终的风格迁移图片G:
所以为了实现神经风格迁移,我们需要定义关于G的代价函数J,以用来评判生成图片的好坏:
其中
- Jcontent(C,G)代表生成图片G的内容和内容图片C的内容的相似度;
- Jstyle(S,G)代表生成图片G的内容和风格图片S的内容的相似度;
- α、β两个超参数用来表示以上两者之间的权重
神经风格迁移的基本算法流程是:首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)不断减小,从而使G逐渐有C的内容和G的风格,如下图所示。
对于上图的内容图片C和风格图片S,通过梯度下降算法一次次的徐训练,我们可以由初始的噪声图片得到最终的风格迁移图片G。
9. Content Cost Function
Content cost Function:
10.Style Cost Function
**“Style”**的含义:
对于一个卷积网络中,我们选择网络的中间层
, 定义“Style”表示
层的各个通道激活项之间的相关性。
上面是我们选出的
层的激活项,对于不同的通道值,代表不同的神经元所学习到的特征,这里假如红色的通道可以找到图片中含有垂直纹理特征的区域,黄色通道可以找出橙色的区域。
而相关性大小的含义就是,如假设中,图片出现垂直纹理特征的区域显示橙色可能的大小。
我们将相关系数应用到风格图片 S 和生成图片 G 的对应通道上,就可以度量风格图片和生成图片的相似度。
Style Matric
代价函数:
11.1D和3D Generalizations
在我们上面学过的卷积中,多数是对图形应用2D的卷积运算。同时,我们所应用的卷积运算还可以推广到1D和3D的情况。
2D和1D卷积: