人脸检测与识别【选修】
本节定位
人脸任务看起来像“只是检测一个特殊目标”,
但真实系统通常至少包含:
- 找到脸
- 对齐
- 提特征
- 比较相似度
所以这节更重要的是理解:
人脸系统往往是一条流水线,不是单个模型。
学习目标
- 理解人脸检测、对齐和识别之间的区别
- 通过可运行示例理解特征比对的直觉
- 理解人脸系统为什么特别关注误识和隐私问题
- 建立人脸任务的整体流水线感
先建立一张地图
人脸任务最适合新人的理解方式不是“一个模型识别人脸”,而是先把完整流水线看清:
这条线一旦理清,你就不会把人脸系统误以为只是“检测一个特殊类别”。
一个更适合新人的总类比
你可以把人脸系统想成机场值机的三步:
- 先找到旅客是谁
- 再把证件摆正、对齐
- 最后才拿来和系统里的档案做比对
这样理解后,人脸识别就不会再像:
- 一个神秘的“认人模型”
而更像:
- 一条先整理输入、再做比较的流水线
一、人脸识别系统通常有哪些步骤?
- 检测:先找到脸在哪
- 对齐:把角度和姿态尽量规范化
- 表示:提取人脸向量
- 匹配:比较向量相似度
1.1 为什么“对齐”这一步经常被低估?
因为很多新人会天然觉得:
- 把脸框出来就够了
但实际系统里,如果人脸角度、姿态、裁切范围差太多,
后面的 embedding 往往会明显不稳定。
所以对齐的作用更像是:
先把输入拉回到一个更可比的状态。
二、先看一个最小相似度比对示例
from math import sqrt
face_a = [0.9, 0.2, 0.1]
face_b = [0.88, 0.22, 0.12]
face_c = [0.1, 0.8, 0.9]
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
na = sqrt(sum(x * x for x in a))
nb = sqrt(sum(x * x for x in b))
return dot / (na * nb)
print("a vs b:", round(cosine(face_a, face_b), 4))
print("a vs c:", round(cosine(face_a, face_c), 4))
2.1 这个例子最重要的直觉
人脸识别很多时候不是直接分类名字,
而是:
- 看两张脸的表示是否足够接近
2.2 新人第一次学这节,最该先记什么?
最值得先记的其实是:
- 检测负责“先把脸找出来”
- 对齐负责“把姿态拉回更可比的状态”
- 识别很多时候是在比较 embedding,而不是直接输出名字
2.3 阈值为什么会直接影响系统体验?
因为阈值本质上是在决定:
- 多像才算同一个人
阈值设得太松:
- 容易误识
阈值设得太严: