☰
YOLOv5打架行为检测实战:权重、数据集与PyQt界面部署指南
2026/10/10 14:23:55 网站建设 项目流程

简介:本资源面向计算机视觉学习者与安防场景开发者,提供一套可直接落地的打架行为检测方案,涵盖YOLOv5训练权重、标注数据集与PyQt可视化界面,解决从模型训练到推理展示的完整链路问题。压缩包共2000个文件,以1994个XML标注文件为主,另含3个Python脚本与3份环境配置及使用说明PDF,整体约508MB,目录已按train、val、test划分并附data.yaml,标签为txt格式,兼容YOLOv5、v7、v8、v9等算法直接训练。数据集包含normal与fight两类,规模超过一万张,权重可直接推理检测。已有160人学习下载。读者可获得开箱即用的训练数据与权重、PyQt界面调用示例及环境配置教程,便于快速复现打架行为识别效果,并在此基础上迁移到自有场景做二次训练与部署。

1. 从一份打架行为检测包说起:YOLOv5 权重、数据集与 PyQt 界面到底能不能直接跑

上周有个做安防集成的朋友发来一个压缩包,标题写着「YOLOv5算法打架行为检测模型+数据集+pyqt界面」,问我能不能直接拿去给客户演示。我解压看了一眼,里面躺着训练好的权重、一万多张打架行为检测数据集、已经划分好的 train/val/test 目录、data.yaml,还有一份 PyQt5 的界面代码和几份环境配置 PDF。这不是一个空壳 demo,而是一套从数据到推理到界面都齐活的落地资源。

它解决的核心问题很具体:你不需要从零标注一万张图,也不需要自己搭一套检测界面,拿到就能推理、能训练、能演示。适合三类人——想快速验证打架行为检测可行性的算法工程师、需要给客户做原型演示的安防从业者、以及正在拿 YOLOv5 练手目标检测的学生。但「能跑」和「跑得好」之间隔着不少参数和坑,下面按我实际拆包的顺序讲。

2. 拆开资源包:权重、数据集与 PyQt 界面各自承担什么

2.1 训练好的权重能直接推理,但别指望它万能

资源包里最值钱的是训练好的权重文件。YOLOv5 的权重本质是一组卷积层参数,加载后配合推理脚本就能对输入图像输出边界框和类别。这份权重是在打架行为数据集上训过的,类别只有两个:normal 和 fight。也就是说,它不会告诉你「谁在打谁」,只会框出画面里疑似打架的区域。

我一般拿到权重先做一件事:用几张明显正常的图跑一遍,看会不会误报。打架检测这类二分类场景,normal 样本远多于 fight,模型容易偏向把模糊动作判成 normal。如果误报率低但漏报高,说明训练时 fight 样本权重不够,后面微调要补。

推理脚本通常是 detect.py 或类似的入口,核心参数就几个:

python detect.py --weights best.pt --source test_images/ --conf-thres 0.4 --iou-thres 0.45 --device 0

--weights指向权重文件;--source可以是单张图、文件夹或视频;--conf-thres是置信度阈值,打架检测建议先设 0.4,太低会框出一堆背景,太高会漏掉快速挥拳的帧;--iou-thres控制重叠框合并,0.45 是 YOLOv5 默认值,画面里多人纠缠时可以降到 0.4 减少框重叠;--device 0指定第一块 GPU,没有 GPU 就写 cpu,但速度会慢一个量级。

跑完会在 runs/detect/ 下生成带框的结果图。重点看两类错误:把拥抱判成 fight 的误报,和把推搡判成 normal 的漏报。这两类错误直接决定你后面要不要重新标注或调阈值。

2.2 一万多张数据集已经划好 train/val/test,但标签格式要确认

数据集是这份资源的另一个核心。一万多张图,txt 格式标签,目录已经按 train/valid/test 分好,data.yaml 也配好了:

train: ../train/images val: ../valid/images test: ../test/images nc: 2 names: - normal - fight

这里有个容易翻车的点:data.yaml 里的路径是相对路径,../train/images意味着它假设你从某个子目录运行训练脚本。如果你直接把 data.yaml 放到项目根目录跑,路径就对不上,报错「No labels found」。常见做法是把 data.yaml 里的路径改成绝对路径,或者确认你的工作目录和 yaml 里的相对关系一致。

txt 标签格式是 YOLO 标准:每行class_id x_center y_center width height,坐标都归一化到 0~1。我一般会抽几张图用脚本验证标签和图像是否对齐:

