跳到主要内容

青椒课堂实训

· 阅读需 24 分钟
Andy Jin

总览

本文面向研发与落地应用,总结两个视觉项目的完整流程与关键技术:一是基于目标检测加文字识别的车牌识别方案,二是基于度量学习的人脸识别方案。全文以文字段落形式呈现,不包含示例代码与具体文件路径,重点说明流程、原理、实地配置要点、评估方法与部署细节,覆盖环境与依赖、数据准备、训练与评估、推理与部署、实现要点及问题处置。

本项目实地硬件环境为:CPU 采用英特尔至强金牌系列,GPU 采用英伟达 A10 单卡(显存 24GB),系统内存 30GB。训练与推理均在该环境下进行参数选型与性能验证。


一、车牌识别项目(检测 + 文字识别)

1.1 项目目标与总体流程

目标是在复杂背景下准确、稳定地输出车牌文本,适配不同颜色与尺寸的车牌,并兼顾边缘设备的实时性。整体流程包括图像采集、车牌区域检测、区域裁剪、文字识别与结果输出。检测阶段通过训练目标检测模型,识别阶段采用通用中文文字识别系统,最终形成端到端的车牌号码输出,可与外部业务系统进行匹配与权限校验。

1.1.1 模型原理入门(检测 + OCR)

车牌检测使用的是现代目标检测思路。可以把图片理解成一个“特征网格”,每个网格位置都尝试回答两个问题:这里有没有目标、如果有它的框在什么位置。具体到本项目:

  • 检测头是“无锚框”的设计,不再预设一堆不同长宽比的框,而是让网络直接输出目标的中心点位置和宽高。这种方式对车牌这类“窄而长”的目标更友好,减少了匹配误差。
  • 置信度表示“这里有车牌”的把握程度;类别分支输出车牌的类别(如绿牌、蓝牌)。
  • 框回归使用基于交并比的度量(例如广义交并比),它衡量预测框与真实框的重叠程度,重叠越多越好。
  • 分布式回归(DFL)把“边界位置”看作一个小范围的概率分布来刻画,而不是一个单点,从而让边界拟合更精细,特别适合边缘清晰但像素很细的目标(如车牌边框和字符边界)。
  • 推理时会用“非极大值抑制”把重叠的多个候选框合并,只保留最有把握的那一个,避免重复输出。

车牌识别使用通用 OCR 思路来“读字符”。可以把裁剪出的车牌当作一张包含字符的细长小图:

  • 首先进行方向判断,如果图像有轻微旋转,先把它“摆正”,有助于后续识别。
  • 接着把图像送入识别网络,网络会把图片逐步“看成”一串特征,再把这串特征“翻译”为字符序列。这里常见的是“视觉特征提取 + 序列建模 + 解码”的结构组合。
  • 识别结果会包含省份简称、大写字母与数字。车牌中间的分隔点不是有效字符,会在输出中清理掉。
  • 对于一张图片里出现多个车牌的情况,检测会输出多个框,然后逐个裁剪并识别,最终按从左到右的顺序输出结果。

1.1.2 YOLOv8 模型家族与本项目选型

YOLOv8 是一组从小到大的模型族,常见规模从小到大依次为 n、s、m、l、x。规模越大,参数与计算量越多,精度上限更高,单张推理延时也相应更长。其共同点是:采用现代化主干网络与颈部结构、解耦的检测头、无锚框回归以及用于细化边界的分布式回归。

在本项目的实地环境中,训练使用中小规模的配置以平衡精度与训练时长;推理阶段在实时场景中采用较小规模以降低延时,在离线评测中采用中等规模以观察上限指标。以上规模切换基于同一框架与同一训练流程,仅改变模型规模与推理阈值即可保持一致的输出格式。

