人脸识别到底在认什么——从几何特征到特征空间,这事儿没那么玄乎
说实话,人脸识别可能是计算机视觉里最"出圈"的一个方向。随便拉个路人来问"你知道人工智能能干啥",十有八九会回答"能刷脸解锁手机"、"能刷脸付钱"。但你要真问他"机器是怎么认出你这张脸的",他肯定一脸懵。这事儿吧,就连很多入行两三年的算法工程师,你让他把整个人脸识别的技术脉络从头捋一遍,他也未必能说得清楚。
咱们今天就从根儿上唠唠——人脸识别到底在"认"什么?
这事儿得从"人是怎么认脸的"说起。你看一个人的脸,下意识会先看五官的布局——眼睛在什么位置、鼻子多高、嘴巴多宽,这些都是"几何特征"。早期的人脸识别算法,就是照着这个思路来的。Eigenfaces那套东西,用主成分分析把一堆人脸图片降维到低维特征空间,然后比欧氏距离。听起来挺数学的,本质上干的还是"找一张脸和另一张脸在结构上像不像"这个活儿。
后来Fisheface用线性判别分析做降维,比Eigenfaces更讲究了——不光要压缩维度,还得让不同人之间的类间距离尽量大、同一个人自己的类内距离尽量小。这个思想一直延续到今天,只是实现手段从线性变换变成了深度神经网络。
再后来到了2010年前后,LBP(局部二值模式)和HOG(方向梯度直方图)这些手工特征成了主流。你提取一个人脸图像的LBP纹理直方图作为特征,跟数据库里的特征做卡方距离匹配,就完成了识别。这一套在当时的FERET和LFW数据集上能跑出不错的效果,而且计算极其轻量,在嵌入式设备上也能跑。我入行那阵子还用过LBP做门禁系统,几百号人的小公司,识别率九成以上,够用了。
但真正让这个领域"炸锅"的,是2014年前后DeepFace和DeepID那一波。深度卷积神经网络直接把"特征提取"这件事从人手工设计变成了机器自己学——你给它海量的人脸图片,它自己去找哪些像素组合最具有区分力。这事儿有多震撼呢?打个不太恰当的比方,以前你是让工匠手工雕琢每个齿轮,现在是让机器自己演化出最优的齿轮结构。这效率差了几个数量级。
后来的发展就是大家熟知的了——FaceNet的Triplet Loss在特征空间里直接拉开类间距离、拉紧类内距离;ArcFace、CosFace、SphereFace这些Angular Margin Loss把分类边界变得极其锐利,让不同类别之间的区分度更变态。到了2020年前后,在LFW数据集上,深度学习模型的识别率已经稳在99.8%以上,比人眼的识别能力还高(人眼在LFW上的识别率大约99.2%)。从技术指标上来说,人脸识别已经过了"能不能用"的阶段,进入了"怎么用才能不出事"的阶段。
但这里我要吐槽一个事儿。很多人现在张嘴就是"深度学习端到端解决了人脸识别",好像发了什么了不得的论文。但实际上,深度学习并没有"解决"人脸识别,它只是把问题从"特征设计"转移到了"数据工程"。你问问任何一个在工业界做人脸识别的工程师,每天操心的最大问题是什么?绝对不是"用ResNet还是用ViT",而是"怎么搞到合规的、覆盖各种光照角度表情的、几百万人的高质量标注数据"。
数据这事儿我跟你们细聊聊。
你在顶会上看到的那些刷榜模型,背后用的训练集通常是MS-Celeb-1M、VGGFace2这类公开数据集,或者私有的大规模数据集(比如Facebook、Google内部搞的不公开的数据)。这些数据的规模动辄几百万人、几千万张图。你一个普通公司,哪来这种规模的数据?就算有,你敢随便用吗?GDPR、个人信息保护法出来之后,人脸数据的采集和使用被卡得死死的,没有明确的用户授权和合规流程,你连100个人的数据都不敢随便存。
所以现在工业界搞人脸识别的一个真实困境是:模型架构越来越趋同,但数据的合规壁垒和规模壁垒越来越成为核心竞争力。 你模型写得再漂亮,没数据训等于零。这话虽然不好听,但这是现实。
再说说"特征空间"这个概念。深度学习做人脸识别的核心就是把每一张人脸映射到一个高维的向量空间里(通常是512维或者128维),这个向量就叫"人脸特征"或"embedding"。理想情况下,同一个人的不同照片在特征空间里应该聚在一团,不同人的照片应该离得远远的。但实际上由于光照、姿态、遮挡、年龄变化等因素,同一个人的特征分布可能很分散,甚至比某些不同人之间的特征距离还要大。这事儿就叫"类内方差大于类间方差",是人脸识别最核心的挑战。
怎么解决?两个方向。一个是数据层面,在训练集里尽可能覆盖同一个人的多种变化——多角度、多光照、多表情、多年龄段。这样模型学到的特征是对这些变化"不敏感"的。另一个是算法层面,用更好的损失函数来强制拉紧类内距离。ArcFace的加性角余量就是这个思路——它不满足于让分类边界把类别分开,还要让边界"带刺",越过这个刺要付出额外的代价,迫使特征挤得更紧。
最后聊一个被严重忽视的问题——人脸识别系统的"阈值选择"。所有生产环境里的人脸识别系统,最后一步都是"判定特征相似度是否超过某个阈值"。阈值设低了,陌生人也能通过(误识率高);阈值设高了,本人可能刷不过去(拒识率高)。这个阈值到底设多少,取决于应用场景:手机解锁可以设高一点(方便用户重试几次),机场安检必须设低一点(宁可多拦几个人盘问,也不能放一个冒名者过去)。阈值不是固定的,它必须根据部署环境的误识率容忍度和拒识率容忍度来动态调整。 很多产品经理不懂这个,拿个0.6的阈值跑天下,出事了怪算法不行,我真想把他们按在椅子上讲两小时工程数学。
行了,第一篇先到这儿。人脸识别这活儿吧,看着简单、用着方便,但背后的工程和数据挑战比大多数人想象的大得多。那些吹"99.99%准确率"的PPT,要么是忽略了一堆边界条件,要么就是在特定测试集上跑出来的漂亮数字——拿到真实场景里,掉到90%以下都是常有的事。
更多推荐

所有评论(0)