吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--编程作业

本文介绍了吴恩达Coursera深度学习课程中的人脸识别和神经风格转换技术。首先,通过三元组损失函数实现人脸识别,包括人脸验证和人脸识别的步骤。接着,深入探讨神经风格迁移,解释了如何利用预训练模型计算内容和风格损失,并最终生成艺术风格的图片。通过这个过程,读者将了解到如何应用深度学习技术进行图像创作。
摘要由CSDN通过智能技术生成

Part 1:Happy House 的人脸识别

本周的第一个作业我们将完成一个人脸识别系统。

人脸识别问题可以分为两类:

  • 人脸验证: 输入图片,验证是不是A
    • 1:1 识别
    • 举例:人脸解锁手机,人脸刷卡
  • 人脸识别: 有一个库,输入图片,验证是不是库里的一员
    • 1:K 识别
    • 举例:员工门禁

FaceNet 通过神经网络学习将图片编码为128维数字向量。通过比较两个128维向量的相似度来确定两张图片是否是同一个人。

在这个作业中,你需要:

  • 实现三元组损失函数
  • 使用一个预训练模型将图片转换为128维数字向量
  • 运用这些128维的数字向量来执行人脸验证和人脸识别

在这个练习中,你将使用一个预训练模型,该模型表示图片时使用”通道在前”的维度表示,(m,nC,nH,nW) 而不是之前的 (m,nH,nW,nC)。

开源社区中两种表示方法都很常见,没有统一的标准。

导包
from keras.models import Sequential
from keras.layers import Conv2D, ZeroPadding2D, Activation, Input, concatenate
from keras.models import Model
from keras.layers.normalization import BatchNormalization
from keras.layers.pooling import MaxPooling2D, AveragePooling2D
from keras.layers.merge import Concatenate
from keras.layers.core import Lambda, Flatten, Dense
from keras.initializers import glorot_uniform
from keras.engine.topology import Layer
from keras import backend as K
K.set_image_data_format('channels_first')
import cv2
import os
import numpy as np
from numpy import genfromtxt
import pandas as pd
import tensorflow as tf
from fr_utils import *
from inception_blocks_v2 import *

%matplotlib inline
%load_ext autoreload
%autoreload 2

np.set_printoptions(threshold=np.nan)

0 朴素人脸验证

在人脸验证中,给你两张图片,你需要给出这两张图片是否是同一个人。最简单的方式是一一比较两张图片的像素,如果两张图片的像素距离小于一个阈值,就认为是同一个人。

image

当然,这个算法的表现着实很差,因为图片的像素会随着灯光,角度,头部位置等元素而剧烈变化。

你会发现,不通过原始图片进行比较,而是通过机器学习将图片进行编码为相同维度的向量,然后计算向量的距离来识别是否是同一个人,拥有更高的准确率。

1 将图片编码为128维的向量

1.1 使用ConvNet编码图片

FaceNet模型需要大量的数据和时间去训练,这里我们使用别人已经训练好的模型,你也可以从inception_blocks.py看到模型是怎么实现的。

你需要知道:

  • 输入:96x96 RGB:(m,nC,nH,nW) = (m,3,96,96)
  • 输出: (m,128)
FRmodel = faceRecoModel(input_shape=(3, 96, 96))
print("Total Params:", FRmodel.count_params())
# Total Params: 3743280

在模型的最后一层使用128个神经元的全连接层,模型确保输出维度为128,然后就可以利用编码后的向量比较两个图片了。

image

如果符合以下条件,编码方式就是好的:

  • 同一个人的两张照片的编码非常相似
  • 不同人的两张照片编码差别很大

三元组损失函数(triplet loss function) 很好的实现了上述要求,将同一个人的两张照片 (anchor 和 Positive) 的编码 推得很近,将不同人的两张照片 (anchor 和 Negative) 的编码拉的很远。

image

1.2 三元组损失

对于一张图片 x,另其编码为f(x), 其中f是从神经网络计算出来的

image

三元组图片:(A, P, N)

  • A:Anchor – 一个人的图片
  • P:Positive – 与Ancher同一个人的图片
  • N:Negative – 与Ancher不同人的图片

我们训练集中已经有这些三元组数据,用(A(i), P(i), N(i)) 来表示训练集第i个样本。

你需要确保 A(i) 到 P(i) 的距离至少比到 N(i) 的距离远一个alpha。

f(A(i))f(P(i))22+α<f(A(i))f(N(i))22 ∣ ∣ f ( A ( i ) ) − f ( P ( i ) ) ∣ ∣ 2 2 + α <∣∣ f ( A ( i ) ) − f ( N ( i ) ) ∣ ∣ 2 2

我们将最小化如下的三元组损失 J:

z=i=1N[f(A(i))f(P(i))22(1)f(A(i))f(N(i))22
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值