3. 人脸检测算法选型
人脸检测是整个识别流程的第一道关卡。说白了,这一步要是没做好,后面识别再准也白搭。我在嵌入式设备上折腾了几年,踩过不少坑,今天就跟大家聊聊三个主流算法——RetinaFace、MTCNN 和 YOLOv5-Face,看看它们各自适合什么场景。
3.1 为什么选型这么重要?
嵌入式设备资源有限。CPU 算力弱,内存小,还得跑实时。你想想看,一个 200ms 的检测延迟,用户就嫌卡了。所以选算法不能只看精度,还得看模型大小、推理速度、内存占用。
我个人习惯把选型分成三步:
- 看场景:是门禁、考勤,还是手机解锁?
- 看芯片:ARM Cortex-A 系列,还是带 NPU 的芯片?
- 看精度要求:误检率能接受多少?
我的经验: 别一上来就追求最高精度。先跑个轻量模型,看看能不能满足实时性,再逐步优化。我曾经在一个项目里直接上了 RetinaFace,结果在 RK3399 上只有 5fps,最后不得不换方案。
3.2 三大算法核心原理对比
先看一张总览图,帮你快速建立认知。
3.3 MTCNN:轻量级的老将
MTCNN 是 2016 年的算法,但至今仍在很多嵌入式设备上服役。它采用三级级联结构:
- P-Net:快速生成候选框
- R-Net:过滤掉大部分误检
- O-Net:输出最终 bbox 和关键点
为什么它适合嵌入式?因为前两级网络非常小,大部分非人脸区域在 P-Net 阶段就被排除了。我曾在树莓派 3B 上跑过,320x240 输入,能到 15fps 左右。
核心优势: 模型小(<1MB),推理快,CPU 友好。
主要缺点: 对小脸和遮挡场景不太行,精度上限低。
主要缺点: 对小脸和遮挡场景不太行,精度上限低。
避坑指南: 我曾经在密集人群场景用 MTCNN,结果漏检率飙到 30%。后来发现是 NMS 阈值设得太高。建议根据场景调低阈值,或者增加输入分辨率。
3.4 RetinaFace:高精度之选
RetinaFace 是 2020 年提出的,基于单阶段检测框架。它引入了特征金字塔和上下文模块,能同时输出人脸框、5 个关键点和置信度。
它的核心创新点:
- 特征金字塔:多尺度特征融合,小脸检测更强
- 上下文模块:利用周围信息辅助检测
- 多任务学习:bbox + 关键点 + 像素级分割
但代价也很明显——模型大。MobileNet 版本的 RetinaFace 也有 3-5MB,原版 ResNet 版本更是超过 100MB。在嵌入式设备上,如果没有 NPU 加速,基本跑不动实时。
| 指标 | MTCNN | RetinaFace (MobileNet) | YOLOv5-Face (nano) |
|---|---|---|---|
| 模型大小 | ~0.8 MB | ~4.5 MB | ~3.0 MB |
| WiderFace 精度 (Easy) | 85% | 94% | 92% |
| ARM CPU 推理 (320x240) | ~15 fps | ~3 fps | ~8 fps |
| 关键点输出 | 5 点 | 5 点 | 无(需额外模型) |
| 推荐硬件 | ARM CPU | GPU / NPU | NPU / 高性能 CPU |
3.5 YOLOv5-Face:速度与精度的平衡点
YOLOv5-Face 是在 YOLOv5 基础上针对人脸检测优化的版本。它保留了 YOLOv5 的 CSPDarknet 骨干和 PANet 特征融合,但调整了 Anchor 尺寸和损失函数。
我为什么推荐它?因为它在嵌入式设备上表现很均衡。nano 版本只有 3MB 左右,在带 NPU 的芯片上(比如瑞芯微 RK3588)能跑到 30fps 以上。
它的几个关键改进:
- Anchor 优化:针对人脸宽高比重新聚类
- Mosaic 增强:训练时用小图拼接,提升小脸检测
- GIoU 损失:框回归更精准
我的建议: 如果你的设备有 NPU,优先考虑 YOLOv5-Face。它比 MTCNN 精度高,比 RetinaFace 速度快。我在一个门禁项目里用 YOLOv5-Face nano 在 RV1126 上跑到了 25fps,效果很满意。
3.6 如何做最终选型?
给你一个决策流程,照着走就行:
- 先看硬件:有没有 NPU?没有的话,MTCNN 或 YOLOv5-Face 轻量版
- 再看精度需求:需要关键点吗?需要的话,RetinaFace 或 MTCNN
- 最后看实时性:目标帧率是多少?低于 10fps 用户会明显感觉卡顿
一句话总结:
CPU 实时 → MTCNN
NPU 加速 → YOLOv5-Face
高精度离线 → RetinaFace
CPU 实时 → MTCNN
NPU 加速 → YOLOv5-Face
高精度离线 → RetinaFace