Yolov5+Python三合一视觉系统:人脸识别、表情分析与异常行为检测实战

发布时间:2026/9/28 7:18:45
Yolov5+Python三合一视觉系统:人脸识别、表情分析与异常行为检测实战 简介这是一套基于Yolov5与Python实现的人脸识别、人脸细粒度表情识别及异常行为检测的完整源码项目面向计算机视觉方向的初学者、毕业设计学生以及需要完成期末大作业或课程设计的开发者。项目代码配有详细注释新手也能看懂部署后即可运行可直接作为毕设或课程设计使用系统功能完善、界面美观、操作简单具有较高的实际应用价值。资源包共107个文件包含37个py源码、21个txt说明、18个yaml配置、10张jpg与4张png示例图、3个md文档以及ui界面文件、pt权重、mat数据和Dockerfile等压缩包约24.81MB目录结构清晰便于按模块查阅与二次开发。目前已有269人学习下载。通过该资源读者可获得人脸检测、表情细粒度分类与异常行为识别的完整实现方案理解Yolov5在真实场景中的落地方式并借助注释与配置文件快速完成环境搭建、模型调试与功能扩展为项目答辩或后续研究提供扎实的代码基础。1. 从一台门禁机说起Yolov5Python 三合一视觉系统到底在做什么很多人第一次接触「人脸识别门禁机」这类项目脑子里想的是刷脸开门这么简单。真上手才发现一台能用的设备要同时回答三个问题这张脸是不是同一个人、这个人现在什么情绪、这个人有没有做出翻越、摔倒、聚集这类异常动作。标题里的 Yolov5Python 三合一方案本质就是把这三件事塞进同一条推理流水线Yolov5 负责把人脸和人体从画面里框出来Python 侧再挂人脸识别、细粒度表情分类、异常行为判定三个下游模块。它适合谁适合手头有 Python 基础、想用一套源码把检测识别行为分析串起来的中级开发者也适合做门禁、考勤、校园安全这类场景的产品同学拿来评估可行性。热词里「yolov5训练自己的数据集」「yolov5环境配置」「人脸识别算法」这几个词恰好对应了落地时最花时间的三块。下面我按自己搭过的一套流程把选型、代码、参数和踩过的坑讲清楚。2. 三合一流水线的架构选型为什么不是三个模型各跑各的2.1 检测、识别、行为分析为什么要分层而不是端到端先说结论不要指望一个模型同时输出人脸框、身份 ID、表情标签和异常类别。我试过把四类标签塞进 Yolov5 的检测头结果是小目标人脸召回率掉得厉害表情这种细粒度分类更是被检测损失带偏。合理的分层是第一层Yolov5 做人体人脸检测输出 bbox 和置信度。人脸框交给识别和表情人体框交给行为分析。第二层人脸识别用 ArcFace 或 FaceNet 提特征和底库做余弦相似度比对。第三层表情识别用一个小分类网络ResNet18 或 MobileNetV3 就够输入是裁剪对齐后的人脸。第四层异常行为检测不靠单帧靠人体框的时序轨迹——速度突变、停留超时、框高宽比异常摔倒时宽高比会翻转。这样分层的好处是每层可以独立换模型、独立调阈值出问题能定位到具体哪一层。坏处是延迟叠加所以工程上要做帧采样和异步。2.2 环境配置conda 建环境 Yolov5 依赖的版本坑热词里「conda yolov5」「yolov5环境配置」「vscode python环境配置」出现频率很高说明这一步劝退了不少人。我一般用 conda 隔离避免和系统 Python 打架# 创建独立环境python 版本建议 3.8~3.9太新 torch 轮子可能不匹配 conda create -n face_yolo python3.9 -y conda activate face_yolo # 安装 pytorch具体 cuda 版本按自己显卡驱动选这里以 cu118 为例 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 安装 yolov5 依赖注意 requirements 里 opencv 版本别乱升 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt逻辑说明先建环境再装 torch是因为 Yolov5 的 requirements 里对 torch 只给下限不锁版本直接pip install -r可能拉到和 CUDA 不匹配的版本。参数上python3.9是兼容性最稳的区间3.11 以上有些老依赖会编译失败。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算环境通了。提示如果torch.cuda.is_available()返回 False先别怀疑代码九成是驱动版本和 CUDA 版本对不上用nvidia-smi看驱动支持的 CUDA 上限。2.3 人脸检测与人体检测的模型分工Yolov5 官方权重是在 COCO 上训的person 类现成可用face 类没有。所以人脸检测要么用现成的人脸检测器如 RetinaFace、YOLOv5-face要么自己标数据训一个 face 类。我的做法是人体检测直接用 yolov5s.pt人脸检测单独训一个轻量 YOLOv5n-face输入尺寸 640因为人脸在门禁场景里通常占画面比例不大n 版本够快。import torch # 人体检测用官方权重人脸检测用自训权重 person_model torch.hub.load(ultralytics/yolov5, yolov5s, pretrainedTrue) face_model torch.hub.load(ultralytics/yolov5, custom, pathweights/face_yolov5n.pt) def detect(frame): # 人体检测只保留 person 类 person_res person_model(frame, size640) persons person_res.xyxy[0][person_res.xyxy[0][:, -1] 0] # 人脸检测 face_res face_model(frame, size640) faces face_res.xyxy[0] return persons, faces逻辑说明xyxy[0]拿到的是[x1,y1,x2,y2,conf,cls]格式[:, -1] 0过滤出 person 类COCO 里 person 的 id 是 0。参数size640是推理分辨率门禁场景人脸小可以提到 1280但帧率会掉一半要权衡。人脸模型单独训的原因在 2.4 讲。2.4 自训人脸检测数据集的最小流程热词「yolov5训练自己的数据集」是绕不开的。人脸检测数据集我一般用 WIDER FACE 打底再补自己场景的几百张。标注格式转成 YOLO 的 txt每行cls cx cy w h归一化到 0~1。# data/face.yaml 内容示例 # train: ../datasets/face/images/train # val: ../datasets/face/images/val # nc: 1 # names: [face] python train.py --data data/face.yaml --weights yolov5n.pt --img 640 --batch 16 --epochs 100 --name face_yolov5n逻辑说明--weights yolov5n.pt用官方权重做迁移学习比从头训收敛快得多。--img 640要和推理时一致否则小脸漏检。--batch 16是显存 8G 左右的稳妥值显存大可以加到 32。训完看runs/train/face_yolov5n/下的results.png重点看 mAP0.5 和 recall人脸场景 recall 比 precision 更重要漏检比误检代价大。3. 人脸识别与细粒度表情识别的落地实现3.1 人脸对齐识别准确率的第一道分水岭检测框出来的人脸是歪的直接送识别网络准确率能掉十几个点。标准做法是用 5 个关键点双眼、鼻尖、双嘴角做仿射变换对齐到 112x112。关键点可以用人脸检测模型自带也可以挂个轻量关键点模型。import cv2 import numpy as np # 标准 112x112 人脸模板的 5 个关键点坐标 REFERENCE np.array([ [38.2946, 51.6963], [73.5318, 51.5014], [56.0252, 71.7366], [41.5493, 92.3655], [70.7299, 92.2041] ], dtypenp.float32) def align_face(img, landmarks): # landmarks: 5x2 的检测关键点 src np.array(landmarks, dtypenp.float32) # 用相似变换求仿射矩阵只允许旋转缩放平移不形变 M, _ cv2.estimateAffinePartial2D(src, REFERENCE) aligned cv2.warpAffine(img, M, (112, 112), borderValue0.0) return aligned逻辑说明estimateAffinePartial2D求的是相似变换比全仿射更稳不会把人脸拉变形。参数(112,112)是 ArcFace 系列的标准输入。对齐后的人脸再送识别和表情两个模块共用省一次计算。3.2 人脸识别ArcFace 特征 余弦相似度比对识别模块我一般用 InsightFace 的 ArcFace 权重512 维特征比对用余弦相似度阈值 0.4~0.5 之间调。import numpy as np def cosine_sim(a, b): a a / np.linalg.norm(a) b b / np.linalg.norm(b) return float(np.dot(a, b)) def recognize(face_feat, gallery, threshold0.45): # gallery: {name: feature} 底库 best_name, best_score unknown, 0.0 for name, feat in gallery.items(): score cosine_sim(face_feat, feat) if score best_score: best_name, best_score name, score if best_score threshold: return unknown, best_score return best_name, best_score逻辑说明特征先做 L2 归一化再点积等价于余弦相似度。阈值 0.45 是门禁场景的经验值安防场景可以提到 0.5 减少误识考勤场景可以降到 0.4 减少拒识。底库特征要离线算好存成 npy别每次现场跑。3.3 细粒度表情识别7 类不够用怎么办「细粒度」是标题里的关键词。常规表情分类是 7 类中性、高兴、悲伤、惊讶、恐惧、厌恶、愤怒但门禁场景真正有用的是「是否配合」「是否异常激动」这种粗粒度判断。我的做法是底层还是 7 类分类网络上层再做映射——高兴中性归为「正常」愤怒厌恶恐惧归为「异常激动」惊讶单独标记。# 表情分类网络推理输入对齐后的 112x112 人脸 def predict_emotion(model, aligned_face): # 预处理BGR-RGB归一化加 batch 维度 x cv2.cvtColor(aligned_face, cv2.COLOR_BGR2RGB) / 255.0 x np.transpose(x, (2, 0, 1))[None, ...].astype(np.float32) logits model(torch.from_numpy(x)) prob torch.softmax(logits, dim1)[0] idx int(torch.argmax(prob)) return EMOTIONS[idx], float(prob[idx])逻辑说明表情网络用 MobileNetV3-small 就够参数量小、推理快细粒度分类不需要大模型。EMOTIONS是 7 类标签列表。注意输入必须是对齐后的人脸歪脸会让表情分类准确率崩掉。如果自己场景数据少可以用 FER2013 预训练再微调。3.4 异常行为检测时序轨迹比单帧分类靠谱异常行为翻越、摔倒、聚集、徘徊单帧很难判断必须看时序。我的做法是维护每个人体框的轨迹队列算三个指标速度、停留时长、宽高比变化。from collections import deque class Track: def __init__(self, tid): self.tid tid self.boxes deque(maxlen30) # 最近 30 帧的框 self.start_frame 0 def update(self, box, frame_id): self.boxes.append((frame_id, box)) def is_fall(self): # 摔倒宽高比从竖长变横长且持续若干帧 if len(self.boxes) 10: return False recent [b for _, b in list(self.boxes)[-10:]] ratios [(x2-x1)/(y2-y11e-6) for x1,y1,x2,y2 in recent] return sum(r 1.2 for r in ratios) 7 def is_loiter(self, cur_frame, threshold150): # 徘徊停留超过 threshold 帧且位移小 return cur_frame - self.start_frame threshold逻辑说明deque(maxlen30)只保留最近 30 帧省内存。摔倒判定用宽高比连续多帧翻转避免单帧误判。徘徊用停留帧数阈值 150 帧约等于 5 秒30fps。这些阈值都要按自己场景的帧率和摄像头角度调没有万能值。注意异常行为检测的误报率天然偏高工程上一定要加「连续 N 帧确认」和「人工复核」两道闸别直接触发报警。4. 避坑与排查这套三合一方案最容易翻车的五个地方4.1 检测框抖动导致识别频繁切换身份现象同一个人站在摄像头前识别结果在两个人之间反复跳。原因Yolov5 逐帧检测框的位置有像素级抖动裁剪出的人脸每次略有不同特征相似度在阈值附近震荡。解决给每个 track 维护一个特征队列取最近 5 帧特征的平均值再比对同时加「身份切换需连续 3 帧一致」的确认逻辑。4.2 表情识别在侧脸和遮挡下全线崩盘现象正脸表情识别挺准一转头或戴口罩就乱标。原因表情分类网络训练数据以正脸为主侧脸和遮挡样本极少。解决在检测阶段就过滤掉偏转角度过大的人脸用关键点算头部姿态侧脸直接跳过表情识别返回「未知」而不是硬猜。戴口罩场景要么单独训一个口罩数据集要么放弃表情只做识别。4.3 多模型串行推理帧率掉到个位数现象单跑 Yolov5 能到 30fps加上识别和表情后掉到 5fps。原因四个模型串行跑每个都占 GPU且人脸裁剪、对齐是 CPU 操作和 GPU 推理没重叠。解决一是人脸识别和表情识别不必每帧都跑检测每帧跑识别每 5 帧跑一次二是用多线程把 CPU 预处理和 GPU 推理流水线化三是模型量化Yolov5n MobileNetV3 用 FP16 推理。4.4 底库特征和现场特征分布不一致现象离线测试相似度 0.8现场只有 0.3。原因底库照片是证件照正脸、光照均匀现场是监控画面侧脸、逆光、模糊域差异大。解决底库照片要模拟现场条件拍或者用现场采集的帧做底库。实在不行把阈值调低并接受一定误识同时加活体检测防照片攻击。4.5 异常行为阈值在不同摄像头下全部失效现象一个摄像头调好的摔倒阈值换到另一个摄像头就疯狂误报。原因摄像头安装高度、俯仰角、分辨率不同人体框的宽高比基准完全不同。解决阈值不能写死要做自适应——用前 100 帧的宽高比均值作为基准判定时看相对变化而不是绝对值。换摄像头必须重新标定基准。5. 把三合一系统压进边缘设备的几个实操技巧前面讲的都是服务器或带独显的机器上的做法。真要做成门禁机、边缘盒子算力往往只有一块 Jetson 或者树莓派 5 加加速棒。热词里「树莓派5上部署自己训练的yolov5模型」就是这个场景。我的经验是模型选型比优化技巧更重要Yolov5n 是底线再大就跑不动人脸识别用 MobileFaceNet 而不是 ResNet100表情网络砍到 0.5M 参数以内。导出 ONNX 再转 TensorRT 是提速最明显的一步# 导出 yolov5 为 onnxopset 11 兼容性最好 python export.py --weights weights/face_yolov5n.pt --include onnx --opset 11 --img 640 # 用 trtexec 转 TensorRTFP16 精度 trtexec --onnxface_yolov5n.onnx --saveEngineface_yolov5n_fp16.engine --fp16逻辑说明--opset 11是 TensorRT 支持最稳的算子集版本太高会转失败。--fp16在 Jetson 上能提速约 1.8 倍精度损失对人脸检测可忽略。转完 engine 后推理代码要换成 TensorRT runtime输入输出绑定要对齐这块最容易出错的是 NMS 后处理建议把 Yolov5 的 NMS 也一起导出进 ONNX别在 Python 侧手写。验证方法拿一段现场视频分别用 PyTorch 和 TensorRT 跑逐帧对比检测框的 IoUIoU 均值大于 0.95 才算转换无损。我一般会写个小脚本自动比对比肉眼看靠谱。最后说个习惯这套系统我从来不在本地调好就直接上线一定先在目标设备上跑满 24 小时看内存有没有缓慢增长、GPU 温度会不会撞墙、长时间运行后帧率是否衰减。边缘设备上的内存泄漏和热降频是实验室里永远测不出来的。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询