ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深度学习人脸识别毕设全流程:从数据集到系统落地

深度学习人脸识别毕设全流程:从数据集到系统落地

人脸识别这四个字,放在毕设选题里属于那种“看起来门槛不高、真做起来处处是坑”的典型。每年到这个季节,总有一批同学拿着“深度学习机器视觉人脸识别系统”这个题目来找我聊,问题高度集中:数据集怎么搞、模型选哪个、为什么自己训出来的模型在摄像头前跟抽风一样、答辩时老师问“你这个和现成开源项目有什么区别”该怎么接。这篇就把这套系统从零到能跑、从能跑到能讲清楚,完整拆一遍。

我先把话说在前面:这篇不是让你去复制一个现成仓库改个界面交差,而是帮你建立一套“我知道每一层在干什么”的认知。人脸识别系统本质上是一条流水线——检测、对齐、特征提取、比对,每一环都有它的脾气。你只有把每一环的输入输出、失败模式、调参逻辑摸清楚,答辩的时候才不会被问穿,系统也才真的稳。适合正在做相关毕设的本科生、刚转机器视觉方向的初学者,以及想把这套东西落到实际小项目里的开发者。

1. 先想清楚“识别”到底指哪件事

很多人一上来就说“我要做人脸识别”,但这个词在工程语境里其实覆盖了三件完全不同的事,混在一起做,项目必然拧巴。我见过太多同学把这三件事塞进一个脚本里,最后连自己都说不清系统到底在干嘛。

1.1 检测、识别、验证是三码事

人脸检测回答的是“画面里有没有脸、在哪”。输出是一堆矩形框加置信度,它不关心这张脸是谁。人脸识别(更准确叫身份识别)回答的是“这张脸对应库里哪个人”,本质是一个多分类或检索问题。人脸验证回答的是“这两张脸是不是同一个人”,是一个二分类的相似度判断问题。

这三者的技术栈有重叠但侧重点完全不同。检测用的大多是单阶段或两阶段的目标检测网络,识别和验证则依赖特征提取网络加度量学习。你的毕设如果写“人脸识别系统”,通常要的是“检测 + 识别”的组合:先框出人脸,再判断是谁。而门禁、考勤这类场景,往往用的是“检测 + 验证”,因为它是拿当前脸和登记照做一对一比对。

提示:开题报告里一定要把“识别”和“验证”写清楚,否则答辩时老师一句“你这是分类还是比对”就能把你问住。我建议默认做“检测 + 识别(小规模闭集分类)”,工作量可控,演示效果也直观。

1.2 闭集识别和开集识别,决定了你的系统上限

闭集识别假设测试时的每一张脸都在训练库里出现过,模型只需要在已知的 N 个人里挑一个。开集识别则要处理“陌生人”,系统得有能力说“这个人我不认识”。这两者的难度差了一个量级。

毕设阶段我强烈建议先做闭集,把 N 控制在 10 到 50 人之间,这样准确率好看、演示稳定。如果你非要碰开集,那就必须引入阈值机制:特征距离小于阈值判为已知身份,大于阈值判为未知。这个阈值怎么定,后面第 4 节会细讲,它是开集系统能不能用的命门。

1.3 你的系统边界该画在哪

一个能答辩、能演示、逻辑自洽的系统,边界建议这样画:输入是摄像头实时画面或本地图片,系统完成人脸检测、人脸对齐、特征提取、与本地人脸库比对、输出身份标签和置信度,附带一个简单的登记入口(录入新人员)。超出这个范围的东西,比如活体检测、口罩遮挡识别、跨年龄识别,可以作为“未来工作”提一句,但别真做,做不完也做不深。

把边界画清楚的好处是,你的每一行代码都能对应到系统框图上的一个模块,答辩时指着图讲,逻辑链完整,老师也很难挑刺。

2. 数据集这道坎:没有数据,模型就是空壳

做视觉项目,数据决定了天花板。我见过太多人卡在这一步,要么找不到数据,要么拿到的数据脏得没法用。这一节把数据来源、清洗、划分讲透。

2.1 公开数据集怎么选、怎么用

