sheng的学习笔记-AI-人脸识别

news2024/11/28 20:52:02

目录:sheng的学习笔记-AI目录-CSDN博客

需要学习卷机神经网络等知识,见ai目录

目录

基础知识:

人脸验证(face verification)

人脸识别(face recognition)

One-Shot学习(One-shot learning)

困难点:

​编辑 

传统的解决办法

解决方案-Similarity函数

Siamese 网络(Siamese network)

Triplet 损失

triplet训练集的选择

​编辑 

人脸验证与二分类(Face verification and binary classification)

提升部署效果的技巧

参考文章:


 

基础知识:

人脸验证(face verification

如果你有一张输入图片,以及某人的ID或者是名字,这个系统要做的是,验证输入图片是否是这个人。有时候也被称作1对1问题,只需要弄明白这个人是否和他声称的身份相符

人脸识别(face recognition

最大的难度就是,你提供了一个照片,ai程序如何通过一个照片,判断当前显示器捕捉的头像,和照片中的是否一个人,因为ai是给予海量数据训练出的模型,但目前仅有一个照片,用传统的ai模型,显然无法达到目的

One-Shot学习(One-shot learning)

困难点:

 

假设你的数据库里有4张你们公司的员工照片,实际上他们确实是我们deeplearning.ai的员工,分别是KianDanielleYounesTian。现在假设有个人(编号1所示)来到办公室,并且她想通过带有人脸识别系统的栅门,现在系统需要做的就是,仅仅通过一张已有的Danielle照片,来识别前面这个人确实是她。相反,如果机器看到一个不在数据库里的人(编号2所示),机器应该能分辨出她不是数据库中四个人之一

所以在一次学习问题中,只能通过一个样本进行学习,以能够认出同一个人。大多数人脸识别系统都需要解决这个问题,因为在你的数据库中每个雇员或者组员可能都只有一张照片。

传统的解决办法

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

而且,假如有新人加入你的团队,你现在将会有5个组员需要识别,所以输出就变成了6种,这时你要重新训练你的神经网络吗?这听起来实在不像一个好办法。

解决方案-Similarity函数

Siamese 网络(Siamese network)

这是个常见的卷积网络,根据输入x,通过一些列卷积,池化和全连接层,最终得到这样的特征向量,有时这个会被送进softmax单元来做分类,但这次我们不这样做。

对于编号1和编号2 ,都会生成128维的向量f(x1)和f(x2)

对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构

x

 

Triplet 损失

要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。

为了应用三元组损失函数,你需要比较成对的图像,比如这个图片,为了学习网络的参数,你需要同时看几幅图片,比如这对图片(编号1和编号2),你想要它们的编码相似,因为这是同一个人。然而假如是这对图片(编号3和编号4),你会想要它们的编码差异大一些,因为这是不同的人。

用三元组损失的术语来说,你要做的通常是看一个 Anchor 图片,你想让Anchor图片和Positive图片(Positive意味着是同一个人)的距离很接近。然而,当Anchor图片与Negative图片(Negative意味着是非同一个人)对比时,你会想让他们的距离离得更远一点

 

 

 

三元组损失函数的定义基于三张图片,假如三张图片A、P、N,即Anchor样本、Positive样本和Negative样本,其中Positive图片和Anchor图片是同一个人,但是Negative图片和Anchor不是同一个人。

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

注意,为了定义三元组的数据集你需要成对的A和P,即同一个人的成对的图片,为了训练你的系统你确实需要一个数据集,里面有同一个人的多个照片。这是为什么在这个例子中,我说假设你有1000个不同的人的10000张照片,也许是这1000个人平均每个人10张照片,组成了你整个数据集。如果你只有每个人一张照片,那么根本没法训练这个系统。当然,训练完这个系统之后,你可以应用到你的一次学习问题上,对于你的人脸识别系统,可能你只有想要识别的某个人的一张照片。但对于训练集,你需要确保有同一个人的多个图片,至少是你训练集里的一部分人,这样就有成对的AnchorPositive图片了

triplet训练集的选择

选择A和P的差异比较大的图片进行训练,看下面,虽然A和P是一个人,但照片风格差异比较大,逼迫网络对于相同人的识别敏感度增加 

总结一下,训练这个三元组损失你需要取你的训练集,然后把它做成很多三元组,这就是一个三元组(编号1),有一个Anchor图片和Positive图片,这两个(AnchorPositive)是同一个人,还有一张另一个人的Negative图片。这是另一组(编号2),其中AnchorPositive图片是同一个人,但是AnchorNegative不是同一个人,等等。

 

人脸验证与二分类(Face verification and binary classification)

Triplet loss是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法,让我们看看如何将人脸识别当成一个二分类问题。

另一个训练神经网络的方法是选取一对神经网络,选取Siamese网络,使其同时计算这些嵌入,比如说128维的嵌入(编号1),或者更高维,然后将其输入到逻辑回归单元,然后进行预测,如果是相同的人,那么输出是1,若是不同的人,输出是0。这就把人脸识别问题转换为一个二分类问题,训练这种系统时可以替换Triplet loss的方法

总结一下,把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,而是成对的图片,目标标签是1表示一对图片是一个人,目标标签是0表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练神经网络,训练Siamese神经网络。

 

提升部署效果的技巧

一个计算技巧可以帮你显著提高部署效果,如果这是一张新图片(编号1),当员工走进门时,希望门可以自动为他们打开,这个(编号2)是在数据库中的图片,不需要每次都计算这些特征(编号6),不需要每次都计算这个嵌入,你可以提前计算好,那么当一个新员工走近时,你可以使用上方的卷积网络来计算这些编码(编号5),然后使用它,和预先计算好的编码进行比较,然后输出预测值。

因为不需要存储原始图像,如果你有一个很大的员工数据库,你不需要为每个员工每次都计算这些编码。这个预先计算的思想,可以节省大量的计算,这个预训练的工作可以用在Siamese网路结构中,将人脸识别当作一个二分类问题,也可以用在学习和使用Triplet loss函数上

参考文章:

吴恩达的神经网络教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1556418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

脱壳之常用的加固样本特征

梆梆加固样本特征 清单文件入口 android:name“com.SecShell.SecShell.ApplicationWrapper” 特征 免费版 meta-data meta-data总结 assets/secData0.jar lib/armeabi/libSecShell.so lib/armeabi/libSecShell-x86.so 梆梆企业版 assets/classes0.jar lib/armeabi-v7a/libD…

Flutter开发之objectbox

Flutter开发之objectbox 在之前进行iOS开发的时候使用WCDB去进行管理数据库很方便,它支持ORM(Object-Relational Mapping,对象关系映射),用于实现面向对象编程语言里不同类型系统的数据之间的转换。 那么在Flutter开发…

【C++】const限定符|const引用

const的引用 说const引用之前需要说明,这是建立在引用的前提下,如果是普通的拷贝赋值就基本不需要使用到const(有关权限)。 1 权限不能放大(可平移、缩小) 如何解释权限不能放大? 阅读下面的代码 可以看到&#xff1a…

Taskflow:子流任务(Subflow Tasking)

创建Subflow DAG任务中,有一种常见的场景,一个任务可能在执行期间产生新的任务,然后紧接着执行新任务。 之前提到的静态图就没有办法实现这样一个功能了,所以Taskflow提供了另一种流的节点:Subflow,Subflo…

多张图片怎么合成一张gif?快来试试这个方法

将多张图片合成一张gif动图是现在常见的图像处理的方式,适合制作一些简单的动态图片。通过使用在线图片合成网站制作的gif动图不仅体积小画面丰富,画质还很清晰。不需要下载任何软件小白也能轻松上手,支持上传jpg、png以及gif格式图片&#x…

在同一个网站上自动下载多个子页面内容

一、问题现象 第一次遇到这样的问题,如下图: 即在同一个网站上下载多个内容时,第一个内容明明已经正常get到了,但开始第二个页面的查询 以后,原来已经查出的内容就找不到了。 二、解决办法 我不知道大家是不是遇到…

meanshift论文学习

1. abstract 2. 理论解读 目标函数 然后对(11)求导,求解x,x实际就是求解当图像位置的值,求导之后表示为: 进一步整理得: 上式第二项即为meanshift 进一步整理为 上式表明了均值漂移与核函数之间的关系。 3. 缺点…

多语言多货币多入口FecMall跨境电商B2C商城系统源码

FecMall是一套多语言多货币多入口的开源电商 B2C 商城,支持移动端vue, app, html5,微信小程序微店,微信小程序商城等。很适合用来做跨境电商外贸独立站。 Fecmall 全称为Fancy ECommerce Mall,是基于php Yii2框架之上开发的一款优…

基于ssm中国咖啡文化宣传网站的设计与实现论文

摘 要 本课题是根据咖啡文化宣传需要以及网络的优势建立的一个中国咖啡文化宣传网站,来实现中国咖啡文化宣传以及咖啡商品售卖的功能。 本中国咖啡文化宣传网站应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中…

Filter、Listener、AJAX、Vue、Element

Filter 概念:Filter 表示过滤器,是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感…

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

pycharm修改主题颜色和注释颜色

目录 一、修改主题颜色 二、修改注释颜色 一、修改主题颜色 总结的来说就是:File-Settings-Appearance-Theme。 有三种主题: Darcula:默认主题,可以看作是黑的: IntelliJ Light:可以看作是白的: High con…

在新能源充电桩、智能充电枪、储能等产品领域得到广泛应用的两款微功耗轨至轨运算放大器芯片——D8541和D8542

D8541和D8542是我们推荐的两款微功耗轨至轨运算放大器芯片,其中D8541为单运放, D8542为双运放,它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用,在新能源充电桩、智能充电枪、…

JavaScript练手小技巧:仿米哈游官网人物跟随鼠标位移效果

最近,有同学找到我,说:老师,我想模仿米哈游官网。 我说:可以,很不错的。 她说:有些效果有点难,能不能帮我看下。 于是,我就简单大概粗糙的讲解了下大致的原理&#xf…

unity学习(78)--unity调试--长痛不如短痛

1.在vs2022中,工具--获取工具与功能。 2. 安装图中工具,原来我早就安装了。 3 f9下断 同时点击图中按钮 vs此时变为如下状态 unity中出现如下提示: 4 在unity中运行游戏,vs这边确实成功断住了!

柔数组的介绍

柔数组简单介绍 这个词你可能没有听过但是他的确是存在的。 1.在c99中结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员 2这就代表了它存在与结构体中,很重要的一点是,他只能是结构体的最后的一个成员,这是…

面向对象特征二:继承

继承的概述 生活中的继承 财产继承: 绿化:前人栽树,后人乘凉 “绿水青山,就是金山银山” 样貌: 继承之外,是不是还可以"进化": 继承有延续(下一代延续上一代的基因、财…

动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】

一.为什么要有动态内存分配 我们知道,当我们创建变量的时候,我们会向系统申请一定大小的空间内存。比如int a10或者int arr[10];我就向内存申请了4或者40个字节的大小来存放数据。但是当我们一旦申请好这个空间,大小就无法调整了…

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk,Kafka需要Java运行环境,低版本的Kafka还需要Zookeeper,我此次要安装的Kafka版本为2.8.1,已经内置了一个Zookeeper环境,所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…