欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机视觉:卷积神经网络(4)

程序员文章站 2022-07-14 21:38:16
...

很久以前看吴恩达老师的视频和西瓜书时用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)

计算机视觉:卷积神经网络(4)

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)

计算机视觉:卷积神经网络(4)

上图中两张图片x(1)x^{(1)}x(2)x^{(2)}的相似程度看可由各自FC层f(x(1))f(x^{(1)})f(x(2))f(x^{(2)})之差来表示:
d(x(1),x(2))=f(x(1))f(x(2))2d(x^{(1)},x^{(2)}) = ||f(x^{(1)})-f(x^{(2)})||^2

不同图片的CNN网络所有结构和参数都是一样的,我们的目标就是利用梯度下降算法,不断调整网络参数,使属于同一人的图片之间d(x(1),x(2))d(x^{(1)},x^{(2)})很小,不同人的图片之间d(x(1),x(2))d(x^{(1)},x^{(2)})很大。

Triplet Loss:损失函数,用于人脸识别的CNN模型。Triplet Loss需要每个样本包含三张图片:靶目标(Anchor)、正例(Positive)、反例(Negative),靶目标和正例是同一人,靶目标和反例不是同一人。Anchor和Positive组成一类样本,Anchor和Negative组成另外一类样本。简写 A,P,N.

目标:使构建的CNN网络输出编码f(A)接近f§,远离f(N),数学上满足:

f(A)f(P)2f(A)F(N)2||f(A)−f(P)||^2≤||f(A)−F(N)||^2

添加一个超参数 α\alpha (边界范围>0):

f(A)f(P)2f(A)F(N)2α||f(A)−f(P)||^2-||f(A)−F(N)||^2 \leq -\alpha

Loss function:L(A,P,N)=max(f(A)f(P)2f(A)F(N)2+α,0)L(A,P,N)=max(||f(A)−f(P)||^2−||f(A)−F(N)||^2+α, 0)

cost function:J=i=1mL(A(i),P(i),N(i))J=∑_{i=1}^mL(A^{(i)},P^{(i)},N^{(i)})

训练样本:必须保证同一人包含多张照片.

可以使用梯度下降算法,不断训练优化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)

计算机视觉:卷积神经网络(4)

每一个训练样本包含两张图片,每个siamese网络结构与参数完全相同。人脸识别问题转化为二分类问题。引入逻辑输出层参数w和b,输出y^表达式为:
y^=σ(k=1Kwkf(x(i))kf(x(j))k+b)\hat y=σ(∑_{k=1}^Kw_k|f(x^{(i)})k−f(x^{(j)})k|+b)
参数wkw_k和b都是通过梯度下降算法迭代训练得到。

χ方公式 (y^\hat y的另一种表达式) :y^=σ(k=1Kwk(f(x(i))kf(x(j))k))2f(x(i))k+f(x(j))k+b)\hat y=σ(∑_{k=1}^Kw_k \frac{(f(x^{(i)})k−f(x^{(j)})k))^2}{f(x^{(i)})k+f(x^{(j)})k}+b)

训练好网络之后,进行人脸识别的常规方法是测试图片与模板分别进行网络计算,编码层输出比较,计算逻辑输出单元。将每个模板的 f(x)保存下来,减少了计算量。