本项目实际部署选择使用 s 规模的权重。原因如下:

  1. 精度-延时权衡:在英伟达 A10(24GB 显存)上,s 规模在单张推理延时与 mAP 指标之间达到平衡,满足实时车道入口场景的响应需求;m、l、x 规模带来有限精度提升,但单帧时延与资源占用显著上升。
  2. 数据特性匹配:车牌目标窄长、尺寸分布跨度较大,s 规模在引入分布式回归与无锚框头的前提下,已能稳定覆盖小尺度与倾斜样本;n 规模在小目标与复杂光照下易出现召回波动。
  3. 资源与吞吐:s 规模显存占用低于中大模型,便于与 OCR 同卡流水线并行,保证检测与识别两阶段的整体吞吐与稳定帧率。
  4. 训练-部署一致性:以 s 规模完成微调与评估,避免因规模切换造成的分布偏移与阈值重标定,减少上线前的额外适配工作。

1.2 环境与依赖

实地环境按以下组合完成:操作系统为常见 64 位 Ubuntu Linux 环境,Python 版本 3.9,深度学习框架与 CUDA 对应匹配,GPU 驱动支持英伟达 A10。检测侧使用主流的目标检测训练与推理库;文字识别侧使用中文场景的 OCR 库,并安装 GPU 版本以获得更高吞吐。内存 30GB 用于数据缓存与训练时的数据管线,显存 24GB 用于单卡训练与推理。

1.3 数据准备(CCPD2020)

数据可采用公开的城市车牌数据集,常见的蓝牌与新能源绿牌均有覆盖。该数据集的图片文件名中通常包含车牌框四点坐标、边界框信息、成像角度以及字符索引等丰富标注,可通过解析规则自动生成训练所需的检测标注。标注目标是将每张图片中的车牌转换为中心点与宽高的归一化表示,并区分不同车牌类型的类别标识。数据划分建议包含训练集、验证集与测试集,数量配比可按任务规模与资源调整。目录组织上,建议将图像与标注分置于明确的子目录中,并使用统一的数据配置描述文件指示训练和验证路径及类别名称。

1.4 训练流程与参数调优(检测)

训练以迁移学习方式开展,加载通用数据集上预训练的轻中型检测模型进行微调。输入尺寸设定为 640 以平衡精度和吞吐,数据增强包含随机尺度、翻转与颜色扰动。单卡显存 24GB 下,批量大小设定为 32;数据加载线程数为 4;启用图像缓存以利用 30GB 系统内存。训练轮次为 50,优化器为动量随机梯度下降,初始学习率 0.01,动量 0.9,权重衰减 0.0005,采用余弦退火策略进行学习率调度,热身 3 个轮次。损失项包含定位、分类与分布式回归三部分,损失平衡系数维持默认配比。验证间隔为每个轮次结束时评估一次。

1.4.1 超参数与取值说明(检测)

  • 输入分辨率:640。该分辨率在 A10 上的单卡吞吐与 mAP 指标处于均衡点,更高分辨率带来轻微精度提升但推理延时显著上升。
  • 批量大小:32。基于 24GB 显存的显存占用测算,包含模型、特征图与优化器状态,32 可稳定运行且保留一定余量,利于梯度统计稳定。
  • 初始学习率:0.01。动量 SGD 的标准量级,配合余弦退火与热身避免前期梯度震荡与后期收敛停滞。
  • 动量:0.9。用于历史梯度的指数平滑,提高收敛速度并降低局部噪声。
  • 权重衰减:0.0005。对可学习权重施加 L2 正则,抑制过拟合并稳定训练。
  • 学习率调度:余弦退火。学习率从初始值平滑下降至近零,匹配目标检测中后期微调的需要,避免阶梯下降造成的震荡。
  • 热身轮次:3。前 3 个轮次以线性增大学习率,防止随机初始化或预训练权重迁移初期的过大更新破坏特征分布。
  • 数据增强:随机尺度、水平翻转、颜色扰动。随机尺度用于提升尺度鲁棒性;水平翻转匹配道路双向通行场景;颜色扰动覆盖昼夜与光照差异。
  • 标签平滑:关闭。车牌仅两类(或少量类别),关闭标签平滑维持清晰的决策边界。
  • 分布式回归损失(DFL):开启。通过对边界分布建模细化回归量化精度,提升窄长目标(车牌)边界质量。
  • Anchor-free 输出头:开启。以中心点与宽高直接回归,避免锚框设计对窄长目标的匹配偏差,提升跨尺度泛化。
  • 非极大值抑制 IoU 阈值:0.7。用于合并重复候选;在多车牌近邻场景下保持足够的区分度。
  • 置信度阈值:0.25。用于过滤低置信度冗余候选,配合 0.7 的 IoU 阈值获得更稳定的框集合。
  • 浮点精度:混合精度训练开启。A10 的张量核心对 FP16 计算友好,在不影响收敛的前提下降低显存与提升吞吐。
  • 同步 BatchNorm:关闭。单卡训练且批量大小充分,无需跨设备统计同步。
  • 梯度裁剪:关闭。观察到损失与梯度范数稳定,无需额外裁剪;如遇到极端数据再行启用。

