计算机视觉:卷积神经网络(4)
很久以前看吴恩达老师的视频和西瓜书时用jupyter写的,今天想起来就把它转到这里
图像识别、目标检测、风格迁移
人脸识别
人脸验证(face verification)和人脸识别(face recognition)的区别:
人脸验证:输入一张人脸图片,验证输出与模板是否为同一人,即一对一问题。
人脸识别:输入一张人脸图片,验证输出是否为K个模板中的某一个,即一对多问题。
One Shot Learning:数据库中每个人的训练样本只包含一张照片,然后训练一个CNN模型来进行人脸识别。若数据库有K个人,则CNN模型输出softmax层就是K维的。
问题:训练样本较少,CNN网络不够健壮;输出层不够灵活,数据库增加一个人,输出层就要发生变化,相当于重建网络架构。
相似函数:便是2张图片的相似程度,用d(img1,img2)来表示(越小越相似)。
应用:人脸验证中使用:
d(img1,img2)≤τ : 一样
d(img1,img2)>τ : 不一样
One Shot Learning的解决办法:计算测试图片与数据库中K个目标的相似函数,取其中d(img1,
img2)最小的目标为匹配对象。若所有的d(img1,img2)都很大,则表示数据库没有这个人。
from IPython.display import Image
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "27.png", width=800, height=200)
Siamese Network:一张图片经过一般的CNN网络,最终得到的全连接层FC可以看做是原始图片的编码,表征了原始图片的关键信息,这个网络结构我们称之为Siamese network。每张图片经过Siamese network后,由FC层每个神经元来表征。
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "28.png", width=800, height=200)
上图中两张图片的相似程度看可由各自FC层之差来表示:
不同图片的CNN网络所有结构和参数都是一样的,我们的目标就是利用梯度下降算法,不断调整网络参数,使属于同一人的图片之间很小,不同人的图片之间很大。
Triplet Loss:损失函数,用于人脸识别的CNN模型。Triplet Loss需要每个样本包含三张图片:靶目标(Anchor)、正例(Positive)、反例(Negative),靶目标和正例是同一人,靶目标和反例不是同一人。Anchor和Positive组成一类样本,Anchor和Negative组成另外一类样本。简写 A,P,N.
目标:使构建的CNN网络输出编码f(A)接近f§,远离f(N),数学上满足:
添加一个超参数 (边界范围>0):
Loss function:
cost function:
训练样本:必须保证同一人包含多张照片.
可以使用梯度下降算法,不断训练优化CNN网络参数,让J不断减小接近0。
A、P、N 的选择:人为选择A与P相差较大,A与N相差较小。即人为的增加难度和混淆度会让模型性能更好。
面部识别与二分类:将两个siamese网络组合在一起,将各自的编码层输出经过一个逻辑输出单元,该神经元使用sigmoid函数,输出1则表示识别为同一人,输出0则表示识别为不同人。结构如下:
libo="C:/Users/libo/Desktop/machine learning/卷积神经网络/CNN图片/"
Image(filename = libo + "29.png", width=800, height=200)
每一个训练样本包含两张图片,每个siamese网络结构与参数完全相同。人脸识别问题转化为二分类问题。引入逻辑输出层参数w和b,输出y^表达式为:
参数和b都是通过梯度下降算法迭代训练得到。
χ方公式 (的另一种表达式) :
训练好网络之后,进行人脸识别的常规方法是测试图片与模板分别进行网络计算,编码层输出比较,计算逻辑输出单元。将每个模板的 f(x)保存下来,减少了计算量。
上一篇: 计算机视觉:卷积神经网络(1)
下一篇: 第四次作业