本节摘要:人脸识别不是一种单一操作,而是一组"识别范式"——一对一验证(核验你自称是谁)、一对多搜索(在海量库里找你是谁)、活体检测(确认眼前是活人而非照片)。本节把判断"该用哪种范式"的方法交给你,并把后续贯穿全书的七工位流水线一次排开,作为后面所有章节的空间坐标。
阅读完本节,你应当能够:
三年前给公司大楼装门禁,采购问你:"要验证还是搜索的?"你可能一时语塞——不都是刷脸吗?差别大了。门禁是"你说你叫张三,我核一下脸对不对",这叫验证,库可能就几百人;可如果是警方从一段监控里捞出一个身影,要在几百万人的库底里指出"这人姓甚名谁",这叫搜索,库是百万级。两者连评估指标都不同:验证关心"报销率"(让本人过,卡掉别人),搜索关心"能不能在头几名里找对人"。
再深一层还有第三种:无论是验证还是搜索,如果你遇到的设备抬起来的是张高清打印照片、一段翻拍的手机视频,模型一样会"放行"——因为它只看了"像不像",没看"是不是活的"。所以真正上线的系统,几乎都额外带一层活体检测,专门区别真人和伪造物。理解这三种范式,是选型的第一道分水岭。
| 范式 | 你要回答 | 输入 | 规模 | 关心的指标 |
|---|---|---|---|---|
| 一对一验证 1:1 | "他是不是他自称的人" | 一张脸 + 一个待核身份 | 单条比对 | 误识率、正确接受率 |
| 一对多搜索 1:N | "他是这堆人里的谁" | 一张脸 + 整座库 | 万级到百万级 | 头 N 命中率、搜索耗时 |
| 活体检测 | "这是不是活的" | 一张脸画面 | 单张 | 防伪漏检率、拒绝率 |
验证的场景典型是手机解锁、刷脸支付、远程开户——你带着"我是我"的声明来,系统只做一道判断题。搜索的场景典型是安防追逃、海量库会员识别——系统主动从人群中指出身份。活体检测是个"守门员",在验证或搜索都发无忧时,负责把照片、视频、面具挡在门外。大多数系统是这三者按需叠起来的:比如"1:N 找人 + 活体防伪"的组合,在零售会员识别中很常见。
无论哪种范式,底层都跑在一条几乎固定的流水线上。别看它长,每段只干一件事,下一段的输入恰是上一段的输出。
按识别范式,前四段几乎通用,差别主要出在比对段的策略和二段后的活体。这条流水线在第 2 章会被逐段拆开、填进原理,第 3、4 章再给每段配上算法与工程实现。先记住它,后面所有知识都能在这条线上找到落脚点。
为了让你直观感受"检测—对齐—特征—比对"在代码层是什么手感,下面给出一个演示性的最小化骨架(示意,非完整实现):
# 最小识别流水线的"分诊台"抽象 def step_detect(frame): return bboxes # 出一堆候选框 def step_align(bbox): return aligned # 摆正到标准网格 def step_embed(aligned): return vector # 压成身份签名 def step_match(vector, db): best, score = None, -1 for pid, ref in db.items(): s = cosine(vector, ref) # 比较方向 if s > score: best, score = pid, s return best, score db = {"alice": embed(align(detect(photo_a))), "bob": embed(align(detect(photo_b)))} query_vec = embed(align(detect(live_shot))) print(step_match(query_vec, db)) # 输出 (最接近的身份, 相似度分)
这段骨架的价值是把"七工位"压缩成四步可执行逻辑,并点出比对段的核心是"算相似度"。真实的工程远比这精细——检测要出多框、对齐要出 68 至 106 个关键点、特征要几百维、比对要上索引加速——这些分别在后面章节逐一展开。
💡 关键直觉:验证是"判卷",搜索是"查档",活体是"验身"。三件事解决的问题不同,别指望同一个部署全部覆盖,也别把它们的指标混在一起写进一个验收报告。
⚠️ 常见坑:用验证场景的指标去验收搜索系统。1:1 的误识率再好看,也说明不了"在百万库里前 10 名找到人"有多难。
这一章把总图立起来了。下一章就钻进流水线的第一个工位,从"图像到底是怎么送到检测前"讲起。