去年帮几个同学看毕设几乎每个人都在做同一件事clone 一个开源人脸识别仓库换成自己的人脸数据跑出 99% 的准确率然后写论文。真正出问题是在答辩现场——老师问了一句“你这个 99% 是在什么口径下测的”人当场卡住。人脸识别这个题目做毕设好处是资料多、能跑出结果、看起来有技术含量坏处也正是资料太多多到大部分人只学会了“调通”没学会“讲清”。这篇东西我想把这条链路上真正会卡住人的地方摊开讲从检测到对齐从损失函数到阈值从训练曲线到答辩提问。适合正在选这个题、已经跑通 demo 但心里发虚、或者想让自己的毕设比同组人扎实一个档次的人看。不保证你三天做完但保证你看完知道自己每一步在干什么。1. 把“人脸识别”收缩成一个能交差的范围1.1 这个题目听起来简单做起来很容易失控“基于深度学习的人脸识别”这个标题最大的陷阱是它太大。人脸识别往下拆至少能拆出人脸检测、关键点定位、活体检测、属性分析、1:1 比对、1:N 检索、视频人脸跟踪这几条分支每一条都能单独做成一个毕设。很多同学一上来就说“我要做一个完整的人脸识别系统”结果做到中期发现自己同时在做检测、对齐、训练、部署、界面五件事每件都只做了一半答辩时被任何一个方向追问都会露怯。我在旁边看下来的规律是做得顺的都是在中前期主动砍掉了范围的人。比如只做“1:N 门禁式识别”明确限定注册人数在 20 人以内、正脸、光照可控或者只做“1:1 比对”把重点放在损失函数和阈值标定上。范围一收窄指标就能做得深论文就有东西写答辩时也敢让老师随便问。反过来什么都想覆盖的最后往往只能拿一个“系统能跑起来”当作全部结论。我建议你在开题前就在纸上写清楚三件事识别是 1:1 还是 1:N、是否为开集即库外人员会不会出现、输入是图片还是视频流。这三件事决定了你后面 80% 的技术选型。1:1 比对可以只关心分数分布和阈值1:N 检索则要额外考虑底库规模、检索耗时和排序策略开集意味着你必须处理“这个人不在库里”的判定这是绝大多数毕设直接跳过、却被答辩老师反复问的点。1.2 评审席上真正在听的三件事很多人以为老师会盯着你的网络结构看其实大部分评审老师的注意力集中在三个地方而且顺序基本固定。第一是问题定义是否清楚。你说做人脸识别识别的是什么输入输出是什么失败情况怎么定义。这部分说不清后面讲得再花哨都是浮的。第二是指标口径是否诚实。你报 99.2%老师第一反应是“在哪测的、测试集和训练集有没有重叠、是不是闭集”。这个问题不是刁难而是这个领域历史上出过太多“在训练集上测出高分”的笑话。你只要主动把口径讲明白——测试集是谁、多少人、多少对、什么条件下采集、有没有和训练身份严格隔离——这一关反而最容易变成加分项。第三是你自己做了哪些决策。整个系统里哪些是直接拿来用的哪些是你改的、调的、验证过的。哪怕你只是把检测器从 A 换成 B 并给出了对比数据也算有决策。老师最怕听到的是“这个仓库里就是这样写的”。1.3 一份可以照着走的范围模板如果你还没定我把我认为性价比最高的一种组合写出来供参考维度建议取值理由任务类型1:N 识别 附带 1:1 比对1:N 有演示效果1:1 指标好算闭集/开集先闭集跑通再补开集拒识开集是加分项不是必需项底库规模20~50 人每人 5~20 张自建成本可控指标稳定输入形式图片 摄像头实时摄像头是答辩演示的刚需检测器现成预训练模型检测不是你的创新点识别模型预训练骨干 自己训练分类头/微调兼顾工作量和可讲性前端桌面 GUI 或极简网页能演示即可别在这里耗时间这张表的核心思路是把工作量压在“能产出对比实验”的地方把不能产出结论的地方全部用现成组件填掉。检测器你自己训一个,精度大概率还不如公开模型而且没有对比基线写进论文也是一句“使用了某某检测器”毫无信息量。但识别侧的损失函数、margin、骨干、数据增强每一个改动都能做一组消融这些才是论文里真正属于你的内容。2. 检测与对齐整条链路上最不该省的两步2.1 检测器选型老方法和新方法差在哪里人脸检测这一步的作用是从整张图里框出人脸区域并给出关键点。它对最终识别精度的影响比大多数人想象的大得多。你后面所有特征提取输入都是检测框裁出来的那块图框歪了、裁多了背景、尺度不对识别模型再强也救不回来。早期的 Haar 级联方案靠手工特征加滑动窗口速度快、资源占用低但在侧脸、遮挡、逆光下漏检严重而且误检率不低。现在做毕设基本不会有人再选它除非你想做个“传统方法与深度学习方法对比”的章节——这倒是一个成本不高、又能凑出实验的写法。MTCNN 是很多教程里的默认选择它把检测拆成 P-Net、R-Net、O-Net 三级级联逐级筛候选框并回归关键点。优点是结构直观、代码好懂、对小脸有一定鲁棒性缺点是推理链路长一张图要过三次网络实时性一般遇到大角度侧脸还是会掉。RetinaFace 是单阶段方案一次前向就出框、五点关键点有的版本还带三维信息。实测在同样硬件下它的速度和召回都比 MTCNN 好尤其是小脸和侧脸场景。缺点是对新手来说预训练的权重要找对版本输入尺寸和归一化方式要和训练时一致不然会出现“框飘”的怪现象。我的建议很直接检测器用现成的 RetinaFace 或 MTCNN别自己训。如果你要做对比实验就把两个都跑一遍在你自己采集的那批图上统计漏检率和关键点误差这组数据放进论文第几章都合适而且是你自己测的答辩时说得清。2.2 五点关键点对齐为什么不能省检测出来的框通常是轴对齐的矩形但人的脸会歪。如果直接把矩形框里的图缩放到固定尺寸喂给识别网络同一个人的两张照片一张头偏 15 度、一张正的特征差异会非常大。对齐这一步就是根据关键点通常是左右眼中心、鼻尖、左右嘴角做相似变换把脸“摆正”到标准姿态。具体做法是用五个关键点解一个相似变换矩阵把当前人脸的关键点位置映射到一组标准模板坐标上然后对原图做仿射变换。OpenCV 里几行就能写完核心是cv2.estimateAffinePartial2D加上cv2.warpAffine。这一步的收益非常直观——我在自己的数据上试过同一个模型加对齐前后1:1 比对在低误识率下的通过率能差好几个百分点尤其是在侧脸样本上。这里有个新手常犯的错对齐用的模板坐标和训练时用的模板必须一致。如果你训练用的是公开预训练模型那它训练时的对齐模板是固定的你在推理时必须用同一套模板坐标否则等于给模型喂了分布外的输入。这个坑很隐蔽表现是“训练集上好好的自己拍的照片就是识别不准”排查起来能耗掉一整天。2.3 检测和对齐失败的三种典型表现第一种是漏检。人明明在画面里就是没框出来。常见原因是侧脸角度过大、强逆光导致脸部过暗、或者脸太小低于检测器的最小可检测尺寸。解决办法要么换检测器要么在采集阶段就把条件控制住——毕设不是工业产品你完全有理由在论文里写明“采集环境为正脸、光照均匀”这不丢人丢人的是明明条件没控制却宣称“鲁棒”。第二种是框歪。框出来了但偏移严重把半张背景裁了进去。这通常是对齐前的框回归不够准或者关键点定位飘了。可以加一步基于关键点的框重算用五个点算出一个包住脸的框再按固定比例外扩比直接用检测框稳得多。第三种是多人脸场景下的选择问题。画面里好几个人你取哪一个很多 demo 直接取面积最大的那个这在答辩演示时会出问题——你站在旁边脸比主测对象大系统就认错了。合理做法是按置信度排序取最高或者干脆做一个“多脸同时识别”的界面把每个人脸框都标出来反而更有演示效果。3. 识别模型与损失函数三代思路的取舍3.1 分类式、度量学习、角度 margin人脸识别模型的演进本质上是“怎么让同一个人的特征靠近、不同人的特征远离”这个问题的三代解法。第一代是分类式。把每个人当一个类别用普通的 softmax 交叉熵训练最后取倒数第二层作为特征。问题是类别数一多分类头参数量爆炸而且 softmax 只要求“分对”不要求“分得开”学出来的特征判别性有限。第二代是度量学习。代表是孪生网络和三元组损失直接优化“同人距离小、异人距离大”。思路很干净但训练不稳定三元组的采样策略极其影响效果采得不好模型直接不收敛。做毕设如果选这条路调参能把你调崩溃。第三代是带角度 margin 的 softmax 变体包括 SphereFace、CosFace、ArcFace 这一系。它们不改网络结构只在 softmax 的 logit 上做文章把特征和权重都归一化到超球面上然后在角度上减去一个 margin强迫同类样本靠得更紧。这一系是目前的主流也是我最推荐毕设使用的方案原因很简单改动小、效果好、论文里好讲。3.2 ArcFace 的那个 margin 到底在做什么普通 softmax 的 logit 是权重和特征的内积模型只要让正确类别的内积比别的大一点点就能过关。ArcFace 做了两件事把权重和特征都做 L2 归一化让内积变成余弦相似度然后在目标类别的角度上加上一个常数 m再乘上一个尺度 s。用代码表示大概是这样import math import torch import torch.nn as nn import torch.nn.functional as F class ArcFaceHead(nn.Module): def __init__(self, feat_dim, num_classes, s64.0, m0.5): super().__init__() self.s s self.m m self.weight nn.Parameter(torch.randn(num_classes, feat_dim)) nn.init.xavier_uniform_(self.weight) def forward(self, feat, label): # 特征和权重都归一化到单位球面 feat F.normalize(feat, dim1) w F.normalize(self.weight, dim1) cos_theta feat w.t() cos_theta cos_theta.clamp(-1.0 1e-7, 1.0 - 1e-7) theta torch.acos(cos_theta) # 只对目标类别加角度 margin target_logit torch.cos(theta self.m) one_hot torch.zeros_like(cos_theta) one_hot.scatter_(1, label.view(-1, 1), 1.0) logits one_hot * target_logit (1.0 - one_hot) * cos_theta logits logits * self.s return F.cross_entropy(logits, label)直观理解这个 margin原本同类样本只要角度比异类小就行现在要求它必须小出至少 m 弧度才算过关。这就逼着模型把同类样本压缩到一个更窄的锥形区域里类间自然就拉开了。s 的作用是把归一化后的余弦值放大回一个有梯度的尺度太小梯度消失太大会训练不稳。业界常用的组合是 s64、m0.5这个配置在大多数数据规模下都能直接开跑。3.3 骨干网络和批大小的硬约束骨干的选择取决于你对部署的要求。如果只是在自己电脑上跑演示ResNet50 或者 IR-ResNet50 是最稳妥的预训练权重好找收敛稳定。如果要在普通笔记本或者树莓派这类设备上跑MobileFaceNet 这类轻量结构更合适参数量大概百万级速度能接受精度损失在可控范围内。这里有个容易被忽略的硬约束带 margin 的损失函数对批大小很敏感。批太小一个 batch 里同类样本太少margin 约束几乎不起作用训练会明显变慢甚至不收敛。我的经验是批大小至少 64能上 128 更稳。但显存是有限的所以常见做法是训练时用大 batch如果显存不够就用梯度累积凑等效批大小或者降低输入分辨率112x112 是这个领域的标准尺寸再降精度掉得厉害。还有一个更隐蔽的点如果你用BatchNorm批大小为 1 的时候会出问题训练时会报错或者行为异常。推理阶段记得切model.eval()否则 BN 会继续用当前 batch 的统计量单张图测试时结果会莫名其妙地飘。4. 数据环节公开集、自建集与那个致命的泄漏4.1 公开数据集能用到什么程度公开的大规模人脸数据集对于毕设来说通常是“太重”的——动辄几万 identities、几十 GB下载和预处理就够喝一壶而且很多需要申请授权。更现实的选择是用中小规模的公开集做预训练或对比基线用自建的小数据集做最终的场景验证。这里要注意两件事。一是授权边界任何数据集的使用都要看清楚它的许可条款能不能用于课程项目、能不能再分发写进论文时要注明来源。二是别拿评测集当训练集这个错误在毕设里出现频率高得惊人——很多人拿 LFW 训练又在 LFW 上测试报出一个漂亮数字,实际上是自欺欺人。如果你的条件不允许下载大规模数据一个务实的路线是用公开预训练模型在百万级身份上训过的那种直接提取特征然后在自己的小数据集上做验证和小幅微调。这样既绕开了大规模训练的资源门槛又能讲清楚“迁移学习”这条线论文里完全站得住。4.2 自建数据集的采集、清洗与复核自建数据集是这类毕设里最能体现工作量的部分也是最容易做砸的部分。我总结了一套流程按顺序走基本不会出大问题。采集阶段要控制变量但保留合理多样性。每个身份至少 10 张覆盖正脸、轻微侧脸左右各若干、戴眼镜与不戴、不同光照室内白光、暖光、靠窗自然光、不同表情中性、微笑。不要全是同一个背景、同一套衣服、同一个角度拍十张——那样训出来的模型在你的测试集上分数极高换个人就崩。清洗阶段是重中之重。人脸检测跑一遍把没检出人脸的、检出多张脸的、框面积过小的、关键点明显错位的全部挑出来人工看一眼。这一步能筛掉大概一到两成的脏数据而这些脏数据对训练的伤害远超你的想象。对齐复核要抽样看。把对齐后的 112x112 小图拼成网格图肉眼扫一遍看看有没有脸被裁掉半边、有没有眼睛位置明显偏的。这个动作花不了十分钟但能提前发现模板坐标用错这类致命问题。4.3 数据增强的尺度以及那个绕不开的泄漏人脸识别的数据增强和通用图像分类不太一样因为增强不能破坏身份信息。水平翻转是安全的颜色抖动幅度别太大大幅改变肤色会影响特征随机裁剪要小心裁掉眼睛就废了旋转角度控制在 ±15 度以内比较稳妥。像 RandAugment 那种高强度增强在这个任务上往往会掉点不建议直接用。然后是数据泄漏这是我见过最多的翻车点没有之一。它的形式有好几种同一个人A 照片在训练集B 照片在测试集。你测出来的准确率反映的是“认识这个人”不是“区分不同人”。同一段视频抽的帧前一半训练后一半测试。相邻帧几乎一样等于把训练样本复制进了测试集。做数据增强时先划分数据集再增强增强后的副本落到了测试侧。底库和查询集共用同一张图的不同裁剪版本。正确的做法是按身份划分不是按图片划分。训练集里的人测试集里一个都不能出现。如果你做 1:N 识别那么查询集里的每个人必须在底库里有注册但查询用的那张图不能是注册用的那张。这条规则写进论文的方法章节会显得你非常专业。5. 训练配置与 loss 曲线一次完整的排查链路5.1 一套可以直接开跑的配置我把自己常用的起点整理成表你可以在这个基础上调项目取值说明输入尺寸112 x 112该领域标准改动收益不大优化器SGD momentum0.9比 Adam 收敛更稳泛化更好初始学习率0.1大 batch/ 0.01小 batch配合 warmup学习率调度warmup 5 epoch cosine前期稳后期细调批大小64 ~ 128低于 64 margin 效果打折权重衰减5e-4常规取值margin m0.5起步值数据量大可试 0.35~0.6尺度 s64与 m 配合训练轮数30 ~ 60小数据集容易过拟合早停如果你用梯度累积来凑等效批大小注意 BN 的统计量是按真实 batch 算的不是累积后的这时候换成 GroupNorm 或者 SyncBN 会更稳。这个细节很少有人提但你一旦遇到“小 batch 训不动”的情况八成就是它。5.2 loss 不降、精度不涨时的排查顺序我遇到过很多次“训练看起来在跑但指标不动”的情况后来总结出一套固定顺序按这个顺序查基本能定位。第一步先确认数据加载对不对。最狠的验证方法是取一个 batch 的图反归一化后存成图片看一眼。我见过有人把 BGR 当成 RGB 喂进去训练照样能收敛但精度就是上不去查了两天才发现。还有人 mean/std 用的是 ImageNet 的而预训练模型用的是 0.5/0.5 的归一化输入分布直接错位。第二步确认标签和特征是对齐的。用一个极小的子集比如 5 个人、每人 5 张过拟合一下。如果连这 25 张图都学不到接近 100% 的训练准确率那说明网络或者损失函数接错了跟数据规模无关。这个“小样本过拟合”测试是排查训练代码最有效的招五分钟就能做。第三步看 loss 的形态。健康的 ArcFace 训练曲线loss 会先快速下降一段然后进入缓慢下降的长尾。如果你的 loss 一开始就是 0.0 几或者一直在 4~5 附近横着不动基本可以判定loss 恒高不动学习率太大或者太小、margin 设太狠、标签错位。loss 直接归零数据泄漏测试集和训练集重合、或者标签和特征错位导致模型作弊。loss 震荡剧烈批太小、学习率太大、或者数据里有大量脏样本。第四步看验证指标和训练 loss 的关系。训练 loss 降、验证指标不涨是过拟合该加正则或者减轮数。训练 loss 不降、验证指标也不动是欠拟合或者有 bug回去看第二步。5.3 那个把我卡了一整天的问题讲一个具体案例。有次训练loss 曲线非常漂亮一路下降到很低但验证集上的 1:1 比对准确率始终在 50% 附近徘徊等于随机猜。我一开始怀疑是验证代码写错了把验证集重新算了一遍还是这样。排查过程是这样的先确认验证集的标签顺序没错排除再确认训练和验证用的归一化一致排除然后把训练集里同一个人的两张图喂进去算特征余弦相似度发现同一个人相似度只有 0.1 左右说明模型压根没学到身份信息。继续往前查最后发现问题在数据加载器上——我写了一个自定义的采样器想保证每个 batch 里每类都有样本但索引映射写错了导致“标签”和“图像”错位模型实际上是在学随机映射。这个 bug 的教训是任何自定义的数据采样逻辑都要用“打印出来看”的方式验证一遍。别相信自己的推理把 batch 里的图和标签一起存成图肉眼确认一遍比什么都快。6. 评估口径与阈值99% 准确率是怎么算出来的6.1 1:1 验证和 1:N 识别根本不是一回事这是答辩时最常被追问的点也是很多人论文里最含糊的地方。1:1 验证的回答是“这两张图是不是同一个人”。做法是构造正负样本对计算相似度扫一遍阈值画出 ROC 曲线报 TARFAR 这种指标比如误识率控制在千分之一时通过率是多少。这个指标的好处是不依赖底库规模横向可比。1:N 识别的回答是“这张图是底库里的谁”。做法是把查询图和底库里每个人比对取相似度最高的那个再判断是否超过阈值。这个指标强依赖底库大小——底库从 20 人扩到 2000 人同样的模型准确率会明显下降因为候选变多撞脸概率上升。所以当有人说“我的系统识别准确率 99%”必须追问底库多少人、闭集还是开集、测试集和训练集身份有没有重叠。你自己写论文时把这几个参数明确写出来比报一个虚高的数字有说服力得多。我建议至少报三组闭集 1:N 准确率含底库规模、开集场景下的拒识率、1:1 验证在固定 FAR 下的 TAR。6.2 阈值不是拍脑袋定的新手最常见的问题是直接把阈值设成 0.5然后发现要么全是误识要么全是拒识。阈值必须在验证集上标定而且要用和实际部署一致的分数定义。一个可操作的流程是这样的拿一批已知标签的验证数据构造正负样本对算每对的余弦相似度然后扫一遍候选阈值统计每个阈值下的误识率把负样本判成正例的比例和拒识率把正样本判成负例的比例。选一个符合你场景要求的点——门禁场景通常要求误识率极低宁可多拒几次体验型场景可以放宽。import numpy as np def pick_threshold(pos_scores, neg_scores, target_far1e-3): 按目标误识率选阈值 thresholds np.linspace(0.0, 1.0, 1000) best None for t in thresholds: far np.mean(neg_scores t) # 负样本被误判为正 tar np.mean(pos_scores t) # 正样本被正确通过 if far target_far: if best is None or tar best[1]: best (t, tar, far) return best # (阈值, 通过率, 实际误识率)还有一点不同人的分数分布是不一样的。有些人脸特征本身就比较“大众”和谁都像有些人特征独特。如果条件允许可以做分数归一化把每个人的分数分布标准化后再比较这在 1:N 场景下能明显改善排序。这个技巧写进论文是个不错的亮点。6.3 别在测试集上反复调参这是学术规范问题也是答辩时容易被戳的点。你调阈值、调 margin、调数据增强都应该在验证集上做测试集只在最后跑一次。如果反复在测试集上试最后报出来的数字是有偏的严格说不能作为泛化性能的估计。很多毕设不讲究这个但你如果在论文里主动写一句“所有超参数在验证集上确定测试集仅用于最终评估”评审老师对你的印象会立刻不一样。7. 从模型到系统推理加速与界面集成7.1 模型导出和推理加速训练完的 PyTorch 模型直接拿来推理不是不行但启动慢、依赖重答辩现场笔记本一卡就尴尬。常规做法是导出成 ONNX用 ONNX Runtime 跑推理速度能提升一截依赖也轻很多。import torch model.eval() dummy torch.randn(1, 3, 112, 112) torch.onnx.export( model, dummy, face_rec.onnx, input_names[input], output_names[embedding], dynamic_axes{input: {0: batch}, embedding: {0: batch}}, opset_version12 )导出时有几个坑。一是model.eval()必须调否则 BN 和 Dropout 的行为会被固化进计算图。二是动态 batch 维度要显式声明不然导出的模型只能跑固定 batch。三是导出后一定要用同一张图分别跑 PyTorch 和 ONNX对比输出差异正常应该在 1e-5 量级差太多说明有算子没对上。7.2 摄像头流水线别让检测拖垮帧率实时演示时如果每帧都跑一遍检测 对齐 特征提取普通笔记本大概只能跑到个位数帧率画面会明显卡顿。几个实用的优化检测降频。检测不用每帧都做可以每 5 帧检测一次中间帧用上一次的框加简单的跟踪比如根据上一帧位置做小范围搜索。人脸在画面里不会瞬移这个策略几乎不影响效果帧率能翻好几倍。异步处理。把视频读取、检测、识别放在不同线程用队列传递帧。读帧线程只管读识别线程只管算界面线程只管画。这样即使识别慢一点画面也不会卡死。底库特征预计算。底库所有人的特征在启动时就算好存进内存识别时只需要算查询图的特征然后做一次矩阵乘法。别每次识别都把底库图片重新过一遍网络那是纯浪费。7.3 界面做到什么程度算够毕设的界面目标是“能演示、不崩、看起来完整”不是做产品。我的建议是最小可用集一个摄像头预览区、一个识别结果区显示姓名和相似度、一个底库管理区能添加、删除、查看已注册的人、一个日志区记录每次识别的时间和结果。技术选型上桌面端用 PyQt 或者 Tkinter 都行PyQt 的摄像头预览更顺网页端用 Flask 加一个简单的页面通过 MJPEG 流推视频前端用img标签接收代码量很小。别在这上面追求美观答辩老师看的是功能闭环不是 UI 设计。提醒一句演示前一定要准备离线方案。现场网络不通、摄像头被占用、依赖版本冲突这三件事在答辩现场发生的概率高得离谱。提前把模型、底库、依赖全部本地化准备一段录好的演示视频兜底。8. 答辩现场的高频提问与论文写法8.1 关于指标口径的追问“你这个准确率是在什么数据集上测的”——标准回答结构是数据集来源、身份数量、图片数量、训练测试划分方式、闭集还是开集、底库规模。这一套讲完老师基本不会再追。“LFW 上 99% 有什么意义”——这是一个有杀伤力的问题。诚实的回答是这个数据集已经接近饱和主要用于和已有方法做横向对比真正体现系统能力的是自建数据集上的结果。你如果能主动承认这一点并展示自建集上的完整评估反而显得清醒。“如果来一个不在底库里的人会怎样”——这是开集问题。你要能说清楚你的拒识策略靠阈值判定相似度低于阈值就判为“未知”并给出拒识率数据。如果没做这块就老实说限定在闭集场景这也是一种回答。8.2 关于创新点的追问本科毕设不需要真正的算法创新但需要“有依据的工程决策”。你可以从这几个角度组织你的贡献点针对特定场景比如弱光、戴口罩做了数据采集和增强策略的调整并给出对比实验。对比了两种检测器在你的数据上的表现选了一个并说明了理由。在损失函数上做了消融普通 softmax vs ArcFace给出了指标差异。做了阈值标定和开集拒识把系统从“能认”推进到“能判断认不出”。做了推理优化把帧率从个位数提到可用水平并给出前后对比。这些都是实打实的工作写出来不比编一个“改进注意力机制”差而且答辩时经得起追问。8.3 论文里最该写清楚的两节第一节是数据集与评估协议。把身份划分、样本数量、采集条件、增强方式、测试口径全部写清楚。这一节写扎实等于提前堵住了答辩一半的提问。第二节是对比实验。至少三组不同损失函数的对比、有无对齐的对比、不同阈值下的指标变化。每组给出表格表格里写清楚条件和数值下面配一段分析说明为什么会出现这个差异。别只贴表格不解释那是实验报告不是论文。我在实际带人的过程中发现论文写得顺的人往往是那些在做的过程中就随手记录的人——每次跑完一个实验把配置、结果、当时的判断写进一个 markdown 文件。到最后写论文时这些记录直接就是素材不用回忆半个月前那个模型到底用的什么学习率。这个习惯看起来笨但省下来的时间远超投入。最后分享一个小技巧答辩 PPT 里放一页“已知局限”主动写出你的系统在侧脸、遮挡、跨年龄上的不足并说明原因。这一页几乎每次都能换来老师的点头因为绝大多数人只讲成绩不讲局限而你讲了说明你真的理解自己做的东西。
阅读完成 · 觉得有帮助?