1.5 推理流程与参数设定(检测+OCR)

推理时,检测阈值设置为 0.25,用于过滤低置信度目标;非极大值抑制的交并比阈值设置为 0.7,以合并冗余框。得到车牌框后,按照框边界向外扩展 5% 进行裁剪,生成车牌子图输入至中文 OCR 引擎。OCR 配置启用方向分类,中文语言包,关闭 OCR 内部的检测功能,直接执行识别。识别结果中包含中点分隔符的情况,按实际车牌格式进行字符清洗并保持大写字母与数字的区分。对于同一图像内多车牌场景,按检测框从左到右排序输出识别文本。

1.5.1 超参数与取值说明(OCR)

  • 文字方向分类:启用。车牌可能存在轻微旋转,方向分类纠正特征方向,有利于提高识别稳定性。
  • 语言配置:中文。覆盖省份简称与大写字母、数字字符集,匹配车牌字符空间。
  • OCR 内部检测:关闭。外部检测已提供精确框,直接进入识别分支可减少冗余计算与时延。
  • 裁剪扩展比例:5%。缓冲检测框边界误差,降低字符被截断的概率,同时控制背景引入不超过可接受范围。
  • 文本长度上限:依据国内车牌长度设定固定上限,防止异常长串导致的解码偏移。
  • 归一化分辨率:将子图重定尺寸到 OCR 识别的期望长宽比,保持字符纵横比,避免几何失真引入的错判。

1.6 模型与实现要点(检测+OCR)

检测模型采用 anchor-free 架构,主干网络与颈部结构为现代化的轻中型设计,具备较好的尺度鲁棒性与推理速度。输出头直接回归目标中心点与宽高,结合分布式回归损失提升边界框质量。OCR 模块采用通用的中文识别体系,内含文本方向分类与字符识别两部分;在车牌场景中关闭 OCR 内部检测,仅保留识别分支。车牌文本输出使用固定的字符集映射,统一取消中点分隔符,并以省份简称与字母数字的规范顺序输出。

1.7 评估与指标(检测+OCR)

检测侧使用基于不同 IoU 阈值的平均精度作为主指标,同时记录不同置信度阈值下的精查率与召回率曲线;在英伟达 A10 上的单张推理时延作为吞吐参考。识别侧以字符级准确率与编辑距离衡量文本质量,并以整牌级准确率反映车牌级别的正确性。端到端评估以“检测到文本”的整体正确率为准,并记录端到端时延(检测阶段时延与 OCR 阶段时延分别统计)。

1.8 部署配置(检测+OCR)

部署时导出通用中间表示格式供推理引擎加载,针对英伟达 A10 编译为高性能引擎,启用半精度模式以降低延时与显存占用。在线服务将检测与 OCR 分为两个串联节点,在同一 GPU 上以流水线方式运行;批大小为 1 的低延时模式用于实时场景,离线处理可在批大小为 8 的模式下运行以提升吞吐。内存 30GB 用于缓存检测阶段的中间结果与 OCR 子图,减少重复解码和拷贝。

1.9 问题处置(检测+OCR)

