尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于 RA8P1 的人脸门禁系统

基于 RA8P1 的人脸门禁系统 基于 RA8P1 的人脸门禁系统写在前面我们是全国大学生电子设计竞赛信息科技前沿专题赛的参赛队伍。本文是参赛作品中人脸门禁部分整理出的学习例程一个基于瑞萨 RA8P1 的端侧人脸门禁系统摄像头实时采集 → 板载 NPU 完成人脸检测与特征提取 → 与 SD 卡上的人脸库比对识别结果作为门禁判据。一、人脸门禁系统概览系统整体是检测 → 对齐 → 特征 → 比对 → 门禁决策五段式端侧推理管线全部在板端完成不依赖上位机与网络环节处理说明图像采集OV5640 → CEU DMA480×640 RGB565614,400 字节/帧人脸检测SCRFDEthos-U55 NPU输出人脸框 5 点关键点双眼/鼻尖/嘴角对齐裁剪按框与关键点裁剪112×112 对齐人脸 int8 量化特征提取embedderEthos-U55 NPU512 维特征比对决策与 /FACE/FACE.DB 全部账户比对最大余弦相似度超阈值 → 门禁放行识别为连续运行开机直接进入识别页每帧检测检测到人脸才做特征提取与比对识别结果持续刷新识别成功不跳页、不停机便于门禁场景连续放行。本工程以屏幕反馈与串口日志演示放行语义实际门锁/继电器执行机构可经 GPIO 扩展接入。二、模型训练板端两个模型分工明确检测模型负责人在哪、脸朝哪框 5 点关键点识别模型负责这人是谁512 维特征。两个模型都用 PyTorch / MMDetection 生态训练训练在 PC 的 GPU 上完成部署时转成 int8 量化模型烧进板端 Flash见下文各节。1. 数据集与预处理任务数据集规模预处理识别MS1MV3MS1M-ArcFace 清洗版85,742 身份 / 5,822,653 图5 点关键点对齐 → 相似变换裁剪 112×112检测WIDERFace 补充数据labelv2 标注bbox 5 关键点原始 MS1M 数据噪声较大MS1MV3 按人脸检测置信度与特征距离做了多轮清洗训练前先做人脸检测与 5 点关键点对齐确保送入网络的都是对齐人脸。2. 检测模型SCRFD-500M检测模型采用 InsightFace 开源的SCRFDSample and Computation Redistribution for Face Detection轻量级变体SCRFD-500M500M 指约 500 MFLOPs 的计算量级专为端侧设计组件配置backboneMobileNetV1stage_planes [16, 16, 40, 72, 152, 288]neckPAFPN3 个输出层级headSCRFDHeadGN 归一化、cls/reg 共享卷积、深度可分离卷积anchorratios [1.0]、scales [1, 2]、base_sizes [16, 64, 256]、strides [8, 16, 32]输入640×640设计上的两个特点关键点与框同头回归head 同时输出 score / bbox / keypoints 三组预测5 点关键点随框一起被监督训练好后一次前向就能拿到对齐所需的全部信息计算量重分配SCRFD 系列把骨干网络的计算量向高分辨率特征层倾斜早期 stage 加宽、后期 stage 变浅用更少的总算力拿到更高的精度。训练配置scrfd_500m.pyMMDetection 体系配置项值正负样本分配ATSSAssignertopk9分类损失QualityFocalLossβ2.0权重 1.0框回归损失DIoULoss权重 2.0关键点回归损失SmoothL1Lossβ1/9权重 0.1优化器SGDlr0.01momentum0.9weight_decay5e-4lr_mult8学习率调度warmup 1500 步linearratio 0.001step 于 [440, 544] 下降共 640 epochs数据增强RandomSquareCrop0.3~2.0 随机裁切比例 缩放 640×640 随机翻转 PhotoMetricDistortion亮度 32、对比度/饱和度 0.5~1.5、色调 18归一化(pixel - 127.5) / 128.0关键点监督权重虽只有 0.1但对后续对齐质量影响很大识别模型要求 5 点精准贴合关键点误差会直接放大为对齐裁剪的偏移。3. 识别模型MobileFaceNet ArcFace 损失识别模型是MobileFaceNet骨干 ArcFace 损失输出512 维特征。ArcFace 在 Softmax 交叉熵基础上对特征向量做 L2 归一化并在角度空间叠加余弦间隔margin m0.5特征缩放 s64让模型学到区分度更大的特征分布配置项值损失函数ArcFace余弦间隔 0.5特征缩放 64骨干网络MobileFaceNetmbf轻量、端侧友好特征维度512训练数据MS1MV3faces_emore 打包85,742 身份 / 5,822,653 图112×112优化器SGDlr0.1momentum0.9weight_decay1e-4训练规模batch 128fp16 混合精度40 epochs验证集LFW / CFP-FP / AGED-304. 部署前微调与 INT8 量化NPU 只吃 int8 模型浮点模型需要先转 int8 再上板。这一步做了两个工程化处理1PReLU → LeakyReLU 微调。MobileFaceNet 原版激活是 PReLU带可学习参数、斜率逐通道在部分 NPU 上不受支持或量化效果差。做法把激活层替换为固定斜率的 LeakyReLU从原模型提取的兼容权重mbf_leaky_init.pt继续微调配置项值训练数据MS1MV3 重新打包93,431 身份 / 5,179,509 图RecordIO优化器SGDlr0.01原始 1/10momentum0.9weight_decay1e-4训练规模batch 64fp165 epochs微调不需要长训Partial FCsample_rate0.1每步只回传 10% 类别的分类头梯度FC 计算量降为 1/102静态 INT8 量化PTQ。用 50~300 张校准图做静态量化两个模型分开校准模型校准集量化要点检测含人脸的完整图片部署时相机 640×480 RGB565 画面先 letterbox 补边到 640×640 再推理校准图片同样模拟 RGB565 位深R5G6B5后 letterbox贴近真实输入分布识别对齐后的 112×112 人脸图直接静态量化量化后两个模型精度损失均在可接受范围门禁判定阈值在做完量化后重新标定。板端实际部署选用轻量组合 det_500m 微调版 MobileFaceNet桌面评估以 buffalo_l 的 det_10g w600k_r50高精度参考模型作为精度基线对照。三、检测与识别流程1. 采集与方向校正OV5640 竖装输出居中 3:4 裁剪的 480×640 RGB565经 CEU DMA 直接写入内部 SRAM 的专用帧缓冲。因为摄像头是竖装的采集帧需要做一次逆时针 90° 旋转 水平镜像校正为逻辑 640×480 空间预览、检测、关键点与 112×112 特征裁剪共用同一方向保证框、关键点与人脸贴合。传感器寄存器 0x3820/0x3821 只表示 OV5640 自身的镜像/翻转竖装校正在采集侧完成不依赖它们。2. SCRFD 检测与关键点解码SCRFD 输出 9 个张量按 stride 8/16/32 各含 score、bbox、kps关键点与训练时的 anchor 设计一一对应。量化参数 zero_point 为 122/141/120。解码公式与 bbox 相同pointcenter(raw-zero_point)*scale*stride;/* 关键点偏移 kps_offset index * 10坐标 clamp 到 640×480 */只对 score ≥ 阈值0.3的 anchor 解码。每张脸得到 1 个框 5 个关键点双眼、鼻尖、左右嘴角识别页用绿色框 5 个十字点实时叠加在预览画面上。3. 对齐、特征与比对检测到人脸后按框与关键点裁剪出 112×112 对齐人脸并量化为 int8送入识别模型sub_1000_invoke得到 512 字节特征。比对阶段与 SD 卡人脸库中全部动态账户做 Top-1/Top-2 余弦相似度比较判定条件要求Top-1 相似度≥ 0.62普通账户阈值Top-1 与 Top-2 差距≥ 0.05领先间隔避免近距误判识别页右侧实时显示最大余弦相似度百分比与姓名未达阈值显示未达阈值检测到多张人脸时给出多脸提示。每 100 ms 轮询一次比对结果全流程板端完成。四、人脸库与账户管理人脸库以文件形式保存在 SD 卡/FACE/FACE.DB。SD 挂载后自动创建 /FACE 目录空卡自动原子生成默认空库。字段说明文件头魔数 版本 CRC32 账户数 序号分配器账户记录uint16 account_id ASCII 名称32 字节 512 维 float 特征容量最多 16 个普通账户单份库约 32.6 KiB账户管理走触屏界面设置 → 账户管理提供新增 / 重命名 / 重录 / 删除四项操作新增/重录采集 3 个单人推理帧特征平均并归一化后先保留在 SDRAM 草稿区不直接落盘录入过程与其他账户查重重录只忽略目标账户自身确认后存储线程以事务文件/FACE/FACE.TMP原子替换正式库替换成功才提交运行库重命名/删除同样走暂存 → 原子替换路径降级保护缺卡、目录创建失败或 FACE.DB 损坏时进入只读/非持久化降级——SDRAM 中已提交的库继续用于识别未成功写卡的录入、重命名、重录、删除均不得激活界面给出具体只读原因。新增账户命名界面录入人脸界面账户管理界面五、系统架构与线程工程共 5 条线程职责单一线程职责serial_cmdUART9 命令控制台诊断命令ui_threadLVGL 5ms 主循环识别页 / 设置页face_thread录入采集与确认storage_Thread开机先完成 SD 初始化与 FACE.DB 加载之后处理保存/丢弃命令ai_thread摄像头/CEU 采集 50ms 节拍 静态 NPU worker检测/特征服务生命周期线程间通过 app_bridge 命令/消息桥通信FreeRTOS 静态队列 事件组。注意两点设计约束SD 初始化只归 storage 线程ai 线程不等待 SD摄像头/推理与 SD 解耦storage 线程在命令循环前完成 SD 挂载与人脸库加载成功则进入 READY失败则只读降级——避免人脸库永远加载中NPU 推理为静态单 worker只有 ai 线程的专用 worker 调用 Ethos-U/TFLM其余线程经队列请求杜绝 NPU 并发访问AI 服务异常时按阶段降级预览保持、推理重试。内存与缓存约定板级验证这是 RA8P1 端侧视觉工程最容易踩坑的部分数据位置约束CEU 原始帧 s_ai_frame内部 SRAM 的 .ram_noinit_nocache 段32 字节对齐CEU DMA 直接写入放 SDRAM 会出现条纹、分块或错位CPU 读取前先 invalidate 该段 cache预览双缓冲内部 SRAMCPU 写后必须 D-Cache cleanDAVE2D 直接读取推理快照SDRAM 的 .sdram_noinit 段仅 CPU 为静态 NPU worker 保存一帧worker 完成前不可覆盖TFLM tensor arenaSDRAM 的 .sdram_noinit 段仅供 NPU 大容量工作区使用人脸正式库/候选/录入草稿SDRAM 的 .sdram_noinit 段事务成功写卡后才从候选切换为运行库人脸 FAT staging 缓冲SDRAM 的 .sdram_noinit_nocache 段32 字节对齐SDHI DMAC 直接访问避免 CPU 读到陈旧缓存行造成重启后 CRC 误判模型权重OSPI Flash memory-mapped 槽位推理前 CRC 校验保持原访问方式六、调试与验证板端提供 UART9 命令控制台2 Mbps建议按下列顺序逐级验证每步通过再进下一步出问题能精确定位到采集、传输、推理哪个环节步骤命令验证内容1ai_preview_start实时预览绕过 NPU 单独验证采集→LVGL 通路2ai_test_pattern onOV5640/CEU 图像通路彩条测试图3ai_preview_reference on仅验证内部 RGB565 → LVGL/LCD 路径4ai_status查询状态帧率、人脸数、NPU 诊断、匹配结果5ai_start最后才验证 NPU 推理推理侧的排查要点模型部署到 OSPI 槽位后先做长度与 CRC32 校验match1 才算部署成功校验失败会拒绝推理——先确认模型在位再怀疑算法NPU 工作区 arena 与输入/输出缓冲的 cache 一致性按第五节内存约定逐条核对量化后的模型在板端重新标定判定阈值用已注册人员与陌生人各测一组相似度分布取两类分布的中间值。PC 端评估脚本可以在上板前先验证模型与阈值人脸匹配、相似度分布、模型基准训练与评估闭环在第七节给出。七、工程代码结构板端固件路径职责src/ai_thread_entry.cAI 服务生命周期、CEU 预览 50ms 节拍、推理降级src/face_thread_entry.c录入采集与确认src/storage_Thread_entry.cSD 初始化、FACE.DB 加载/原子保存src/serial_cmd_entry.cUART9 打开与命令轮询src/ui_thread_entry.cLVGL 主循环src/device/camera/OV5640 驱动与寄存器表、CEU 封装、GPIO 位模拟 SCCBsrc/device/display/显示抽象层display_device / display_drawsrc/device/storage/SD 卡驱动、OSPI Flash 驱动、XMODEM 传输src/drivers/display/lcd_bus_spi / lcd_st7796 / lcd_touch_ft6336src/application/face_recognition/ai_inference.cSCRFD/embedder 推理调度、输出张量读取与 cache 处理src/application/face_recognition/face_detection_postprocess.c检测解码框 5 关键点src/application/face_recognition/face_embed_preprocess.c112×112 对齐裁剪与 int8 量化src/application/face_recognition/face_match.c余弦相似度 Top-1/Top-2 判定src/application/face_recognition/face_database.c人脸库事务、查重、只读降级src/application/face_recognition/ai_model_slot.c / ai_model_upload.cOSPI 模型槽校验与上传src/application/face_recognition/models/model_0、model_1NPU 命令流不含权重数据src/application/core/ai_preview预览 框 关键点绘制、ai_service、app_bridge / app_msg / app_state / app_eventssrc/application/ui/ui_manager识别页 / 设置页、ui_page_face、ui_page_settings、ui_components、ui_style、精简中文字库src/middleware/console/serial_cmd / cmd_configUART9 命令注册src/middleware/lvgl_port/LVGL 显示与触摸适配层src/system/isr.c中断回调、printf 串口重定向写在最后本文介绍了基于 RA8P1 的端侧人脸门禁系统公开数据集 InsightFace 工具链训练出 SCRFD-500M 检测模型与 MobileFaceNet 识别模型PReLU→LeakyReLU 微调 静态 INT8 量化后部署到板载 NPUOV5640 CEU 采集SD 卡 FACE.DB 原子事务管理连续识别 UI。RA8P1 单芯片完成采集 → 推理 → 决策全链路无需上位机与网络适合门禁、考勤、通行等端侧视觉场景。感谢阅读欢迎指正。
返回列表