计算机视觉:卷积神经网络(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)

在这里插入图片描述

上图中两张图片 x ( 1 ) x^{(1)} x(1) x ( 2 ) x^{(2)} x(2)的相似程度看可由各自FC层 f ( x ( 1 ) ) f(x^{(1)}) f(x(1)) f ( x ( 2 ) ) f(x^{(2)}) f(x(2))之差来表示:
d ( x ( 1 ) , x ( 2 ) ) = ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 d(x^{(1)},x^{(2)}) = ||f(x^{(1)})-f(x^{(2)})||^2 d(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 ) ) 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 ) ∣ ∣ 2 ≤ ∣ ∣ f ( A ) − F ( N ) ∣ ∣ 2 ||f(A)−f(P)||^2≤||f(A)−F(N)||^2 f(A)f(P)2f(A)F(N)2

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

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

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

cost function: J = ∑ i = 1 m L ( A ( i ) , P ( i ) , N ( i ) ) J=∑_{i=1}^mL(A^{(i)},P^{(i)},N^{(i)}) J=i=1mL(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)

在这里插入图片描述

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

χ方公式 ( y ^ \hat y y^的另一种表达式) : y ^ = σ ( ∑ k = 1 K w k ( f ( x ( i ) ) k − f ( x ( j ) ) k ) ) 2 f ( 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) y^=σ(k=1Kwkf(x(i))k+f(x(j))k(f(x(i))kf(x(j))k))2+b)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值