车牌定位偏差导致的识别失败,通过固定比例的边界扩展进行处置。夜间或过曝场景下的识别不稳定,通过数据集引入低照度与高亮数据并在推理前进行亮度校正进行处置。跨场景域偏移通过补充新场景样本并执行小规模再训练进行处置。


二、人脸识别项目(度量学习)

2.1 项目目标与总体流程

该项目旨在学习具有判别性的低维人脸特征向量,可用于身份验证与识别。流程依次为数据清单与标签准备、模型构建、训练与验证、推理与评测。训练阶段通过加入角度间隔的损失函数增强类间分离度与类内紧致度;推理阶段通过计算特征间的距离衡量相似度,距离越小代表越相似。

2.1.1 模型原理入门(人脸)

人脸识别的核心思想是把一张人脸“压缩”为一个向量(也叫“特征”或“嵌入”)。同一个人的不同照片得到的向量要尽量接近,不同人的向量要尽量远离。实现过程可以理解为三步:

  • 特征提取:用卷积神经网络把人脸图片变成一个固定长度的向量。轻量网络更省算力,深层残差网络表达力更强。
  • 角度空间:把特征向量“单位化”,也把分类权重“单位化”,这样网络学到的区别主要体现在“方向”上(即角度),而不受向量长度影响。
  • 角度间隔(ArcFace):在类别之间人为加一个固定的“角度间隔”,强迫同类样本更紧、不同类更分离。训练时仍然用常见的交叉熵损失,但由于有了角度间隔,网络学到的边界更“硬”,对陌生人和相似人的区分力更强。缩放因子用于把角度上的差距放大到损失函数合适的数值范围中,保证梯度足够有效。

推理时不再做分类,而是提取两个向量并计算它们的“距离”或“相似度”,距离小到一定程度就认为是同一个人。为了让这个判定稳定,输入的人脸需要先被检测出并按照眼睛、鼻尖等关键点进行“对齐”和“裁剪”,保证网络看到的脸都是端正、大小一致且位置规范的。

2.1.2 ArcFace 定义与直观公式解释

ArcFace 的目标是在“角度空间”中拉开不同身份的间隔、压紧同一身份的分布。做法是:

  1. 先把特征向量和类别权重都做单位化,这样它们都落在一个单位球面上,分类等价于比拼“方向”(夹角)。
  2. 对正确类别对应的夹角,额外增加一个固定的角度间隔,再把这一差异放大到合适的数值范围输入到交叉熵中。

直观理解是:如果把每个身份想象成球面上的一个“方向”,ArcFace 会强制同一身份的样本朝着这个方向更紧地聚拢,并且与其他身份之间留出一个固定的“角度空隙”。尺度因子负责把角度差异映射到损失函数易于学习的数值区间;角度间隔的大小直接控制类别之间需要分开的“最低角度距离”。这样的几何边界,比普通的分类更加“硬”,对相似脸的区分力更强,同时保持对未知身份的良好泛化。

2.2 环境与依赖

实地环境同上:英特尔至强金牌系列 CPU,英伟达 A10 单卡(24GB 显存),系统内存 30GB。Python 与深度学习框架版本与检测项目一致,确保训练过程中的 GPU 加速与数据管线稳定性。

2.3 数据准备

数据清单建议以文本形式维护,每行包含图像路径与类别标识,便于快速统计类目数量并构建训练与验证数据集。评估阶段可参考通用的人脸验证对照集,按固定的配对列表计算验证指标,以确保不同阶段结果具备可比性。

2.4 模型结构与关键技术

特征提取网络采用两类配置:一类为轻量化网络,输出 128 维嵌入,适配端侧与实时验证;另一类为更深的残差网络,输出 512 维嵌入,用于对精度要求更高的场景。损失头部对特征与类别权重进行归一化,并在角度空间引入固定间隔与尺度因子,形成更具判别性的分类边界。主干网络由残差块、批归一化与 PReLU 组成,在浅层以步幅下采样,末端通过全连接与一维批归一化得到最终嵌入。

