切换科目
重点科目
主要科目
次要科目
科数网
首页
刷题
学习
VIP会员
赞助
组卷
集合
教材
VIP
写作
游客,
登录
注册
在线学习
人工智能
手机的人脸解锁原理
最后
更新:
2026-02-23 20:14
查看:
134
次
纠错
评论(0)
课件
开VIP
手机的人脸解锁原理
## 手机的人脸识别 我一直很好奇 AI 到底是怎么工作的,于是花了很长时间去拆这个东西——手机为什么换了发型还能认出你,ChatGPT 回答你的那三秒钟里究竟在算什么,AI 为什么能通过律师考试却会一本正经地撒谎。这个系列就是我的探索笔记,发现了很多有意思的东西,想分享给你。觉得不错的话,欢迎分享+关注。 {width=400px} 每天早上,你拿起手机,看一眼屏幕,解锁。 整个过程不到一秒。你从来没想过这件事有什么特别的。 不过你可能注意过一个奇怪的事:在几年前,戴上口罩,手机往往就不认识你了。但换了个发型,它照样能解锁。为什么? 先别急着回答。要理解这件事,我们得先搞清楚一个更基本的问题:**手机到底是怎么"人脸识别"的**? 答案要从一个让人意外的事实说起—— 你的手机看到的不是一张脸,而是一堆堆数字。 ## 电脑眼中的照片 要理解手机怎么"人脸识别",得先回答一个基本问题:电脑看到的"照片"长什么样? 一张照片是由很多个小点组成的,这些小点叫像素——你把手机照片放大再放大,就能看到一个个小方块,那就是像素。一张 1000×1000 的照片,就有 100 万个像素 {width=300px} 每个像素都有一个颜色,而颜色在电脑里是用数字表示的。最简单的情况是黑白照片:纯黑是 0,纯白是 255,中间的灰色就是 1 到 254。数字越小越暗,越大越亮。 比如下面这个 5×5 的小图: {width=400px} 电脑里,它就是这样一张表格: ``` 0 0 200 0 0 0 0 200 0 0 200 200 200 200 200 0 0 200 0 0 0 0 200 0 0 ``` 0 是黑色,200 是亮色(接近白色)。你能看出来这是一个十字形吗?——中间一横一竖的数字是 200(亮),其余全是 0(暗)。 这就是电脑"看到"的东西。不是图像,是数字。 彩色照片稍微复杂一点:每个像素需要三个数字,分别表示红色、绿色、蓝色的强度(也是 0 到 255)。但原理完全一样——归根到底还是数字。 所以当你拿手机对着自己的脸,手机"看到"的是这样的东西: ``` 142 98 87 134 156 178 ... 78 45 52 89 123 145 ... 134 167 189 201 178 156 ... ... (几百万个数字) ``` 手机要做的事情是:看这几百万个数字,判断"这是不是主人的脸"。 一堆数字,怎么可能认出一张脸? ## 第一个线索:边缘 什么是边缘?就是照片里颜色突然变化的地方。 比如你的脸和背景之间——皮肤是浅色的,背景可能是深色的,这就形成了一条边缘,也就是你脸的轮廓。眼睛也是:眼白是浅色的,瞳孔是深色的,这也是边缘。 边缘勾勒出了图片里"有东西"的地方。 找到了边缘,你就找到了轮廓、五官、表情——这些让一张脸变得独特的要素。 但电脑只看到数字啊,它不知道什么是"脸"、什么是"眼睛"。它怎么找到边缘? 答案让我很惊讶:只用简单的加减乘除就能做到。 让我用一个具体例子来演示。 ### 一道简单的数学题 假设我们有一小块图片,就 9 个像素,排成 3×3: ``` 10 10 10 10 10 200 10 200 200 ``` 左上角是深色(数字 10,接近黑色),右下角是浅色(数字 200,接近白色)。中间有一条从左上到右下的分界线——这就是一条边缘。 现在我用一个"检测器"来扫描它。所谓检测器,就是一组数字组成的小模板——把它叠到图片上,就能检测出图片里有没有某种特征。这个检测器也是 9 个数字: ``` -1 0 1 -2 0 2 -1 0 1 ``` 这个检测器有个名字,叫 **Sobel 算子**("算子"就是"计算工具"的意思)。它专门用来检测垂直方向的边缘。为什么这几个数字能检测边缘?先看看它怎么用,你很快就会明白。 怎么用呢?把检测器叠放到图片上,对应位置的数字相乘,然后全部加起来。 让我一步一步算给你看: ``` 图片: 检测器: 10 10 10 -1 0 1 10 10 200 -2 0 2 10 200 200 -1 0 1 对应位置相乘,然后全部相加: (10×-1) + (10×0) + (10×1) + (10×-2) + (10×0) + (200×2) + (10×-1) + (200×0) + (200×1) = -10 + 0 + 10 + -20 + 0 + 400 + -10 + 0 + 200 = 570 ``` 结果是 570,一个很大的正数。 这个数字的意思是:这里有一条明显的边缘,从左到右颜色在变亮。 数字越大,说明边缘越明显。 如果我们换一块颜色完全相同、没有边缘的区域呢? ``` 图片: 检测器: 100 100 100 -1 0 1 100 100 100 -2 0 2 100 100 100 -1 0 1 计算: (100×-1) + (100×0) + (100×1) + (100×-2) + (100×0) + (100×2) + (100×-1) + (100×0) + (100×1) = -100 + 0 + 100 + -200 + 0 + 200 + -100 + 0 + 100 = 0 ``` 结果是 0。没有边缘。 你看,完全不需要知道什么是"脸"、什么是"眼睛",只用加减乘除,就能找到图片里颜色变化的地方。 实际使用时,这个检测器会在整张图片上一格一格地滑动,对每个位置都做一次这样的计算。这样就能得到一张新的"边缘地图"——原图中每个位置的数字,变成了"这个位置有没有边缘"的数字。数字大的地方,就是边缘。 这就是电脑"看"图片的第一步:找到所有颜色突变的位置。 ### 为什么这个检测器能工作 你可能会好奇:-1, 0, 1, -2, 0, 2, -1, 0, 1 这几个数字是怎么来的?为什么这样排列就能检测边缘? 让我解释一下它的逻辑。 仔细看这个检测器的结构:左边一列全是负数,右边一列全是正数,中间一列全是 0。 ``` -1 0 1 -2 0 2 -1 0 1 ``` 当它扫描图片的一个区域时,实际上在做这件事: **右边像素的亮度 × 正数(加分) 左边像素的亮度 × 负数(减分) 中间像素 × 0(不影响结果) 所以最终的结果,本质上就是:右边的亮度 - 左边的亮度**。  如果左右两边颜色一样——正数和负数互相抵消,结果是 0(没有边缘) 如果右边比左边亮——正数那边贡献更大,结果是正数(有一条从暗到亮的边缘) 如果左边比右边亮——负数那边贡献更大,结果是负数(有一条从亮到暗的边缘) > 差异越大,结果的数字越大(不管是正还是负),说明边缘越明显。 至于中间那列的系数(-2, 0, 2)比两侧的(-1, 0, 1)更大,是为了让检测器更关注正中间一行的变化,让检测结果更稳定。 这个设计很聪明,但也很简单——本质就是"比较左右两边的亮度差"。 顺便说一下这个检测器的来历:Sobel 算子是 1968 年由 Irwin Sobel 和 Gary Feldman 在斯坦福人工智能实验室的一次演讲中提出的,至今已经用了半个多世纪。 但你可能已经发现了一个问题:这个检测器只能找到垂直方向的边缘(左右亮度差)。如果边缘是水平的(上下亮度差)呢? 很简单——把检测器旋转 90°: ``` -1 -2 -1 0 0 0 1 2 1 ``` 看出来了吗?**现在上面一行全是负数,下面一行全是正数,中间一行全是 0**。 原理完全一样,只是方向变了:它比较的是"下面的亮度 - 上面的亮度"。 如果上下颜色一样——结果是 0(没有水平边缘) 如果下面比上面亮——结果是正数(有一条水平边缘) 两个检测器配合使用——一个管左右,一个管上下——就能找到图片中任意方向的边缘。哪怕是一条 45° 的斜线,也会同时在左右和上下两个方向上产生亮度差,两个检测器都会给出非零结果。把两个结果综合起来,就能得到每个位置的"边缘强度"和"边缘方向"。 ## 从边缘到形状:AI卡了几十年 找到边缘之后呢? 1968 年的 Sobel 算子能找到边缘,但边缘只是一堆线条。一堆线条还不能告诉我们"这是一张脸"。  这就是 AI 在"看"这件事上卡住了几十年的地方。 科学家们尝试了很多方法: 有人试着写规则:"如果有两个圆形在上面,一个三角形在中间,下面有一条横线,那可能是一张脸" 有人试着提取更复杂的特征:"检测眼睛的形状"、"测量鼻子的位置" 但这些方法都撞上了同一堵墙:需要人类告诉电脑什么是"眼睛"、什么是"鼻子"。 一个人的脸可以有无数种表情、无数种角度、无数种光线。侧脸怎么办?戴帽子怎么办?只露出半张脸怎么办? 你怎么可能把所有情况都写成规则? 规则越写越多,但永远覆盖不了真实世界的复杂性。 这个困境持续了几十年,直到一个想法改变了一切: 不要人类来设计检测器,让电脑自己学。 ## 核心突破: 让电脑自己学 还记得前面的 Sobel 算子吗? ``` -1 0 1 -2 0 2 -1 0 1 ``` 这 9 个数字是人类设计的。人类知道"要检测垂直边缘,就要比较左右两边的亮度",所以选择了这样的数字组合。 但如果让电脑自己来选呢? 假设我们不再指定这 9 个数字,而是把它们变成"空的"——可以填入任何数值: ``` ? ? ? ? ? ? ? ? ? ``` 一开始,随机填一组数字,比如: ``` 0.1 -0.3 0.5 0.2 0.1 -0.4 0.3 0.2 0.1 ``` 用这个随机检测器去扫描图片,结果肯定是乱七八糟的。 但如果我们告诉电脑"正确答案"呢? 就像老师批改作业一样。我们先用一个更简单的任务来说明这个过程——区分猫和狗。别担心,人脸识别的学习过程完全一样。 给电脑看 1000 张猫的照片和 1000 张狗的照片,每张都贴好标签——"这是猫"、"这是狗"。 电脑用随机检测器算出一个结果,和正确答案对比: 如果猜对了——不错,保持 如果猜错了——调整那 9 个数字,让下次更可能猜对 怎么调整?不是随机乱调,而是有一套精巧的方法能算出每个数字该往大了调还是往小了调。这个方法叫"反向传播",我后面会专门讲。现在你只需要知道:电脑有办法算出调整的方向和幅度。 重复这个过程几百万次。 神奇的事情发生了:那些原本随机的数字,会自己变成有意义的检测器。 有的变成了边缘检测器(类似 Sobel 算子——电脑自己"发明"了类似的东西)。 有的变成了颜色变化检测器。 有的变成了纹理检测器。 还有一些,检测的东西连人类都说不清楚——但它们确实对区分猫和狗有用。 电脑没有被告知"要检测边缘"。它自己发现了"检测边缘有助于区分猫和狗"。 这就是"学习"的本质:不是有人教了它规则,而是它从大量的对错反馈中,自己找到了有用的规律。 ## 叠加:从线条到人脸 但一层检测器还不够。 一个边缘检测器只能告诉你"这里有一条线",不能告诉你"这是一只眼睛"。 解决方法是:叠加很多层。 想象这样一个过程: 第一层检测器:从原始像素中找到各种边缘——横线、竖线、斜线、曲线 第二层检测器:把第一层找到的边缘组合起来,识别简单形状——圆形、三角形、弧线 第三层检测器:把形状组合成部件——眼睛(两条弧线围成的椭圆)、鼻子(一个三角形轮廓)、嘴巴(两条曲线) 第四层检测器:把部件组合成整体——人脸、猫脸、汽车 `像素 → 边缘 → 形状 → 部件 → 整体`  每一层都是在上一层的基础上,检测更复杂的东西。第一层只能看到线条,但叠加四五层之后,就能看到"脸"了。 这就是"深度学习"里"深度"的含义——很多层检测器叠加在一起。 层数越多,能识别的东西就越复杂。 这种"很多层检测器叠加"的结构,有一个名字,叫**神经网络**。之所以叫这个名字,是因为它的工作方式有点像人脑中的神经元——每个神经元接收信号、处理一下、再传给下一个。  这个类比最早来自 1943 年 McCulloch 和 Pitts 的论文,他们第一次用数学来描述神经元的工作方式。不过你不需要把这个类比想得太深——它只是一种"层层传递、层层加工"的计算结构。层数很多的神经网络,就叫"深度神经网络",用它来学习的方法,就是"深度学习"。 而关键是:每一层的检测器里的数字,都不是人类设计的,是电脑自己从数据里学出来的。 2012 年,神经网络研究的先驱 Geoffrey Hinton 的学生 Alex Krizhevsky 用这种"多层叠加"的方法做了一个图像识别程序,取名 AlexNet(Alex 的网络)。它有 8 层。其中前 5 层做的就是我们前面演示的操作——用检测器在图片上滑动、对应位置相乘再相加(这个操作的专业名称叫"卷积",所以这几层叫"卷积层")。后 3 层负责把前面提取到的所有信息汇总起来做最终判断(叫"全连接层"——你可以把它想象成"汇总投票",把所有检测器发现的信息都汇集在一起,综合判断最终结果)。 整个网络包含 6000 万个可调整的数字。这些可调整的数字,在 AI 领域有一个专门的名称,叫"参数"。AlexNet 的 6000 万个参数震惊了整个计算机视觉领域。而今天的大型模型,动辄几十层、上百层,参数量更是以亿计 ## 训练:电脑怎么知道往哪里调 你可能还记得前面留下的那个问题:猜错的时候,电脑怎么知道该把那些数字往大了调还是往小了调? 这是整个系统最精巧的部分,叫做反向传播——1986 年由 Rumelhart、Hinton 和 Williams 发表在《Nature》(全球最权威的科学期刊之一)上的一篇论文奠定了这个方法的基础。 让我用一个简化的例子来说明。 假设电脑要判断一张图是猫还是狗。经过层层计算,它输出"60% 可能是猫",但正确答案是"狗"。 它错了。错了多少?差了很多——它说 60% 是猫,但应该是 0%。 反向传播做的事情是:从最后的错误出发,一层一层往回追溯,算出每一个数字对这个错误的"贡献"有多大。 就像考试之后对答案: 最终结果错了 是因为最后一步的某个数字偏了 那个数字偏了,是因为上一层的某个检测器输出偏了 那个检测器偏了,是因为里面的某个数字该大一点 电脑会计算:如果某个检测器里的某个数字稍微变大一点,最终的错误会变大还是变小? 如果变小——好,把那个数字调大一点 如果变大——反过来,把那个数字调小一点 每次调整的幅度都很小(比如 0.001),但对所有数字同时做这种微调,重复几百万次之后,那些数字就会逐渐稳定下来,到达一个"很少出错"的状态。 这就是"训练"。 一个现代的人脸识别模型可能有几百万到上亿个参数。比如 Google 在 2015 年发表的 FaceNet,旗舰模型超过 1 亿个参数,在人脸识别领域常用的测试集 LFW(Labeled Faces in the Wild,从互联网上收集的真实场景人脸照片,包含 5749 个人的 13000 多张照片)上达到了 99.63% 的准确率。训练这样一个模型,需要给电脑看几百万张人脸照片,每一张都要把所有参数调整一遍。 这需要大量的计算。 ## 为什么2012年才成功 你可能会好奇:如果"让电脑自己学"这个想法这么好,为什么没有更早实现? 事实上,神经网络的概念在 1940 年代就有了,反向传播算法在 1986 年就发表了。 那为什么到 2012 年才突然成功? 因为三个条件终于同时凑齐了: 1. 数据 2009 年,斯坦福大学的李飞飞教授团队发布了 ImageNet 数据集。最终这个数据集包含了超过 1400 万张标注好的图片,涵盖 2 万多个类别。  "标注好"的意思是:每张图片都有人告诉你"这是猫"、"这是狗"、"这是汽车"。这些"正确答案"是电脑学习的前提——没有答案,就无法判断对错,也就无法调整那些数字。 在此之前,没有人花这么大力气去收集和标注这么多图片。为了建成 ImageNet,李飞飞团队通过亚马逊的众包平台(一种把任务拆成小块、分给大量网上工人完成的平台),动用了来自 167 个国家的近 5 万名标注工人,从 1.6 亿张候选图片中筛选和标注。 2. 算力 训练一个模型,需要对几百万张图片、几千万个参数反复做计算。用普通电脑的 CPU(中央处理器,电脑的"大脑",擅长一件一件地处理复杂任务),这可能要算好几个月甚至几年。 2012 年的突破用了一个聪明的办法:用游戏显卡(GPU,Graphics Processing Unit,图形处理器)来算。  GPU 原本是用来生成(渲染)游戏画面的。游戏画面需要同时计算屏幕上几百万个像素的颜色,所以 GPU 特别擅长"同时做很多简单的计算"。 而训练神经网络恰好也是这种活——对几百万个数字做大量简单的乘法和加法。 2009 年,斯坦福的吴恩达(Andrew Ng)团队就发表了一篇论文,证明在特定任务上,GPU 训练神经网络比 CPU 快约 70 倍。 Alex Krizhevsky 正是用两块游戏显卡(NVIDIA GTX 580,当时售价 499 美元),花了大约 5-6 天,训练出了 AlexNet。 3. 算法 AlexNet 还用了几个关键的技术改进。比如,一种让深层网络更容易训练的数学技巧(叫 ReLU),以及一种防止网络"死记硬背"训练数据的方法(叫 Dropout——随机"关掉"一部分检测器,逼网络学到更通用的规律,而不是死记每张图的细节)。这些技术让更深的网络变得可训练。 三个条件——海量数据、GPU 算力、算法改进——同时到位,才有了 2012 年的突破。 那次突破有多震撼?在 ImageNet 图像识别比赛中,AlexNet 将错误率从同年第二名的 26.2% 直接降到了 15.3%(这里的"错误率"叫 top-5 错误率——给电脑 5 次机会猜图片内容,5 次都猜错才算错)——领先超过 10 个百分点。打个比方:所有人都在 74 分左右竞争,突然有人考了 85 分。 ## 回到人脸识别  现在你知道手机是怎么认出你的了。 让我把完整的过程串起来: 采集面部数据:手机用摄像头和传感器采集你的面部信息,变成几百万个数字(说明一下:现代手机的人脸解锁不只靠普通摄像头——比如 iPhone 的 Face ID 会用红外线在你脸上投射上万个不可见的小点,测量脸的立体形状,这样就不会被一张照片骗过去。但核心识别原理——把采集到的数据变成数字、层层提取特征——和我们前面讲的完全一样) 层层检测:这些数字经过很多层检测器——第一层找边缘,第二层找形状,第三层找五官部件,层层叠加 提取特征:最后一层输出一组数字——你可以把它理解为你这张脸的"数字指纹"(专业术语叫"特征向量",就是一串能代表你长相特征的数字) 比较:把这个数字指纹和你第一次录入时存下的数字指纹做比较 判断:如果两组数字足够接近——解锁 整个过程没有任何"理解"。 手机不知道什么是眼睛、什么是鼻子。它只是在做加减乘除:把像素变成边缘,把边缘变成形状,把形状变成部件,把部件变成一组代表你这张脸的数字,然后比较两组数字有多接近。 那些检测器里的数字,是从几百万张人脸照片中"学"出来的。没有人告诉电脑"要检测眼睛",它自己在反复的"猜对了/猜错了"中发现了某些数字组合对区分不同人脸特别有用。 这就是 AI 的"聪明":不是真的理解,而是从海量数据中找到了反复出现的模式——比如"眼睛区域的像素通常呈现这样的数字组合"。 现在可以回答文章开头的那个问题了:为什么戴口罩手机就不认识你,但换发型还能认出来? 因为口罩遮住了脸的下半部分——嘴巴、下巴这些区域的面部特征被口罩挡住了,检测器提取出来的数字指纹和你录入时的差太远了。而发型属于脸的外围,检测器关注的主要是五官区域的特征——发型变了,但眼睛、鼻梁这些区域的数字模式没变,所以还能匹配上。 不过你可能发现了,现在一些新手机即使戴口罩也能解锁——那是因为厂商后来专门用大量戴口罩的照片重新训练了模型,让检测器学会了只靠眼睛和眉毛区域的特征来识别你。 本文来自博可以,作者:我没有三颗心脏 点击 [此处](https://www.cnblogs.com/wmyskxz/p/19607323)查看原文。
科数题库(单机版)
会议室预约系统(book)
今日还可看
0
篇 未注册用户每天查看4篇,
注册
用户每天8篇,
开通VIP
会员无限制查看。
免费注册
《高等数学》难点解析
高数教程
泰勒公式
切线与法线
切平面与法平面
驻点·拐点·极值点·零点
间断点
渐进线
瑕积分
欧拉方程
伯努利方程
Abel 收敛定理
偏导数的几何意义
偏导数的几何意义
梯度
数量场与向量场
多元函数极值
拉格朗日算子
通量与散度
环流量与旋度
格林公式
高斯公式
斯托克斯公式
三大公式比较
傅里叶级数
极坐标微元
点法式方程
变上限定积分
X型计算面积
Y型计算面积
微分的意义
渐近线
间断点
y''+py'+qy=f(x)方程
高斯
黎曼
傅里叶变换(复数)
拉普拉斯变换(复数)
《线性代数》难点解析
线代教程
近世代数对数学的整体思考
线性的意义
矩阵乘法(列视角)
矩阵乘法(行视角)
矩阵左乘
矩阵右乘
逆矩阵求解方程组
阶梯形矩阵的求法
方程组解的判定
四阶行列式的计算
线性变换的意义
线性空间
向量组的等价
线性空间的几何意义
基础解系的求法
施密特正交化
特征值与特征向量的意义
矩阵相似的几何意义
矩阵可对角化的理解
秩的意义(向量版)
秩的意义(方程版)
二次型的意义
《概率论与数理统计》难点解析
概率教程
置信区间与上a分位数
概率中的“取”与“放”
贝叶斯公式
全概率公式
泊松分布
指数分布
伽玛分布
二维密度图的意义
卷积的意义
相关系数的意义
k阶矩是与矩母函数
卡方分布的作用
单正态区间估计理解
假设检验理解
切比雪夫不等式
中心极限定理
上一篇:
色彩原理RGB/HSL /HSV
下一篇:
第一章 人工智能概述
本文对您是否有用?
有用
(
0
)
无用
(
0
)
赞助:
知乎 Mathhub
启明星
商务合作
赞助本站
科数网
是专业的数学网站,为您提供题库与教程 版权所有 禁止镜像
部分内容采用AI辅助生成,请注意识别
如果页面无法显示请联系 18155261033 或 983506039@qq.com