1.What is face recognition?算法
人脸验证:数据库
input:图片,名字/ID网络
output:是否为对应的那我的 (一对一问题)dom
人脸识别:函数
有一个数据库有K我的性能
input:图片学习
output:若是图片是对应的K人中的一人,则输出此人ID,不然验证不经过 ,人脸识别比人脸验证更难一些,若是一我的脸验证系统的正确率为99%,即错误率为1%,将这我的脸验证系统应用到另外一我的脸识别系统,犯错概率就变为了K倍.即K%编码
one-shot learning 指数据库中的每一个人都只有一个样本,利用这一个样原本训练一个CNN模型来进行人脸识别.atom
若数据库有K我的,则CNN模型输出softmax层就是K维的。spa
缺点:
1.每一个人只有一个样本,样本少,训练的CNN 不够健壮
2.当加入一个新成员的时候,须要对模型进行从新训练,使softmax的维度加一,这增大了模型的计算量
为了解决这一问题,引入similarity 函数:
similarity function:
对于人脸识别,只须要计算图片与数据库中的K张图片的d(img1,img2),取最小的为目标的匹配对象,若都很大,则数据库中没有此人
Siamese network是指将通常的CNN去掉softmax所获得的网络
将每一个人的图片输入参数相同的网络结构后,将最后的一个全链接层所获得的向量当作是原图片的编码
构建Siamese network后,Similarity funtion用两图片的编码差范数表示:
d(x1,x2)=∥f(x1)−f(x2)∥22
接下来咱们要学习参数来 使得表示同一我的的图片的范数差变得小,而表示不一样人的图片的范数差变得大
让网络学习参数,构建合理的CNN,须要定义损失函数.咱们引入Triplet Loss.
学习的目标:
Anchor(靶目标). Positive(与靶目标相同). Negative(与靶目标相反).
咱们但愿Anchor与Postive的图像编码接近一些,而Anchor与Negative的编码不一样一些,即||f(A)−f(D)||2尽量小,而||f(A)−f(N)||2尽量大,咱们列出以下式子:
但这种状况的时候 f(A),f(P),f(N)都为0的时候也知足这个表达式,但不是咱们想要的结果,因而咱们对上式进行修改,
其中α为超参数,且α大于0 顺便提一下,这里的α也被称为边界margin,相似与支持向量机中的margin。举个例子,若d(A,P)=0.5d(A,P)=0.5,α=0.2,则d(A,N)≥0.7。
Loss Function以下:
L(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)
这里triplet损失函数:当前者<=0时,则L(A, P, N) = 0,即损失函数为0;当前者>0时,则L(A, P, N) = 前者,此时,利用梯度降低下降损失函数,正好达到训练参数的目的,最终训练好的参数只训练到d(A, N) - d(A, P) >= alpha,即知足margin要求。
Cost Function:
在选择咱们的A,P,N时,若是A,P太容易知足d(A,P)+α<=d(A,N),
网络不须要通过复杂训练就能实现这种明显识别,可是抓不住关键区别。因此,最好的作法是人为选择A与P相差较大(例如换发型,留胡须等),A与N相差较小(例如发型一致,肤色一致等)。这种人为地增长难度和混淆度会让模型自己去寻找学习不一样人脸之间关键的差别,“尽力”让d(A,P)更小,让d(A,N)更大,即让模型性能更好。
值得一提的是,如今许多商业公司构建的大型人脸识别模型都须要百万级别甚至上亿的训练样本。如此之大的训练样本咱们通常很难获取。可是一些公司将他们训练的人脸识别模型发布在了网上,可供咱们使用。
除了用Trilet loss外,咱们还可使用二分类结构
在两个Siamese Network组合在一块儿,在每一个的编码输出后加一个逻辑处理单元,该单元使用sigmoid函数,输入两张图片,若相同则输出1,不然输出0,这就将一我的脸识别问题转化成了一个二分类问题
其输出的表达式为
参数w_k,和b都是通过训练获得的
还有一个表达式为
上式被称为χ方公式,也叫χ方类似度.
在实际的人脸验证系统中,咱们能够对数据库的人脸图片进行预计算,存储卷积网络获得的编码。当有图片进行识别时,运用卷积网络计算新图片的编码,与预计算保存好的编码输入到逻辑回归单元中进行预测。这样能够提升咱们系统预测的效率,节省计算时间。
(注:该trick也一样能够用到上面triplet loss function中,即提早将图片进行预编码(走一遍Siamese网络,获得去掉softmax层的输出神经元的值),就避免了后续再对数据库image进行计算编码,提高了效率,若是不存储图片,同时还能节省空间(对于大型数据集)。)
神经风格迁移便是将一张图片的风格迁移到另外一张图片的风格中,生成一张新的图片
通常用C表示内容图片,用S表示风格图片,用G表示生成图片
卷积神经网络每一层究竟在学什么?
如何得知卷积神经网络在学什么?
1.挑选一个单元
2.遍历训练集,寻找激活输出最大的的图片或图片块
3.对其余运算单元(不一样滤波器通道)执行操做2
能够看出第一层一般会找一些简单的特征,如边缘,阴影等
随着层数的加深,所找的特征愈来愈复杂,从边缘到纹理再到具体物体。
风格迁移的Cost Function以下:
J(G)=α⋅Jcontent(C,G)+β⋅Jstyle(S,G)
其中 α,β为超参数,Jcontent(C,G),Jstyle(S,G)为图片C,G 与S,G的类似度
如何获得 G:
1.先随机初始化G
2.根据梯度降低算法最小化cost function来计算出获得G
Content cost function
假设咱们正在使用l层来计算Jcontent(C,G)
使用已经训练好的卷积神经网络(如:VGG)
让咱们分别使用a[l](C),a[l](G)来表示图片C,图片G 在l层的激活输出
若是a[l](C),a[l](G)类似,则二者有类似的内容
(注:若是l层选的过小,那代价函数会使得生成图片G在像素上与内容图片C有相同的内容,若是l层选的太深,那么会使得生成图片G出现图片C上的物体,因此对l层的选取,应该既不深也不浅)
content cost function:
Jcontent(C,G)=1/2||a[l](C)−a[l](G)||2
经过梯度降低不断修正G的值,使得Jcontent不断减少
一幅图片的"style"的意思,
假设你正在使用l层的激活来测量"style"
定义风格为不一样通道激活项之间的相关性(激活项的乘积)
(注:上述定义是风格转义的本质,即保证生成图片各通道激活项之间的相关性与参考图片各通道激活函数项之间的相关性近似。)
那么如何取判断相关或不相关,以下图所示:
不一样通道即为神经网络所学习的特征,假设红色通道即为提取图片的垂直特征,黄色通道为提取图片橙色背景
这两个通道之间的相关性大小即为原始图片中包含垂直特征的区域同时为橙色区域的大小.
咱们将相关系数应用到风格图片S和生成图片G的对应通道上,就能够度量风格图片和生成图片的类似度。
Style矩阵
咱们以前所讲的卷积都是2D的,咱们能够推广到1D和3D
1D:
3D:
补充参考自:https://blog.csdn.net/red_stone1/article/details/79055467
https://blog.csdn.net/Dby_freedom/article/details/79883452