2.5 训练配置与参数调优(人脸)

输入分辨率为 112×112。主干网络在轻量化与残差网络两种配置中选择,其中部署采用轻量化主干,训练输出 128 维嵌入;对比实验使用残差 50 层主干输出 512 维嵌入。优化器为动量随机梯度下降,初始学习率 0.01,动量 0.9,权重衰减 0.0005,采用余弦退火学习率调度,热身 1 轮。批量大小在英伟达 A10 上设定为 256(轻量主干)与 128(残差主干),启用混合精度训练以降低显存占用与提高吞吐。训练总轮次为 100,验证集比例约 1%。评估集采用标准对照集,按固定的配对列表在每个若干轮次进行一次评估,记录验证准确率、等错误率与曲线。

2.5.1 超参数与取值说明(人脸)

  • 嵌入维度:轻量主干 128,残差主干 512。128 维满足检索延时与存储需求,512 维用于对比实验中观察精度上限。
  • ArcFace 尺度因子 s:轻量主干 32,残差主干 64。s 用于放大余弦间隔到 softmax 的数值空间,使角度间隔在损失中产生足够梯度;更高容量的主干配更大的 s,使分类边界更陡峭。
  • ArcFace 角度间隔 m:0.5。m 在角度空间上拉开类间距离并压缩类内分布,0.5 在公开基准中稳定有效,结合 s 的设定可获得良好判别性。
  • 归一化策略:特征与权重均做 L2 归一化。该策略将度量转化为纯角度空间,避免不同样本范数差异带来的偏置,匹配 ArcFace 的几何假设。
  • BN 设置:特征层后一维批归一化权重固定为 1 且不参与训练。该设置稳定特征尺度,避免 BN 统计与 ArcFace s 因子的耦合波动。
  • Dropout 概率:0.5(残差主干),轻量主干关闭。较深网络在全连接前加入随机失活抑制过拟合;轻量主干容量较小不需要额外正则。
  • 批量大小:轻量主干 256,残差主干 128。结合 24GB 显存与混合精度的占用测算,保证梯度统计稳定与吞吐上限。
  • 初始学习率与调度:0.01 + 余弦退火,热身 1 轮。人脸分类头在早期对学习率敏感,短热身避免破坏主干预训练分布,退火有助于收敛到更优的角度边界。
  • 优化器:动量 SGD(动量 0.9,权重衰减 0.0005)。动量项平滑更新方向,权重衰减抑制过拟合,符合度量学习的稳定收敛需求。
  • 混合精度训练:开启。在 A10 上降低显存占用并提高吞吐,对收敛与特征角度分布无不良影响。
  • 同步 BatchNorm:关闭。单卡训练,无跨设备统计需求;单卡大批量保证统计稳定。
  • 验证采样:验证集占比约 1%。用于监控过拟合与阈值固化,配合固定配对列表保证可比性。

2.6 推理与评测(人脸)

推理阶段对齐并归一化后的人脸图像输入模型,输出单位范数的特征向量,使用欧氏距离或余弦相似度进行判别。在线验证以单对人脸输入、批量大小为 1 的方式运行;离线比对以批量大小为 64 的方式运行。库规模较大时采用向量检索结构进行加速,索引构建在初始化阶段完成。评测方面,对照集以标准配对为准,输出真阳率、假阳率、等错误率与曲线;阈值在开发集上固定后用于线上判定。

2.7 评估指标与阈值(人脸)

评估指标包含在固定错误率下的真阳率、受试者工作特征曲线与等错误率。阈值在开发集上通过网格搜索确定,并在验证集上固化,线上采用同一阈值执行判定。

2.8 部署配置(人脸)

部署采用轻量化主干与 128 维嵌入的配置,导出通用中间表示并加载至高性能推理引擎,启用半精度模式。在线服务以批量大小为 1 的低延时模式运行;离线比对以批量大小为 64 的方式运行。特征检索采用标准的近似最近邻结构,索引在服务启动时加载至内存并常驻,内存占用不超过 30GB 的限制。