常见的人脸数据集有几个方向。一类是身份标注数据集,每张图带人名标签,适合做闭集分类训练,规模从几千张到几十万张不等。另一类是人脸验证数据集,成对给出“同人/不同人”的标签,适合训练度量学习模型。还有一类是检测数据集,只标注人脸框,用来训检测器。

对毕设来说,我的建议是:检测环节直接用成熟的开源检测器(后面会讲),不自己训;识别环节用一个小规模身份数据集,或者自己采集。自己采集其实很现实——找同学帮忙,每人拍 20 到 30 张,涵盖不同光照、角度、表情,10 个人就是两三百张,够跑通一个 demo 了。

采集的时候有几个细节必须注意:光照要多样(白天窗边、晚上室内灯、背光),角度要有变化(正脸为主,但要有左右各 15 到 30 度的偏转),表情要自然(别全是证件照式的僵脸,加点微笑、说话状态)。这些变化直接决定模型泛化能力,全是正脸证件照训出来的模型,一到摄像头前就废。

2.2 数据清洗比想象中重要十倍

拿到数据第一件事不是训练,是清洗。常见脏数据包括:重复图片(同一个人同一张图存了多份)、错标(文件名和人对不上)、低质量图(严重模糊、过曝、人脸占比过小)、非人脸图(混进来的风景照)。

清洗流程我一般这么走:先用感知哈希或简单的文件大小加尺寸去重,再用人脸检测器过一遍,把检测不到人脸的图挑出来人工看一眼,最后按身份统计每人的样本数,样本数明显偏少的(比如少于 8 张)考虑剔除或补采。这一步花的时间绝对值回票价,脏数据训出来的模型,你调参调到天亮也救不回来。

2.3 训练集、验证集、测试集怎么切才不泄漏

划分数据集有个大坑叫数据泄漏:同一个人同一个场景拍的多张图,被随机分到了训练集和测试集,模型在测试集上准确率虚高,实际一用就露馅。正确做法是按身份划分——某些人的图全进训练集,另一些人的图全进测试集,这样测试集里的身份模型训练时从没见过,评估才真实。

如果你的身份数很少(比如就 10 个人),按身份划分会导致测试集身份太少,评估不稳定。折中方案是按采集批次划分:同一个人在不同时间、不同地点拍的图分到不同集合,模拟真实使用中“训练时见过的脸,换环境再认”的场景。这个细节写进论文,是很加分的工程考量。

划分方式优点风险适用场景
随机按图划分实现简单严重数据泄漏,指标虚高不推荐
按身份划分评估真实身份少时测试集不稳定身份数较多
按采集批次划分兼顾真实与稳定需要采集时做好记录自采数据首选

3. 流水线拆解:检测、对齐、特征提取各干什么活

系统跑起来是一条链,每一环的输出是下一环的输入。这一节把每个模块的原理和选型逻辑讲清楚,让你知道为什么这么搭。

3.1 人脸检测:为什么我不建议你从零训检测器

检测器的任务是在图里找脸。主流方案分两派:两阶段检测(先出候选区域再分类回归)精度高但慢,单阶段检测(一步到位)快但小脸容易漏。对人脸这种目标,业界有专门优化过的轻量检测器,速度快、对小人脸友好,非常适合实时系统。

毕设阶段从零训检测器是典型的“投入产出不成正比”。检测模型的训练需要大量带框标注的数据,标注成本高,而且通用检测器已经足够好。我的建议是直接用成熟的开源检测方案,把精力放在识别环节。你需要在论文里说明的是“为什么选这个检测器”——比如它的推理速度满足实时要求、对侧脸和小脸召回率好、模型体积适合部署,这些理由比“我自己训了一个”更有说服力。

检测环节有个参数值得调:置信度阈值和非极大值抑制(NMS)阈值。置信度阈值调低,漏检少但误检多;调高则相反。NMS 阈值控制重叠框的合并力度,人脸密集场景(比如合影)要适当调高,否则相邻的脸会被误合并。这两个参数没有标准答案,拿你的实际场景试出来。

3.2 人脸对齐:这一步省了,识别率直接掉一截

