Toggle navigation
Home
Genomics
Python
Linux
Visualization
Statistics
MachineLearning
Reading
Other
About
Home
>
MachineLearning
> Main text
【4-4】特殊应用:人脸识别和神经风格转换
Tag:
python
,
machine learning
2019-03-07
目录
目录
什么是人脸识别?
One-Shot学习
Siamese网络
Triplet损失
人脸验证与二分类
神经风格迁移
CNN特征可视化
代价函数
内容代价函数
风格代价函数
一维和三维卷积
参考
什么是人脸识别?
工作刷脸通过:人脸识别+活体检测
人脸验证:
face verification
输入:一张图片,某个ID或者名字
输出:输入图片是否是这个人
做法:1对1问题,弄明白这个人是否和他声称的身份相符
人脸识别:
face recognition
输入:一张图片
输出:这个图片是否是某数据库中的哪个人
做法:1对多问题
正确率需要很高才能取得好的效果
One-Shot学习
人脸识别挑战:
一次学习问题
需要通过单单一张图片或者一个人脸样例就能去识别这个人
例子:比如左边的是数据库的4个样本,对于新的人脸,如右侧的样本1、2,需要识别出1是数据库中的一个人,而2不是数据库中的某个人
解法1:卷积神经网络【不推荐】
比如数据库4个人,可以训练CNN,输出是4种
效果不会好
训练数据集太小,不能得到稳健的模型
不方便:加入新加入成员,需要重新训练模型,因为此时CNN的输出是5种
解法2:
学习相似性函数
同样使用神经网络,但是学习目标发生变化
学习相似性函数d:评估图片之间的差异大小的
如果两张图片是同一个人,则相似性很高,差异很小,输出一个很小的值
如果两张图片不是同一个人,则相似性很低,差异很大,输出一个很大的值
预测:输入一个新的图像,和数据库图像之间逐个比较,就知道这个人是哪个了
Siamese网络
相似性函数d:输入两张人脸,告诉其相似度
做法:
图片1通过网络编码为向量1
图片2通过网络编码为向量2
两个向量之间的距离定义为两个图片的差异
同一个神经网络
神经网络的参数定义了一个编码函数,参数不同,编码的结果不同。通过反向传播,获得最优的参数。
Triplet损失
参数学习:定义三元组损失函数然后应用梯度下降
三元组损失:
三张图片:Anchor图片(A),Positive图片(P),Negative图片(N)
两个距离:A、P之间的距离,A、N之间的距离
希望满足AP之间的距离小于AN之间的距离:\(\|f(A)-f(P)\|^2 <= \|f(A)-f(N)\|^2\)。比如下图中,AP是同一个人,AN不是同一个人,所以希望前者很接近,后者很不接近。
模型偷懒:
需满足:\(\|f(A)-f(P)\|^2 - \|f(A)-f(N)\|^2 <= 0\)
假如f函数对于任意的图片编码,总是为0,那么上面的式子就是:0-0<=0,是总是成立的
为了防止网络输出无用的结果,可以🙆两者的差值不是小于0,而是一个更小一点的负数,即:\(\|f(A)-f(P)\|^2 - \|f(A)-f(N)\|^2 <= -a\)
这里的-a叫做间隔(margin),类似于SVM里面的
例子:
假如a=0.2,d(A,P)=0.5,如果d(A,N)=0.51,只比d(A,P)大了一点点,但是不满足两者之间的最小间隔,所以此时模型不够好。
损失函数:
取0和上面等式值的最大值
max函数的作用:只要前半部分的值<=0,那么损失就是0,所以模型会想办法让前半部分更小
三元组图片的选取:
随机选取。在满足AP是同一人,AN不是同一人的条件下,随机选取图片组成三元组,此时是很容易满足\(\|f(A)-f(P)\|^2 - \|f(A)-f(N)\|^2 <= -a\)这个的。因为随机时,AN差别比AP差别很大的概率很大。此时网络不能学习到什么。
构造难的三元组。所以应该选取比较难以区分的三元组,比如AP的距离和AN的聚集近似相等的。为了保证他们之间相差一个间隔,模型会尽力使得后者的距离变大,或者AP的距离变小。
人脸验证与二分类
做法:
神经网络对于输入的两个图片进行特征编码
将特征向量输入到逻辑回归单元,进行预测
如果是相同的人,输出1;不同的人,输出0
如此:把人脸识别问题转换为二分类问题
如何使用逻辑回归?
输入是两个图片,对应两个编码的特征向量
这两个特征向量之间是有关系的
可以
使用对应特征属性的差值
,输入到逻辑回归单元
也可以使用其他的变换,比如x平方相似度输入到逻辑单元
最后的输出是0(不同人)或者1(同一人)
训练集:
监督学习,需创建只有成对图片的训练集
标签1:这一对图片是同一人
标签0:这一对图片是不同的人
神经风格迁移
C:内容图像
S:风格图像
G:生成的图像
为什么可以做到?需要理解CNN由浅层到深层的特征表示,逐渐的都学习到了什么!
CNN特征可视化
做法:
对于某一层网络,选取一个神经单元,然后找到使得神经单元激活最大的一些(比如9个)小块
对于其他的一些神经元重复上面的操作
例子:这里选取的是layer1的神经元,对每个神经元,选取9个其最大激活的patch,然后画出来。这里相当于是选取了9个神经元,每一个含有9个patch。
可以看到,不同的神经元激活得到不同的特征,比如有的是针对右斜45‘线条的,有的是左斜45’线条的。有的是一些边缘,有的是一些颜色阴影。每一个不同的图片块都最大化激活了。
其他层:
同样的,可以对其他层,比如更深的层进行同样的操作,查看所在层提取的特征
更深的层一般可以检测到更加复杂的特征
比如这里的第二层:编号1检测垂直图案,编号2检测有圆形的,编号3检测很细的垂线
第三层:编号1对图片左下角的圆形很敏感,编号2检测人类,编号3检测特定蜂窝状图案
第四层:可以检测到更复杂的,编号1检测狗狗,很类似的狗狗,编号3检测到鸟的脚
第五层:复杂的事物,编号1检测不同的狗,编号2检测键盘或类似物,编号3检测文本,编号4检测话
代价函数
给定C和S,生成G。那么需要有一个函数去评价G的好坏!
关于G的函数:
表示:\(J(G)=\alpha J_{content}(C,G)+\beta J_{style}(S, G)\)
内容代价:度量生成图片G与内容图片C的内容有多相似
风格代价:度量生成图片G的风格与图片S的风格的相似度
两者之间的权重由两个超参数与来确定
算法:
随机初始化生成G
使用梯度下降的方法,使得代价函数J(G)最小化,更新G,也就是更新图像G中的像素值
经过不断的迭代之后,会生成一个越来越具有特定风格的图像G
内容代价函数
是什么?
是总代价函数的一部分
使用隐藏层l计算内容代价。如果l很小,那么此时生成的图片会很接近原图;如果l很大(深层),会问此时的图片内容是否含有内容对象(比如狗)。因此,在实际中层l不会选的太浅也不会选的太深。
使用的模型可以是预训练的卷积模型。比如VGG模型等。
衡量一个内容图片和生成图片的相似度?
两个图片C和G
一个隐藏层l
图像在此隐藏层上的激活值
如果此激活值相似,那么两个图片的内容相似
定义:\(J_{content}(C,G)=\frac{1}{2}\|a^{[l][C]}-a^{[l][G]}\|^2\),两个激活值按元素相减,然后取平方
风格代价函数
图片风格:
一个图片输入到神经网络中
选择某一层l
风格:l层中各个通道之间激活项的相关系数
通道间相关系数的
计算
?
某一层l是含有多个通道的
每一通道相当于含有多个神经元(激活项)
可计算任意两个通道之间激活项值的相关系数
例子:比如下图左边某一层l中,有nc个通道,任取两个通道(编号1和2的),那么每个通道有nh x nw个激活项,可以计算这两个通道之间的相关系数。
通道间相关系数表示什么
含义
?
上面图片例子
编号1通道提取的特征是右边的编号3,垂直纹理特征
编号2通道提取的特征是右边的编号4,橙色区域的特征
如果相关(相关系数大),表示两个特征相关,说明图片中有垂直纹理的地方很大概率也是橙色的
如果不相关(相关系数小),表示两个特征不相关,说明图片中有垂直纹理的地方很大概率不是橙色的
表示:
每个通道测量的特征在各个位置同时出现或者不出现的概率
风格矩阵:
通道1:激活项值
通道2:激活项值
激活值:\(a_{i,j,k}^{[l]}\),这是第k通道,高度=i,宽度=j处的激活项
第l层:\(G^{[l](s)}, n_c^{[l]} \times n_c^{[l]}\),第l层(通道)的所有激活值
两个通道的相关系数:两个通道上的激活项进行相乘在相加(非标准的互相关函数,因为没有减去平均数,而是直接相乘)
如何评估风格图像和生成图像的风格是否相近?
风格图像:风格矩阵
生成图像:风格矩阵
有了两个图像的风格矩阵之后,就可以评估这两个矩阵的相似性了
计算:矩阵对应元素相减的平方和(类似于mse)
风格代价函数:
S、G风格矩阵的误差平方和
一维和三维卷积
卷积操作可推广到1维或者3维
输出大小的公式还是同样的使用,只是维度变了,对应的维度计算即可
参考
第四周 特殊应用:人脸识别和神经风格转换
If you link this blog, please refer to this page, thanks!
Post link:
https://tsinghua-gongjing.github.io/posts/CNN-4-special-applications.html
Previous:
【4-3】目标检测
Next:
Connect remote jupyter server
Please enable JavaScript to view the
comments powered by Disqus.
Category
Genomics
Python
Linux
Visualization
Statistics
MachineLearning
Reading
Other
Tags
Latest articles
AI在乳腺癌检测中的应用
基于三代测序数据预测m6A修饰位点
使用迁移学习对scRNA数据降噪
深度学习助力RNA可变剪切的预测
Excel常见用法
Word常见用法
Basic operations on matrix
LSTM
Run jobs on GPU server
稀疏编码
Links
ZhangLab
,
RISE database
,
THU life
,
THU info
Data analysis:
pandas
,
numpy
,
scipy
ML/DL:
sklearn
,
sklearn(中文)
,
pytorch
Visualization:
seaborn
,
matplotlib
,
gallery
Github:
me