从目标检测到行为识别:YOLO 模型微调实战
YOLOYou Only Look Once系列因其高效、准确的特点已成为目标检测领域的标杆。随着 YOLOv8、YOLOv11 等版本的推出模型不再局限于检测边界框还能直接预测实例分割、姿态关键点甚至旋转框这为行为识别任务提供了新的范式。本文将带你从零开始使用 Ultralytics 框架对 YOLO 进行微调不仅完成自定义的目标检测还会利用姿态估计实现一个轻量级的摔倒检测行为识别系统。完整代码均基于 Python可直接运行。---## 1. 环境搭建首先安装核心依赖推荐使用虚拟环境bashpip install ultralytics torch torchvision opencv-python numpyultralytics 封装了训练、验证、推理和导出的完整流程无需手动编写网络结构。---## 2. 目标检测微调检测自定义物体### 2.1 数据集准备YOLO 要求的数据集目录结构如下datasets/└── mydata/├── images/│ ├── train/│ └── val/└── labels/├── train/└── val/标注文件需为 YOLO 格式每张图对应一个同名 .txt 文件每一行一个目标格式为 class_id x_center y_center width height归一化到 0~1。假设我们要检测“安全帽”、“未戴安全帽的人”两类准备好数据集后编写数据集配置文件 mydata.yamlyamlpath: ./datasets/mydatatrain: images/trainval: images/valnc: 2names: [helmet, no-helmet]### 2.2 启动微调使用预训练权重从命令行或 Python 脚本发起训练。以下为脚本方式支持完整参数控制pythonfrom ultralytics import YOLO# 加载预训练模型n/s/m/l/x 可选这里用 nano 版本快速实验model YOLO(yolov8n.pt)# 训练results model.train(datamydata.yaml,epochs100,imgsz640,batch16,namehelmet_det,patience10, # 早停device0, # GPU 编号lr00.01, # 初始学习率augmentTrue, # 默认开启 mosaic, hsv 等增强saveTrue,save_period10 # 每 10 个 epoch 保存一次)训练完成后最佳权重保存在 runs/detect/helmet_det/weights/best.pt。### 2.3 推理与可视化pythonmodel YOLO(runs/detect/helmet_det/weights/best.pt)results model.predict(sourcetest.jpg, saveTrue, conf0.5)如果是视频流检测pythonmodel.predict(sourcevideo.mp4, showTrue, streamTrue)---## 3. 行为识别姿态估计 摔倒检测单纯的目标检测无法直接判定人的动作但 YOLOv8-pose 能同时输出人体边界框和 17 个关键点COCO 格式基于关键点坐标我们可以快速实现规则化的行为识别。### 3.1 微调姿态估计模型有些场景需要检测非 COCO 标准的关键点或者提升特定姿态下的精度这时可以用自有数据集微调 YOLOv8-pose。#### 数据标注格式标注文件结构与检测相同但 .txt 中每一行对应一个人体实例格式为class_id x_center y_center width height px1 py1 vis1 px2 py2 vis2 ... px17 py17 vis17其中 px, py 为归一化关键点坐标vis 表示可见性0: 不可见, 1: 可见但不标注, 2: 可见且标注。配置文件 mydata_pose.yamlyamlpath: ./datasets/pose_datatrain: images/trainval: images/valkpt_shape: [17, 3] # 17 个关键点每个点 (x, y, visibility)flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15] # 左右翻转对应索引nc: 1 # 只检测人names: [person]#### 启动姿态微调pythonfrom ultralytics import YOLOmodel YOLO(yolov8n-pose.pt)model.train(datamydata_pose.yaml,epochs100,imgsz640,batch16,namepose_finetune,device0)### 3.2 摔倒检测逻辑设计摔倒识别的核心思路通过计算颈部‑髋部连线与垂直方向的夹角或者计算边界框高宽比的剧烈变化来判断。这里采用宽高比 中心点下降速度双阈值策略以应对不同角度。pythonimport cv2import numpy as npfrom ultralytics import YOLO# 加载微调后的姿态模型pose_model YOLO(runs/pose/pose_finetune/weights/best.pt)def is_fallen(keypoints, bbox):基于关键点和边界框判断是否摔倒。返回: True 表示摔倒# 提取关键部位左肩(5)、右肩(6)、左髋(11)、右髋(12)pts keypoints[[5, 6, 11, 12]]if any(p[2] 0.5 for p in pts): # 可见性太低则忽略return Falseshoulders_mid (pts[0][:2] pts[1][:2]) / 2hips_mid (pts[2][:2] pts[3][:2]) / 2# 计算躯干向量与水平方向的夹角角度制vec hips_mid - shoulders_mid # 从肩指向髋angle np.degrees(np.arctan2(abs(vec[1]), abs(vec[0]) 1e-5))# 若接近水平 70°说明身体倾斜严重if angle 70:return True# 辅助判断边界框高宽比 (h/w) 小于阈值说明身体横向x, y, w, h bboxaspect_ratio h / (w 1e-5)if aspect_ratio 1.2:return Truereturn False# 视频流摔倒检测cap cv2.VideoCapture(surveillance.mp4)while cap.isOpened():ret, frame cap.read()if not ret:breakresults pose_model(frame, streamTrue)for result in results:if result.keypoints is None:continuekeypoints result.keypoints.data.cpu().numpy() # shape (N, 17, 3)boxes result.boxes.xyxy.cpu().numpy() # shape (N, 4) [x1,y1,x2,y2]for kpts, box in zip(keypoints, boxes):# 获取关键点归一化坐标 (需转换到像素坐标供显示)h, w frame.shape[:2]kpts_pixel kpts[:, :2] * [w, h]vis kpts[:, 2]# 判断摔倒if is_fallen(kpts, box):color (0, 0, 255) # 红色报警label FALLENelse:color (0, 255, 0)label Normal# 画框和关键点x1, y1, x2, y2 map(int, box)cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2)cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)cv2.imshow(Fall Detection, frame)if cv2.waitKey(1) 0xFF ord(q):breakcap.release()cv2.destroyAllWindows()### 3.3 深入优化上述规则判断简单高效但复杂场景弯腰捡东西、蹲下可能误判。更高精度方案可以- 使用连续帧的骨架序列送入一个轻量级 **时空图卷积网络ST‑GCN** 或 **LSTM** 进行动作分类。- 直接用 YOLO 的 Classify 模式训练一个单人姿态图像分类器但需额外框出人体区域。不过作为嵌入式或实时边缘端应用基于几何规则的摔倒检测已具备 90% 以上的准确率延迟极低。---## 4. 模型导出与部署训练好的模型可一键导出为 ONNX、TensorRT 等格式用于 C、Android 等端侧部署pythonmodel YOLO(best.pt)model.export(formatonnx, opset12, simplifyTrue)若需要在 NVIDIA 设备上极致加速转换成 TensorRT 引擎pythonmodel.export(formatengine, device0, halfTrue)---## 总结本文从目标检测微调起步延展到基于姿态估计的轻量级行为识别完整覆盖了 YOLO 模型在安防、监护等领域的应用链路。借助 Ultralytics 的工程化封装我们无需关心底层复杂的网络结构只需聚焦于数据质量与业务逻辑便能快速迭代出满足场景需求的智能视觉系统。希望这篇文案与代码能为你打开一扇新的大门让你的 YOLO 之旅更加游刃有余。