检测出来的框里,人脸可能是歪的、斜的、大小不一的。人脸对齐就是根据关键点(眼角、鼻尖、嘴角)把脸旋转、缩放、裁剪到一个标准姿态,通常是 112×112 或 160×160 的固定尺寸。为什么必须做?因为特征提取网络是在对齐后的标准脸上训练的,你喂给它一张歪脸,它提取的特征分布就偏了,比对自然不准。

对齐依赖关键点检测,常见是 5 点(双眼、鼻尖、双嘴角)或 68 点。5 点足够做仿射变换对齐,速度快,是实时系统的首选。对齐的实现逻辑是:根据 5 个关键点算出仿射变换矩阵,把眼睛和嘴巴的位置映射到标准模板的固定坐标上,然后裁剪。这一步用现成的库几行代码就能搞定,但一定要做,我实测过,加了对齐比不加以外,同人比对的特征距离能明显拉开。

3.3 特征提取:度量学习才是识别的灵魂

特征提取网络把对齐后的人脸图映射成一个高维向量(常见 128 维或 512 维),这个向量就是这张脸的“数字指纹”。核心要求是:同一个人的不同照片,向量要靠近;不同人的向量要远离。这个“靠近/远离”的约束,就是度量学习要解决的问题。

经典的损失函数设计思路是类内紧凑、类间分离。早期用 softmax 直接分类,但 softmax 只保证分对类,不保证类内距离小、类间距离大,导致特征判别力不够。后来出现了各种改进的度量损失,核心思想都是给特征空间加约束:让同类特征聚成一团,不同类之间留出间隔。你不需要自己发明损失函数,选一个成熟的主干网络加成熟的损失配置就行,但论文里要能讲清楚“为什么用度量学习而不是纯分类”。

主干网络选型上,轻量网络(如 MobileNet 系列思路的骨干)适合实时和边缘部署,深层网络精度高但慢。毕设演示通常在普通笔记本上跑,我建议选轻量骨干,保证摄像头帧率流畅,演示体验比多那一两个点准确率重要得多。

4. 训练与调参:那些文档里不会写的实战细节

模型结构定了,接下来是训练。这一节讲的是真正会卡住你的东西——学习率、数据增强、过拟合、阈值。

4.1 学习率与优化器:先稳后快

训练人脸特征网络,优化器用带动量的随机梯度下降或自适应方法都行。学习率是第一个要调的:太大,损失震荡不收敛;太小,训到天荒地老。我的经验是先用一个中等学习率跑几个 epoch 看损失曲线,如果损失下降平滑就保持,如果震荡就减半,如果几乎不动就翻倍。

还有个常用技巧是学习率预热和衰减:前几个 epoch 用小学习率 warmup,避免一开始就把权重带偏;训练后期逐步衰减,让模型在最优点附近精细收敛。这套组合拳在数据量不大时尤其管用,能明显提升最终精度。

4.2 数据增强:小数据集的生命线

自采数据往往只有几百张,不加增强必然过拟合。人脸场景有效的增强包括:随机水平翻转(人脸近似左右对称,翻转是安全的)、随机亮度对比度扰动(模拟不同光照)、小角度旋转(模拟头部轻微偏转)、随机裁剪缩放(模拟距离变化)。

但增强要有度。垂直翻转绝对不能用,倒过来的人脸是另一个分布,训进去就是噪声。大角度旋转也要谨慎,超过 30 度且没有对应真实样本时,增强出来的图和对齐逻辑会打架。我的做法是增强参数从保守开始,看验证集表现再逐步放开,每次只改一个维度,方便定位是哪个增强起了作用。

4.3 过拟合的识别与应对

过拟合的典型信号:训练损失持续下降,验证损失先降后升,验证准确率停滞甚至回落。看到这个曲线,说明模型开始背训练集了。应对手段按优先级排:先加数据增强,再加正则化(权重衰减、dropout),再考虑减小模型容量,最后才是早停。

早停是个很实用的策略:监控验证集指标,连续若干个 epoch 不提升就停止训练,保留验证集表现最好的那版权重。这样既省时间,又避免训过头。我一般设 patience 为 8 到 10 个 epoch,配合学习率衰减一起用。

4.4 阈值:开集系统的生死线