import cv2 import os img_path = "train/images/img_01000_1663.jpg" label_path = "train/labels/img_01000_1663.txt" img = cv2.imread(img_path) h, w = img.shape[:2] with open(label_path) as f: for line in f: cls, x, y, bw, bh = map(float, line.split()) # 反归一化到像素坐标 x1 = int((x - bw / 2) * w) y1 = int((y - bh / 2) * h) x2 = int((x + bw / 2) * w) y2 = int((y + bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite("check.jpg", img)

这段代码把归一化坐标还原成像素框画在图上,跑几张就能看出标签有没有错位。如果框全偏到左上角,多半是归一化时除了错误的宽高。这个检查花不了两分钟,但能省掉训练几小时后发现标签全错的后悔药。

2.3 PyQt5 界面是演示层,不是训练层

资源里的 PyQt5 界面负责把推理结果可视化:选图片、选视频、点按钮出检测框。share.py 和 test.py 大概率是界面逻辑和推理调用的入口。pyqt5使用说明.pdf 讲的是环境依赖和启动方式。

界面代码本身不复杂,核心是 QThread 把推理放在子线程,避免主界面卡死。我见过不少人直接把推理写在按钮槽函数里,结果点一下界面白屏十几秒,客户以为程序崩了。正确做法是继承 QThread,在 run 里调推理,通过信号把结果传回主线程更新 QLabel。

from PyQt5.QtCore import QThread, pyqtSignal import cv2 import torch class DetectThread(QThread): result_ready = pyqtSignal(str) def __init__(self, weights, source): super().__init__() self.weights = weights self.source = source def run(self): model = torch.hub.load('ultralytics/yolov5', 'custom', path=self.weights) img = cv2.imread(self.source) results = model(img) out_path = "runs/detect/exp/result.jpg" results.save(out_path) self.result_ready.emit(out_path) # 通知主线程更新界面

pyqtSignal定义信号,run里做耗时推理,完成后emit路径给主线程。这样界面不会卡,演示时体验好很多。注意 torch.hub.load 第一次会联网拉 YOLOv5 仓库代码,如果现场没网,提前把 yolov5 源码下到本地,用path参数指向本地目录。

3. 用这份资源训练自己的数据:从 data.yaml 到超参数

3.1 环境配置:PDF 教程之外我补三个关键点

资源里两份环境配置 PDF 覆盖了 CUDA、PyTorch、YOLOv5 依赖的安装。我按自己的经验补三个 PDF 里可能没强调的点。

第一,PyTorch 版本和 CUDA 版本必须匹配。常见做法是先nvidia-smi看驱动支持的 CUDA 上限,再去 PyTorch 官网找对应命令。比如驱动显示 CUDA 12.1,就装 cu121 版本的 torch,别装 cu118,否则torch.cuda.is_available()返回 False,训练直接掉到 CPU。

第二,YOLOv5 的 requirements.txt 里有些包版本会冲突,尤其是 opencv-python 和 PyQt5 同时装的时候。我一般先装 PyQt5,再装 YOLOv5 依赖,最后手动降 opencv 到 4.5.x,避免界面和推理抢同一个 cv2 版本。

第三,如果要用 PyQt 界面,确认 PyQt5 是 5.15 以上,低版本在 Python 3.9+ 上会有 sip 报错。装完跑一句python -c "from PyQt5.QtWidgets import QApplication; print('ok')",能打印 ok 再往下走。

3.2 训练命令与超参数:别照搬默认值

YOLOv5 训练入口是 train.py,这份资源的数据集可以直接喂进去:

python train.py --data data.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100 --hyp data/hyps/hyp.scratch-low.yaml --device 0

--data指向 data.yaml;--weights用预训练权重比从头训收敛快得多,yolov5s 最轻,yolov5m/l 精度更高但显存吃紧;--img 640是输入尺寸,打架动作幅度大,640 通常够用,如果画面里人很小可以提到 1280,但 batch 要相应降到 8 或 4;--batch 16看显存,8G 显存跑 640 大概能到 16,12G 可以到 32;--epochs 100是常见起点,看验证集 mAP 不再涨就可以停。

超参数文件 hyp.scratch-low.yaml 里几个关键项值得改:

参数默认值打架检测建议原因
lr00.010.005二分类任务学习率低一点更稳
lrf0.010.05末期学习率别降太狠,防止 fight 类欠拟合
warmup_epochs35数据量一万多,预热久一点
box0.050.08打架框重叠多,框回归权重大一点
cls0.50.8类别少但误报代价高,分类损失加重

改完超参数重新训,观察验证集上 fight 类的 recall。如果 recall 低于 0.7,优先加 cls 权重和补 fight 样本,而不是盲目加 epoch。

3.3 训练过程看什么:loss 曲线和混淆矩阵

