- 作者:韩信子@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/35
- 本文地址:http://www.showmeai.tech/article-detail/224
- 申明:版权所有,转载请分割平台与作者并注明出处
珍藏ShowMeAI查看更多精彩内容
本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习与总结整顿所得,对应的课程视频能够在这里查看。
引言
在ShowMeAI前一篇文章 CNN利用:指标检测 中咱们对以下内容进行了介绍:
- 指标定位
- 特色点检测
- 指标检测
- 边框预测
- 非极大值克制
- YOLO
- RCNN
本篇次要介绍计算机视觉中其余利用,包含人脸识别和神经格调迁徙。
1.人脸识别
咱们本节要介绍到人脸的一些计算机视觉利用,首先咱们对人脸验证(Face Verification)和人脸识别(Face Recognition)做一个辨别:
- 人脸验证:个别指一个一对一问题,只须要验证输出的人脸图像是否与某个已知的身份信息对应。
- 人脸识别:一个更为简单的一对多问题,须要验证输出的人脸图像是否与多个已知身份信息中的某一个匹配。
下面2个工作中,个别人脸识别比人脸验证更难一些。因为假如人脸验证零碎的错误率是1%,那么在人脸识别中,输入别离与K个模板都进行比拟,则相应的错误率就会减少,约K%。模板个数越多,错误率越大。
1.1 One-Shot 学习
人脸识别所面临的一个挑战是要求零碎只采集某人的一个面部样本,就能疾速精确地辨认出这个人,即只用一个训练样本来取得精确的预测后果。这被称为One-Shot学习。
One-shot learning对于数据库中的\( N\) 集体,对于每张输出图像,Softmax输入\( N+1\) 种标签(N集体+都不是=N+1品种别),这种解决办法有两个毛病:
- 每个人只有一张图片,训练样本少,构建的CNN网络不够强壮。
- 若数据库减少另一个人,输入层Softmax的维度就要发生变化,相当于要从新构建CNN网络,使模型计算量大大增加,不够灵便。
为了解决One-shot学习的问题,引入了类似函数(similarity function)。类似函数示意两张图片的类似水平,用\( d(img1,img2)\) 来示意。若\( d(img1,img2)\) 较小,则示意两张图片类似,是同一个人;若\( d(img1,img2)\) 较大,则示意两张图片不是同一个人。
类似函数定义及断定规定如下:
$$Similarity = d(img1, img2)$$
- \( d(img1,img2)\leq \tau\) 则断定图片类似
- \( d(img1,img2)> \tau\) 则断定图片不同
具体的,在人脸识别问题中,会计算测试图片与数据库中\( K\) 个指标的类似函数,取其中\( d(img1,img2)\) 最小的指标为匹配对象。若所有的\( d(img1,img2)\) 都很大,则示意数据库没有这个人。
1.2 Siamese 网络
咱们在后面的内容里,看到CNN对于图像有很好的表征能力,训练好的模型能够通过网络档次计算对图像做十分无效的向量化表征,基于此基础咱们能够构建图像类似度度量学习的网络,这就是驰名的Siamese 网络,它是一种对两个不同输出运行雷同的卷积网络,而后对它们的后果进行比拟的神经网络。
Siamese网络的大抵构造如下:
上图中2张图片\( x^{(1)}\) 、\( x^{(2)}\) 别离输出两个雷同的卷积网络中,通过全连贯层后不再进行Softmax,而是失去特征向量\( f(x^{(1)})\) 、\( f(x^{(2)})\) 。
这时,能够通过各自网络层的输入向量之差的范数来示意两幅图片的差别度:
$$d(x^{(1)}, x^{(2)}) = ||f(x^{(1)}) - f(x^{(2)})||^2_2$$
留神到,在Siamese网络中,不同图片应用的是同一套CNN网络结构和参数。咱们会训练网络,一直调整网络参数,使得属于同一人的图片之间\( d(x^{(1)},x^{(2)})\) 很小,而不同人的图片之间\( d(x^{(1)},x^{(2)})\) 很大。最终:
- 若\( x^{(i)}\) 、\( x^{(j)}\) 是同一个人,则\( ||f(x^{(1)})-f(x^{(2)})||^2\) 较小
- 若\( x^{(i)}\) 、\( x^{(j)}\) 不是同一个人,则\( ||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(D)\) ,即\( ||f(A)-f(D)||^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\leq 0$$
上述不等式束缚有个问题:如果所有的图片都是零向量,即\( f(A)=0,f(P)=0,f(N)=0\) ,那么上述不等式也满足。然而这对咱们进行人脸识别没有任何作用。
咱们心愿失去\( ||f(A)-f(P)||^2\) 远小于\( ||f(A)-F(N)||^2\) 。所以,咱们增加一个超参数\( \alpha\) ,且\( \alpha>0\) ,对不等式束缚批改如下:
$$||f(A)-f(P)||^2-||f(A)-F(N)||^2\leq -\alpha$$
$$||f(A)-f(P)||^2-||f(A)-F(N)||^2+\alpha \leq 0$$
不等式中的\( \alpha\) 也被称为边界margin,和反对向量机中的margin相似(具体算法能够参考ShowMeAI文章 SVM模型详解)。举个例子,若\( d(A,P)=0.5\) ,\( \alpha=0.2\) ,则\( d(A,N)\geq0.7\) 。
接下来,基于A,P,N三张图片,就能够定义Loss function为:
$$L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-F(N)||^2+\alpha,\ 0)$$
那么对于m组训练样本的数据集,咱们的cost function为:
$$J=\sum_{i=1}^mL(A^{(i)},P^{(i)},N^{(i)})$$
对于训练样本,必须保障同一人蕴含多张照片,否则无奈应用这种办法。例如10k张照片蕴含1k个不同的人脸,则均匀一个人蕴含10张照片。这个训练样本是满足要求的。
数据筹备结束之后,就能够应用梯度降落算法,一直训练优化CNN网络参数,让咱们数据集上的cost function一直减小靠近0。
一些训练细节:
① 同一组训练样本,A,P,N的抉择尽可能不要应用随机选取办法。
- 因为随机抉择的A与P个别比拟靠近,A与N相差也较大,毕竟是两个不同人脸。
- 这样的话,兴许模型不须要通过简单训练就能实现这种显著辨认,然而抓不住要害区别。
② 最好的做法是人为抉择A与P相差较大(例如换发型,留胡须等),A与N相差较小(例如发型统一,肤色统一等)。
- 这种人为地减少难度和混同度会让模型自身去寻找学习不同人脸之间要害的差别,「尽力」让\( d(A,P)\) 更小,让\( d(A,N)\) 更大,即让模型性能更好。
如下为一些A、P、N的例子:
相干论文:Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering
1.4 人脸验证与二分类模式
除了Triplet损失函数,二分类构造也可用于学习参数以解决人脸识别问题。其做法是输出一对图片,将两个Siamese网络产生的特征向量输出至同一个Sigmoid单元,输入1则示意是辨认为同一人,输入0则示意辨认为不同的人。
在上述网络中,每个训练样本蕴含两张图片。通过Siamese网络把人脸识别问题转化成了一个二分类问题。引入逻辑输入层参数\( w\) 和\( b\) ,输入\( \hat y\) 表达式为:
$$\hat y=\sigma(\sum_{k=1}^Kw_k|f(x^{(i)})_k-f(x^{(j)})_k|+b)$$
其中参数\( w_k\) 和\( b\) 都是通过梯度降落算法迭代训练失去。
\( \hat y\) 的另外一种表达式为:
$$\hat y=\sigma(\sum_{k=1}^Kw_k\frac{(f(x^{(i)})_k-f(x^{(j)})_k)^2}{f(x^{(i)})_k+f(x^{(j)})_k}+b)$$
上式被称为\( \chi\) 方公式,也叫\( \chi\) 方类似度。
训练好上述模型后,进行人脸识别的惯例办法是测试图片与模板别离进行网络计算,编码层输入比拟,计算二分类概率后果。
为了缩小计算量,能够提前进行预计算:提前将数据库每个模板的编码层输入\( f(x)\) 保留下来。这个过程能够并行,而且因为是离线过程,对于时效性要求并没有那么高。
理论测试预估时,库内的人脸编码都已计算好,只须要计算测试图片的网络输入,失去的\( f(x^{(i)})\) 间接与存储的模板\( f(x^{(j)})\) 进行下一步的计算即可,总计算工夫减小了靠近一半。
这种办法也能够利用在之前提到的triplet loss网络中。
2.神经格调迁徙
神经格调迁徙(Neural style transfer)将参考格调图像的格调「迁徙」到另外一张内容图像中,生成具备其特色的图像。如下是几个神经格调迁徙的例子:
后续的办法介绍和推导中:咱们会用\( C\) 示意内容图片,\( S\) 示意格调图片,\( G\) 示意生成的图片。
2.1 深度卷积网络学到了什么
想要了解如何实现神经格调转换,首先要了解在输出图像数据后,一个深度卷积网络从中都学到了些什么。咱们借助可视化来做到这一点。
典型的CNN网络结构如下:
咱们从第1个隐层开始可视化解释,咱们遍历所有训练样本,找出让该层激活函数输入最大的9块图像区域;而后再找出该层的其它单元(不同的滤波器通道)激活函数输入最大的9块图像区域;最初共找\( 9\) 次,失去\( 9 \times 9\) 的图像如下所示,其中每个\( 3 \times 3\) 区域示意一个运算单元。
上图表明,第1层隐层检测的是原始图像的边缘和色彩暗影等简略信息。用同样的办法去操作CNN的后续隐层,随着层数的减少,捕获的区域更大,特色逐渐变得复杂,从边缘到纹理再到具体物体。
相干论文:Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks
2.2 代价函数
神经格调迁徙生成图片G的代价函数由两局部组成:\( C\) 与\( G\) 的内容类似水平和\( S\) 与\( G\) 的格调类似水平。其中,\( \alpha\) 、\( \beta\) 是超参数,用来调整绝对比重。
神经格调迁徙的算法步骤如下所示:
- 随机生成图片\( G\) 的所有像素点。
- 应用梯度降落算法使代价函数最小化,以一直修改\( G\) 的所有像素点,使G逐步有C的内容和G的格调。
相干论文:Gatys al., 2015. A neural algorithm of artistic style
(1) 内容代价函数
上述代价函数蕴含一个内容代价局部和格调代价局部。咱们先看内容代价函数\( J_{content}(C, G)\) ,它示意图片\( C\) 和图片\( G\) 之间的内容类似度。咱们个别基于一个中间层\( l\) 层的激活函数输入 \( a^{(C)[l]}\) 与 \( a^{(G)[l]}\) 来掂量\( C\) 和\( G\) 之间的内容类似度。
具体的\( J_{content}(C, G)\) 计算过程如下:
- 应用一个预训练好的CNN(例如VGG);
- 抉择一个暗藏层\( l\) 来计算内容代价。\( l\) 太小则内容图片和生成图片像素级别类似,\( l\) 太大则可能只有具体物体级别的类似。因而,\( l\) 个别选一个中间层;
- 设\( a^{(C)[l]}\) 、\( a^{(G)[l]}\) 为\( C\) 和\( G\) 在\( l\) 层的激活,则有:
$$J_{content}(C, G) = \frac{1}{2}||(a^{(C)[l]} - a^{(G)[l]})||^2$$
\( a^{(C)[l]}\) 和\( a^{(G)[l]}\) 越类似,则\( J_{content}(C, G)\) 越小。
(2) 格调代价函数
接下来咱们要探讨格调代价函数,在CNN网络模型中,图片的格调能够定义成第l层暗藏层不同通道间激活函数的乘积(相关性)。
每个通道提取图片的特色不同,如下图:
- 标为黄色的通道提取的是图片的垂直纹理特色,标为蓝色的通道提取的是图片的背景特色(橙色)。
- 计算这两个通道的相关性,相关性的大小,即示意原始图片既蕴含了垂直纹理也蕴含了该橙色背景的可能性大小。
- 通过CNN,「格调」被定义为同一个暗藏层不同通道之间激活值的相关系数,因其反映了原始图片特色间的互相关系。
对于格调图像\( S\) ,选定网络中的第\( l\) 层,咱们定义图片的格调矩阵(style matrix)为:
$$G^{[l](S)}_{kk\prime} = \sum^{n^{[l]}_H}_{i=1} \sum^{n^{[l]}_W}_{j=1} a^{[l](S)}_{ijk} a^{[l](S)}_{ijk\prime}$$
其中,\( i\) 和\( j\) 为第\( l\) 层的高度和宽度;\( k\) 和\( k\prime\) 为选定的通道,其范畴为\( 1\) 到\( n_C^{[l]}\) ;\( a^{l}_{ijk}\) 为激活。
同理,对于生成图像\( G\) ,有:
$$G^{[l](G)}_{kk\prime} = \sum^{n^{[l]}_H}_{i=1} \sum^{n^{[l]}_W}_{j=1} a^{[l](G)}_{ijk} a^{[l](G)}_{ijk\prime}$$
因而,第\( l\) 层的格调代价函数为:
$$J^{[l]}_{style}(S, G) = \frac{1}{(2n^{[l]}_Hn^{[l]}_Wn^{[l]}_C)^2} \sum_k \sum_{k\prime}(G^{[l](S)}_{kk\prime} - G^{[l](G)}_{kk\prime})^2$$
下面咱们只计算了一层隐层l的代价函数。应用多隐层能够表征的格调更全面,咱们对其叠加,最终表达式为:
$$J_{style}(S, G) = \sum_l \lambda^{[l]} J^{[l]}_{style}(S, G)$$
公式中,\( \lambda\) 是用于设置不同层所占权重的超参数。
2.3 推广至一维和三维
后面咱们解决的都是二维图片,举例来说:
- 输出图片维度:\( 14 \times 14 \times 3\)
- 滤波器尺寸:\( 5 \times 5 \times 3\) ,滤波器个数:\( 16\)
- 输入图片维度:\( 10 \times 10 \times 16\)
实际上卷积也能够延长到一维和三维数据。咱们来举例说明:
(1) 一维卷积(1D Conv)
EKG数据(心电图)是由工夫序列对应的每个霎时的电压组成,是一维数据。如果用卷积解决,有如下后果:
- 输出工夫序列维度:\( 14 \times 1\)
- 滤波器尺寸:\( 5 \times 1\) ,滤波器个数:\( 16\)
- 输入工夫序列维度:\( 10 \times 16\)
(2) 三维卷积(3D Conv)
而对于三维图片的示例,对应的3D卷积有如下后果:
- 输出3D图片维度:\( 14 \times 14 \times 14 \times 1\)
- 滤波器尺寸:\( 5 \times 5 \times 5 \times 1\) ,滤波器个数:\( 16\)
- 输入3D图片维度:\( 10 \times 10 \times 10 \times 16\)
参考资料
- Taigman et al., 2014, DeepFace closing the gap to human level performance
- Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering
- Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks
- Gatys al., 2015. A neural algorithm of artistic style
ShowMeAI系列教程举荐
- 图解Python编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解AI数学根底:从入门到精通系列教程
- 图解大数据技术:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
举荐文章
- 深度学习教程 | 深度学习概论
- 深度学习教程 | 神经网络根底
- 深度学习教程 | 浅层神经网络
- 深度学习教程 | 深层神经网络
- 深度学习教程 | 深度学习的实用层面
- 深度学习教程 | 神经网络优化算法
- 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
- 深度学习教程 | AI利用实际策略(上)
- 深度学习教程 | AI利用实际策略(下)
- 深度学习教程 | 卷积神经网络解读
- 深度学习教程 | 经典CNN网络实例详解
- 深度学习教程 | CNN利用:指标检测
- 深度学习教程 | CNN利用:人脸识别和神经格调转换
- 深度学习教程 | 序列模型与RNN网络
- 深度学习教程 | 自然语言解决与词嵌入
- 深度学习教程 | Seq2seq序列模型和注意力机制