如果你做的是验证或开集识别,最终判定要靠特征距离阈值。两张脸的特征向量算余弦相似度或欧氏距离,超过阈值判为同一人。这个阈值怎么定?不能拍脑袋,要在验证集上扫一遍:把阈值从低到高遍历,画出误接受率(把不同人判成同一人)和误拒绝率(把同一人判成不同人)随阈值变化的曲线,选一个两者平衡的点。

实际系统里,安全优先的场景(比如门禁)要把误接受率压到很低,宁可多拒几次;体验优先的场景可以放宽。这个取舍写进论文,体现你懂工程权衡,比单纯报一个准确率有深度得多。

5. 从脚本到系统:工程化落地与演示稳定性

模型训好了只是半成品,能稳定演示、能讲清楚架构,才算一个完整的毕设系统。这一节讲工程侧的事。

5.1 系统架构怎么分层

我建议按“采集层—算法层—业务层—展示层”来分。采集层负责读摄像头或图片,做预处理;算法层封装检测、对齐、特征提取、比对;业务层管人脸库的增删查、识别结果记录;展示层做界面。这样分层的好处是每层职责单一,换摄像头、换模型、换界面都不影响其他层,答辩时讲架构图也清晰。

人脸库的存储,小规模直接用本地文件加索引就行,每个身份存一个特征向量文件加若干原图。规模大了再考虑向量检索库,但毕设阶段没必要,别为了炫技引入一堆依赖,最后环境都配不起来。

5.2 实时性优化:帧率是演示体验的核心

摄像头实时识别,最容易翻车的是卡顿。优化思路:检测不必每帧都跑,可以隔几帧检测一次,中间帧用跟踪算法跟住人脸框,这样能省大量算力;特征提取只对检测到的人脸做,且可以缓存已识别身份的结果,短时间内不重复计算;输入分辨率适当降低,检测和对齐不需要原图那么高的分辨率。

还有一个细节:摄像头读取和算法处理放在不同线程,用队列缓冲帧,避免算法慢导致画面堆积延迟。这个多线程结构在演示时特别重要,否则你一动,画面延迟半秒,观感很差。

5.3 演示脚本与容错

答辩演示最怕现场出意外。提前准备:本地图片兜底(摄像头万一不工作,用图片演示全流程)、预录视频(网络或环境问题时的备份)、人脸库预置(提前录入几个演示身份,别现场录入手忙脚乱)。系统里加基本的异常捕获,摄像头打不开给提示而不是直接崩,这些细节体现工程素养。

6. 答辩会被问什么:把技术选择讲成故事

最后聊聊怎么讲。老师问的往往不是“你用了什么”,而是“你为什么这么选”。

6.1 高频问题的应答逻辑

“为什么用这个检测器?”——答速度、召回率、部署体积的权衡,结合你的实时需求。“为什么不用更大的模型?”——答演示环境算力限制和帧率要求,精度和速度的取舍。“准确率怎么算的?”——答清楚是闭集分类准确率还是验证准确率,测试集怎么划分的,有没有数据泄漏。“和开源项目有什么区别?”——答你的系统边界、你的数据、你的工程整合和场景适配,别硬说算法创新。

6.2 把“调参”讲成“实验设计”

你调过的每一个参数,都是实验。论文里别只写“最终学习率设为某值”,要写“对比了若干学习率下的收敛曲线,选定某值因为收敛最稳”。把调参过程写成对照实验,体现方法论,这是本科毕设里很容易做出差异化的地方。

6.3 诚实地讲局限性

主动说局限反而加分:自采数据规模小、身份数有限、未做活体检测、跨年龄和遮挡场景表现下降。说清楚局限,再给出可行的改进方向,老师会觉得你对自己的系统有清醒认知,而不是盲目吹嘘。

我个人在做这类系统时最大的体会是:算法决定下限,工程决定上限。一个用成熟模型但流水线搭得干净、异常处理到位、演示稳定的系统,评价往往高于一个算法花哨但跑起来磕磕绊绊的系统。把检测、对齐、特征提取这条链的每一环都吃透,把数据清洗和划分做扎实,把实时性和容错处理好,这个毕设就已经赢了大半。剩下的,就是把它讲成一个逻辑自洽的故事。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进