训练启动后,runs/train/exp/ 下会生成 results.csv 和混淆矩阵图。我一般盯三个指标:box_loss 是否稳定下降、val/box_loss 是否跟着降、fight 类的 recall 是否在涨。

如果 box_loss 降但 val/box_loss 涨,说明过拟合,早停或加数据增强。如果 fight 类 recall 一直上不去,看混淆矩阵里 fight 被预测成 normal 的比例,高的话就是前面说的类别不平衡问题,可以在 data.yaml 里给 fight 加样本权重,或者用 copy-paste 增强多合成一些打架场景。

YOLOv5 自带的数据增强里,mosaic 和 mixup 对打架检测有帮助,因为打架动作往往和背景、多人交互强相关。但 mixup 别开太大,0.1 左右就行,太大反而让模型分不清人和背景。

4. 避坑与排查:这份资源最容易翻车的五个地方

4.1 现象:推理结果全是 normal,没有 fight 框

原因:置信度阈值设太高,或者权重加载的不是打架训练的那份。资源包里可能有多个 .pt 文件,别拿错。

解决:先把--conf-thres降到 0.25 跑一遍,如果出现 fight 框,说明阈值问题,逐步往上调到误报和漏报平衡。如果还是全 normal,检查权重文件名和训练日志里的 best.pt 是否一致。

4.2 现象:训练报错「No labels found in ...」

原因:data.yaml 里的路径是相对路径,和你实际运行 train.py 的目录不匹配。这是这份资源最常见的翻车点。

解决:把 data.yaml 里 train/val/test 改成绝对路径,或者cd到 yaml 所在目录再跑。改完用ls ../train/images | head确认图片确实在那个位置。

4.3 现象:PyQt 界面点按钮后卡死,窗口变白

原因:推理代码直接写在主线程槽函数里,耗时操作阻塞了 Qt 事件循环。

解决:按 2.3 的方式把推理放进 QThread,用信号回传结果。如果已经写了 QThread 还卡,检查是不是在 run 里直接操作了界面控件,Qt 规定子线程不能碰 UI,必须通过信号。

4.4 现象:训练到一半显存爆了,报 CUDA out of memory

原因:batch 或 img 尺寸设太大,或者没开混合精度。

解决:先把 batch 减半,img 从 640 降到 416 试。YOLOv5 支持--amp自动混合精度,加这个参数能省不少显存。如果还爆,检查是不是 dataloader 的 workers 开太多,--workers 4一般够用。

4.5 现象:验证集 mAP 很高,但实际视频检测效果差

原因:数据集里的打架图片和实际场景分布不一致,比如训练集多是白天室内,实际是夜间室外。

解决:抽实际场景的图做测试,如果确实差,要么补标注实际场景数据微调,要么在推理前做图像增强(提亮、去噪)。别只看验证集指标,那只能说明模型在验证集分布上表现好。

5. 进阶技巧:把这份资源用到树莓派和 RK3568 上的思路

资源本身是 PyTorch 权重,但热词里提到的树莓派4b部署yolov5和yolov5量化rk3568,说明很多人想把它推到边缘设备。我讲一下我实际走过的路。

PyTorch 权重不能直接在树莓派上跑,需要先转 ONNX,再用 ONNX Runtime 或 NCNN 推理。转换命令:

python export.py --weights best.pt --include onnx --img 640 --batch 1

--include onnx导出 ONNX 模型,--batch 1是因为边缘设备通常单张推理。导出后用 onnxsim 简化一下,去掉冗余算子。树莓派4b 上装 onnxruntime,跑一张 640 的图大概 1~2 秒,做实时检测不够,但做定时抓拍分析可以。

RK3568 这类带 NPU 的板子,需要把 ONNX 再转成 RKNN。这一步要用 RKNN-Toolkit2,在 x86 电脑上转换,然后推到板子上跑。量化时注意:打架检测的 fight 类样本少,量化校准集里一定要包含足够多的 fight 图,否则量化后 fight 类召回会掉得厉害。我一般从训练集里抽 200 张,normal 和 fight 各一半做校准。

PyQt 界面在树莓派上也能跑,但别用太重的样式,QSS 简化一点,否则界面渲染就吃掉不少 CPU。如果只是演示,可以把界面和推理分开:界面跑在笔记本上,推理通过 HTTP 请求发给树莓派,这样两边都不卡。

最后说个我自己的习惯:每次拿到这种打包资源,先跑推理验证权重可用,再跑一次短训练(比如 5 个 epoch)验证数据管道通,最后才动界面和部署。这三步走完,基本能判断这份资源是能直接落地还是需要大改。从那以后我每次拆包都强制走一遍这个顺序,省了很多返工。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询