2.9 问题处置(人脸)

训练早期不收敛通过降低初始学习率并延长热身轮次进行处置;身份混淆通过提升角度间隔或采用更强主干进行处置;部署延时通过启用半精度与批处理进行处置。


三、跨项目对比与实践建议

车牌任务为检测与识别的两阶段串联,检测框质量决定识别效果;人脸任务为度量学习范式,对齐质量影响最终性能。两类任务的数据覆盖均包含复杂光照、角度与遮挡场景。部署均采用高性能推理引擎与半精度模式,并按算力选择轻量或中型骨干,服务侧使用流水线并行以提升吞吐。


四、快速复现清单

4.1 车牌识别

检测与识别组件准备完成后,整理并转换车牌数据,形成规范的图像与标注目录,并编写数据配置描述。完成后进行迁移学习式的检测模型训练,得到权重并完成验证。推理阶段将图像输入检测模型得到车牌框,裁剪后送入文字识别模块输出文本,最后对接业务。部署阶段导出中间表示并编译高性能引擎,启用半精度,在线以批大小为 1 运行。

4.2 人脸识别(ArcFace)

准备包含类别标识的数据清单与图像集,选择主干网络与是否加载预训练,配置训练超参数与学习率策略,启动训练并以验证集与标准测试集作为质量监控。推理阶段将对齐人脸输入模型获得特征,计算距离用于验证;在系统中将特征写入向量库以支持检索。部署阶段导出高性能推理格式并加载索引至内存。


五、训练结果分析

5.1 车牌检测与识别训练结果

损失曲线:定位、分类与分布式回归损失在前段快速下降,中后段进入缓慢收敛区间,训练与验证曲线间距保持稳定,无明显抬头或震荡,符合迁移学习微调的典型走势。

指标走势:基于不同交并比阈值的平均精度逐轮上升并逐步趋稳;随置信度阈值变化,精查率提升、召回率降低的趋势清晰,PR 曲线形态正常。端到端评估中,文本级准确率与整牌级准确率与检测侧 mAP 的变化基本同向。

样例可视化:训练与验证样例中,检测框与标注重叠度高;多目标场景下框体排序与间隔合理;倾斜、小尺度与部分遮挡样例逐步被召回。端到端可视化显示,裁剪子图中的字符区域完整,识别输出与肉眼核对一致。

主要误差模式:

  • 小尺寸与远距车牌的召回依然是相对难点,误差主要集中在极小目标与强压缩图像。
  • 夜间、强背光或高反光场景下,检测与识别的置信度整体偏低,但未出现系统性失效;方向纠正与子图重定尺寸后,字符解码趋稳。
  • 临近两车牌产生的重叠候选在阈值与抑制参数固定后显著减少,残留个案集中于近距离并排行驶场景。

结论:在既定轮次与超参数配置下,检测侧 mAP 与端到端整牌正确率达到目标区间;检测与识别两阶段串联的总时延满足实时入口场景的响应需求。

5.2 人脸识别训练结果

损失与精度:训练损失前期快速下降,随后缓降并收敛;验证集准确率稳步提升并趋于平台。训练与验证曲线未出现显著剪刀差,模型容量与正则化处于平衡状态。

对照评测:标准对照集上的真阳率—假阳率曲线形态良好,等错误率随训练推进下降后趋稳;在开发集上选取的阈值在验证集复核一致,判定边界稳定。

嵌入分布:同身份向量间距离分布收缩,不同身份间距离分布外移,二者重叠区随训练推进缩小;二维可视化中类簇分离度增强、类内半径减小。

吞吐与延时:在线验证批大小为 1,延时满足实时核验;离线批量比对批大小为 64,吞吐与显存占用处于预期范围。混合精度未对收敛与角度分布产生不良影响。

结论:轻量主干(128 维嵌入)满足线上实时与内存占用要求;残差主干(512 维嵌入)在离线评测中呈现更高的指标上限,二者均达到既定精度门槛。