人脸识别(吴恩达深度学习笔记)

目录

1.人脸识别

[(1)人脸验证 与 人脸识别](#(1)人脸验证 与 人脸识别)

[2.一次学习(One-shot learning)](#2.一次学习(One-shot learning))

(1)一次学习问题

(2)Similarity函数

3.Siamese网络

(1)概念

(2)原理

[4.Triplet 三元组损失函数](#4.Triplet 三元组损失函数)

(1)三元组损失函数

5.训练集构成

6.二分类问题的人脸验证

(1)原理

(2)总结


1.人脸识别
(1)人脸验证 与 人脸识别
  • 人脸验证:一张输入图片,以及某人的ID或者是名字,验证输入图片是否是这个人(一对一问题)

  • 人脸识别:有数据库存储很多人的数据,根据输入图片,识别图片是谁或识别不出(一对多问题)

  • 假设有一个验证系统,准确率是99%。如果你把这个验证系统应用在100个人的人脸识别上,犯错的机会就是100倍了。事实上,对于人脸识别,如果我们有一个100人的数据库,正确率可能需要远大于99%,才能得到很好的效果

2.一次学习(One-shot learning)
(1)一次学习问题
  • 一次学习问题:在大多数人脸识别应用中,往往需要通过一张图片或者一个人脸样例就能去识别这个人。
  • 而当深度学习只有一个训练样例时,它的表现并不好。
(2)Similarity函数
  • 如上图,假设数据库里有4张员工照片(,分别是Kian,Danielle,Younes和Tian。现在Danielle来到办公室,并且她想通过带有人脸识别系统的栅门,现在系统需要做的就是,仅仅通过一张已有的Danielle照片,来识别前面这个人确实是她。

  • 有一种办法是,将人的照片放进卷积神经网络中,使用softmax单元来输出5种,分别对应这4个人和都不是,但实际上这样效果并不好,因为如此小的训练集不足以去训练一个稳健的神经网络。

  • 要让人脸识别能够做到一次学习,为了能有更好的效果,我们要让神经网络学习Similarity函数(d(img1,img2))

  • d(img1,img2) 输出为两张图片的差异程度,r为阈值

  • 当d ≤ r,认为是同一个人

  • 当d>r,认为不是同一个人

3.Siamese网络
(1)概念
  • 使用similarity函数:输入两张人脸图片,然后输出相似度。实现这个功能的一个方式就是用Siamese网络
  • 对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构(Siamese neural network architecture)
(2)原理
  • 上图是常见的卷积网络,输入图片x(1),然后经过卷积层、池化层和全连接层,最终得到特征向量。假如f(x(1))有128个数,可以看成是图像x(1)的编码。
  • 如果要比较两个图片的话,把第二张图片x(2)喂给有同样参数的神经网络,然后得到一个不同的128维向量。
  • 接下来定义d,将x(1)和x^(2)的距离定义为这两种图片编码之差的范数:d(x1,x2)=‖f(x1) - f(x2) ‖²
4.Triplet 三元组损失函数
(1)三元组损失函数
  • 要通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数(triplet loss function),然后应用梯度下降。

  • 为了应用三元组损失函数,你需要比较成对的图像。通常是看三个图片,一个 Anchor 图片,Positive图片,Negetive图片,通常把它们简写成A、P、N。

  • 让Anchor图片和Positive图片(Positive意味着是同一个人)的距离很接近;同时Anchor图片与Negative图片(Negative意味着是非同一个人)的距离远一点。这就是为什么叫做三元组损失。

  • 我们需要满足 ‖f(A) - f(P)‖² ≤ ‖f(A) - f(N)‖² ,为了减小这个等式相等的概率,或者为了拉大Anchor和Positive 图片组与Anchor与Negative 图片组之间的差距,我们一般加一个参数α(也叫margin),使等式变为 ‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² +α ≤ 0

  • 定义损失函数:三元组损失函数的定义基于三张图片,即anchor样本、positive样本和negative样本,其中positive图片和anchor图片是同一个人,但是negative图片和anchor不是同一个人。

  • 三元组损失函数:L(A, P, N)=max(‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² +α,0)

  • 我们要尽可能让损失函数小,max可以使损失函数为正,当‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² +α<0的时候模型训练效果就不错了,所以用max取0,但当‖f(A) - f(P)‖² - ‖f(A) - f(N)‖² +α>0时,说明模型还有优化空间,损失函数还可以继续减小趋于0。

  • 整个网络的成本函数J应该是训练集中这些单个三元组损失的总和。假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降。

5.训练集构成
  • 为了训练你的系统你确实需要一个数据集,里面有同一个人的多个照片。如果你只有每个人一张照片,那么根本没法训练这个系统。对于训练集,你需要确保有同一个人的多个图片。
  • 随机地选择A、P和N,遵守A和P是同一个人,而A和N是不同的人这一原则,很容易满足,因为A和N比A和P差别很大的概率很大,这样网络很难从中学到什么。所以要尽可能的选择难训练的A、P和N,使得d(A,P)≈d(A,N)
6.二分类问题的人脸验证
(1)原理
  • 除了Triplet loss,将人脸识别当成一个二分类问题也是一个学习参数、训练网络的方法。
  • 上图,选取Siamese网络,输入两张图片,然后进行预测,如果是相同的人,那么输出是1,若是不同的人,输出是0。
  • 最后的逻辑回归单元主要处理编码之间的差异,比如:
  • 划线部分也可以卡方公式来代替,如图中所示(卡方平方相似度)
(2)总结
  • 如上图,把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,输入不是三元组,而是成对的图片,目标标签是1表示一对图片是一个人,0表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练神经网络,训练Siamese神经网络。处理人脸验证和人脸识别扩展为二分类问题,效果也很好。
相关推荐
AngelPP2 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年2 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼2 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS2 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区3 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈3 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang4 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk15 小时前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能
西门老铁7 小时前
🦞OpenClaw 让 MacMini 脱销了,而我拿出了6年陈的安卓机
人工智能