资讯动态

YOLOv8电子围栏:工厂危险区域智能告警系统解析

发布时间:2026/10/19 10:24:59 来源:尧图企业网站定制
简介基于YOLOv8的智能工厂危险区域电子围栏系统是一套面向工厂安全管理的目标检测解决方案适合高校学生完成毕业设计、课程设计也可帮助工厂安全管理人员快速搭建危险区域入侵告警原型。资源包将源码、可视化界面、完整数据集、部署教程集于一体支持直接部署运行也便于后续二次开发与定制。包内共97个文件以Python脚本为主70个py另含模型权重4个pt、配置文件、说明文档及演示视频等压缩包约24.21MB目录划分清晰便于按模块检索。系统利用YOLOv8自动识别进入设定危险区域的人员或物体并及时告警同时提供可视化操作界面和模型训练脚本覆盖数据处理、模型调优、界面管理到最终运行验证的完整流程。目前已有39人学习适合需要可运行项目参考的初学者和研究者也可作为工厂安全应用开发的基础原型。1. 闯入检测的另一种打开方式YOLOv8 电子围栏到底解决了什么工厂里最贵的东西往往不是机器而是安全事故。传统电子围栏靠红外对射和震动光纤布设成本高、误报率高还分不清闯进来的是人还是野猫。这套基于YOLOv8的智能工厂危险区域电子围栏系统把围栏直接做进了视频流里——用目标检测模型实时识别进入画面的人员再用边界框坐标去判断是否踏入划定危险区域越界立刻告警。压缩包里带了源码、PyQt可视化界面、完整数据集和部署教程环境配好就能跑。想拿它做毕设或课程设计底座的同学或者做工厂安全智能化改造的工程师这套代码的检测服务和界面框架都足够厚实。2. 技术选型与系统架构为什么 YOLOv8 是这套方案的核心2.1 技术栈全景检测模型、GUI 框架、多媒体处理的组合这套系统的技术选型非常贴近当前视觉落地项目的主流做法。检测层面用的是 ultralytics 的 YOLOv8模型文件里带了官方的 yolov8n.pt 预训练权重也放了训练好的 best.pt 和 yolo11n.pt说明开发者自己跑过训练流程不是只拿官方权重糊弄。界面层走的是 PyQt 方案UI 目录里能看到完整的界面资源配合视频流显示和告警弹窗属于典型的桌面端视觉监控应用。后端处理层的结构更能看出工程沉淀。项目里有一个 utils 包里面包含了 loss.py、augmentations.py、metrics.py、autoanchor.py、general.py、plots.py、callbacks.py、dataloaders.py 这一整套文件——这其实就是 ultralytics 训练和推理时的工具箱。myutil.py 和 my_func.py 这两个自定义模块应该是开发者自己封装的工具函数用来衔接检测结果和界面逻辑。值得注意的还有配置文件目录里的 rtmdet_m_8xb32-300e_coco.py、faster-rcnn_r50_fpn_2x_coco.py 和 rtmpose-m_8xb64-270e_coco-wholebody-256x192.py。这三份分别是 MMDetection 的 RTMDet、Faster R-CNN 检测配置和 MMPose 的姿态估计配置。开发者大概率做过不同检测框架的对比实验或者预留了用姿态估计做更精细人员行为判断的扩展点。这套资源表面上是 YOLOv8 单模型落地实际底子是检测、对比、姿态三线并行的完整研究结构。2.2 目录结构拆解一份源码包里的职责划分把压缩包解压后目录结构大致可以分成四块我按职责划分给你├── 可视化页面设计/ # 界面资源UI 布局文件、icon.ico、图标素材 ├── five_type_det_service.py # 五类目标检测服务核心推理封装 ├── main.py # 程序主入口启动界面和检测流程 ├── my_func.py # 自定义功能函数告警、绘制、区域判断等 ├── detect.py # 检测脚本可单独运行做推理测试 ├── Detection_video.py # 视频检测脚本处理视频文件的检测输出 ├── train_mode.py # 模型训练脚本负责数据集加载和训练参数配置 ├── model/ │ ├── best.pt # 训练好的最优权重 │ ├── yolov8n.pt # YOLOv8n 预训练权重 │ └── yolo11n.pt # YOLO11n 预训练权重 ├── config/ # MMDetection / MMPose 对比实验配置 ├── utils/ # ultralytics 工具包 自定义工具 └── 测试视频样本.mp4 # 用于验证检测效果的视频片段这里有个容易看懵的点main.py 和 detect.py 都能跑检测但职责不同。detect.py 是纯推理脚本输入一张图或一个视频路径输出标注后的结果适合验证模型效果。main.py 才是完整系统它会启动可视化界面、加载检测服务、拉视频流并实时显示告警。第一次跑项目建议先试 detect.py能跑通再上 main.py排查问题范围小很多。测试视频放在 abnoenal_video_five_type_test 目录下文件名带_rgb_body_字样说明这类样本可能是带人体标注的异常行为视频。README.txt 和那个长串命名的说明文档是部署时的主参考我强烈建议先读这两个文件再动手文档里通常会写明依赖版本和要求的数据集目录格式。2.3 主流程链路视频帧从进入到告警触发走了哪几步整个系统跑起来的链路可以拆成五步。第一步视频源本地视频文件或摄像头实时流逐帧送入检测服务第二步YOLOv8 模型对每一帧做推理输出目标的边界框、类别和置信度第三步系统把边界框的关键点比如人框的底部中点与预先划定的危险区域多边形做坐标比对第四步判断命中后触发告警状态界面实时高亮并记录告警日志第五步告警信息通过界面弹窗和状态栏同步呈现。这个链路里最关键的是第二步到第三步的衔接。YOLOv8 输出的坐标系是像素坐标而危险区域多边形是在界面初始化时由用户手动标定的像素坐标两者天然对齐省去了坐标换算的麻烦。但如果视频分辨率中途被 Resize 过边界框坐标和标定区域坐标就会错位这是我后面会单独讲的一个常见坑。第二个值得注意的设计是检测线程和界面线程的分离。main.py 里视频帧读取和模型推理属于耗时操作不能堵在 UI 主线程里否则界面会直接卡死。常见做法是开一个 QThread 专门跑检测循环通过信号把检测结果发回主线程刷新画面。这份代码里 main.py 和 five_type_det_service.py 的分工本质上就是在做这件事。3. 核心模块拆解一个视频帧从进入到告警的完整链路3.1 main.py 主入口界面线程与检测线程如何分工main.py 是整个系统的启动点它要做的事情有三件初始化 PyQt 界面、加载检测服务、启动视频流处理。从工程结构推断它的核心逻辑大致是这样一个模式import sys from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QThread, pyqtSignal import cv2 class DetectionThread(QThread): # 检测线程跑视频帧推理通过信号把结果传回UI线程 frame_ready pyqtSignal(object, list) # 原始帧 检测结果列表 def __init__(self, service, video_path): super().__init__() self.service service # five_type_det_service 的实例 self.video_path video_path self.running True def run(self): cap cv2.VideoCapture(self.video_path) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # 调用检测服务返回标注后的画面和结果 annotated_frame, detections self.service.detect_frame(frame) self.frame_ready.emit(annotated_frame, detections) cap.release() class MainWindow(QMainWindow): # 主界面显示检测画面、危险区域、告警信息 def __init__(self): super().__init__() self.det_thread None self.init_ui() # 加载 可视化页面设计 里的界面素材 def start_detection(self, video_path): service FiveTypeDetService(model_pathmodel/best.pt) self.det_thread DetectionThread(service, video_path) self.det_thread.frame_ready.connect(self.update_frame) self.det_thread.start()参数说明model_path指向训练好的权重文件传入yolov8n.pt就是官方预训练模型传入best.pt就是本项目数据上微调过的模型两类参数在启动速度上差异明显——yolov8n 更小推理更快但检测精度不如 best.pt。video_path支持本地视频文件路径也可以替换成摄像头设备号如0。这段代码的要点在pyqtSignal(object, list)这个信号设计上。检测结果是一个列表里面装着每个目标的类别名、置信度和边界框坐标object传的是 OpenCV 的 numpy 数组也就是标注绘制完成后的画面帧。信号槽机制保证界面刷新始终在 UI 线程执行检测循环在后台跑两边互不阻塞。这里有个新手容易翻车的点如果直接在检测线程里操作界面控件Qt 会不定期闪退错误信息还极其隐晦。3.2 five_type_det_service.py五类检测服务的封装与调用这个文件是推理逻辑的封装层。从名字可以看出它专门处理五类目标的检测任务。结合工厂安全场景推测这五类通常是人员、安全帽、车辆、叉车和火焰这类与危险区域强相关的目标具体类别以权重文件训练时的标注清单为准。它的核心工作是把 YOLOv8 的原始输出整理成上层界面容易消费的结构。典型实现思路是这样的from ultralytics import YOLOv8 class FiveTypeDetService: def __init__(self, model_pathmodel/best.pt, conf_thres0.5): self.model YOLOv8(model_path) self.conf_thres conf_thres # 记录每条检测的类别、坐标、置信度 self.last_detections [] def detect_frame(self, frame): # frame: OpenCV 读入的 BGR 图像numpy 数组 results self.model.predict(frame, confself.conf_thres, verboseFalse) boxes results[0].boxes detections [] for box in boxes: x1, y1, x2, y2 box.xyxy[0].tolist() # 边界框坐标 conf float(box.conf[0]) # 置信度 cls int(box.cls[0]) # 类别索引 detections.append({ bbox: [x1, y1, x2, y2], conf: conf, class: self.model.names[cls] # 类别名字符串 }) # 在画面上画出边界框和标签 annotated self.draw_detections(frame, detections) self.last_detections detections return annotated, detections def draw_detections(self, frame, detections): output frame.copy() for det in detections: x1, y1, x2, y2 det[bbox] label f{det[class]} {det[conf]:.2f} cv2.rectangle(output, (int(x1), int(y1)), (int(x2), int(y2)), (0, 0, 255), 2) cv2.putText(output, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) return output参数说明conf_thres是置信度阈值默认 0.5。实际使用中这套系统建议调到 0.35 到 0.4 之间——工厂环境监控距离远人员目标小YOLOv8 在小目标上的置信度普遍偏低阈值太高兴许就把闯入的人漏掉了。box.xyxy返回的是左上角和右下角的像素坐标格式是tensor务必先tolist()转成 Python 列表再存否则后续 JSON 序列化或者信号传参会层层报错。这里有一个从项目资源里能看出来的细节同目录下还有my_func.py按照这类项目的惯例画框逻辑、告警闪烁、危险区域叠加绘制这类界面相关的函数很可能被拆到了my_func.py里而five_type_det_service.py只专注模型推理。如果你要二次开发保持这个边界很重要——检测服务不要碰界面对象界面也不该直接调模型接口。3.3 危险区域判定坐标比对与告警触发的具体实现电子围栏的核心不在检测到人而在检测到人踏进了哪个区域。这部分逻辑通常封装在 my_func.py 或界面代码里核心是点与多边形的位置关系判断。OpenCV 提供了现成函数代码大致是这样的def is_inside_polygon(point, polygon): # point: 人员底部中点 (x, y)用底部而不是中心点更贴近脚踏入的语义 # polygon: 危险区域多边形的顶点列表[[x1,y1], [x2,y2], ...] return cv2.pointPolygonTest(polygon, point, False) 0 def check_alert(detections, danger_zones): alerts [] for det in detections: if det[class] ! person: # 只对人员触发闯入告警 continue x1, y1, x2, y2 det[bbox] foot_point (int((x1 x2) / 2), int(y2)) # 底部中点 for zone_name, polygon in danger_zones.items(): if is_inside_polygon(foot_point, polygon): alerts.append({ zone: zone_name, person_position: foot_point, confidence: det[conf], time: time.strftime(%Y-%m-%d %H:%M:%S) }) return alerts用脚部中点而不是边框中心点是这个实现里最有价值的一个细节。人站在危险区域边缘时中心点可能还在区域外但脚已经越线用中心点判断会漏报。pointPolygonTest的第三个参数传False时返回 0 或正数表示点在多边形内负数表示在外部。告警触发后常见做法是三层联动界面上把该区域标红并闪烁、状态栏和弹窗提示、同时把告警记录写进日志文件。如果你想扩展成声光报警器或者短信通知改的就是check_alert返回的alerts列表后续消费逻辑这块我放到最后一章的改造思路里细说。3.4 可视化界面监控画面与告警信息怎么呈现可视化页面设计目录里包含了界面布局文件和 icon.ico 图标资源。从资源构成看界面大概分四块区域左侧或中央是视频监控画面实时显示 YOLOv8 标注后的帧右侧是检测状态面板展示当前帧检测到几类目标及各自置信度下方是告警记录列表滚动展示历史闯入事件顶部工具栏提供开始检测、暂停、选择视频文件、划定危险区域等操作入口。危险区域的多边形标定是这套界面里最核心的交互。常见的实现方式是按住鼠标左键在监控画面上依次点击形成闭合多边形然后把它保存到危险区域列表里。程序把这些多边形顶点序列化存储下次启动还能重新加载。这套交互没有特别复杂的技术点难点在坐标系的保存——必须存原始视频分辨率下的像素坐标不能在缩略显示的画面尺寸下标定否则检测框和区域框就不在同一坐标系里。对毕设场景来说界面上如果能直观展示闯入前、闯入中、闯入后三张状态对比图答辩时演示效果会非常加分。好在 UI 目录里的素材定义了基础布局这块你可以在现有框架上按自己的审美调整。4. 模型训练与调优从 yolov8n.pt 到自己的 best.pt4.1 数据集准备与标注格式YOLOv8 要什么你就给什么模型训练部分存放在模型训练目录包含 train_mode.py 和多个权重文件。YOLOv8 训练要求的目录结构是固定的数据的组织方式直接决定训练能不能跑起来dataset/ ├── images/ │ ├── train/ # 训练图像 │ └── val/ # 验证图像 ├── labels/ │ ├── train/ # 对应的标注文本文件 │ └── val/ └── data.yaml # 类别名和路径配置labels 目录里每个 txt 文件与对应图像同名每行是一条标注格式为类别索引 中心点x 中心点y 宽度 高度坐标值全部归一化到 0~1 之间。这套系统压缩包里自带完整数据集解压后看 data.yaml 就能知道五类目标具体是哪五类label 文件里的第一个数字是类别索引对照 data.yaml 的 names 列表即可。YOLOv8 对数据集的敏感点有两个容易坑人一是 label 的类别索引必须从 0 开始连续编号中间缺一个数字训练时报错会比较晚损失曲线看着正常但 mAP 永远上不去二是 images 和 labels 两个目录的路径必须用相对路径或者绝对路径写清楚用../相对路径在换机器后容易失效我一般直接写绝对路径避免这种玄学问题。4.2 train_mode.py 训练参数配置显存不够怎么调train_mode.py 这个训练脚本每行参数都直接影响最终模型能不能用。我当时拆这套代码时重点看的参数是这些from ultralytics import YOLOv8 model YOLOv8(yolov8n.pt) # 用官方预训练权重做迁移学习 results model.train( datadataset/data.yaml, # 数据集配置文件路径 epochs100, # 训练轮数 batch16, # 批次大小显存不够就降到 8 imgsz640, # 输入图像分辨率 patience20, # 早停耐心轮数 device0, # 使用第 0 张 GPU无GPU改成 cpu workers4, # 数据加载线程数 optimizerAdamW, # 优化器 lr00.001, # 初始学习率 lrf0.01, # 最终学习率倍数 )参数说明patience20表示验证集指标连续 20 轮不提升就提前终止训练这能省不少时间imgsz640是精度和速度的平衡点工厂监控画面中人物通常只有几十像素高imgsz 提到 960 能明显提升小目标召回率代价是推理速度变慢workers4在 Windows 上建议改成 0否则多线程数据加载偶尔会报 DataLoader worker 相关的错。训练完成后会在runs/detect/train目录下生成 best.pt 和 last.pt。best.pt 是按验证集指标选出的最优权重部署时复制到项目根目录替换原来的 best.pt 即可这也是这个压缩包里模型文件命名为 best.pt 的原因。4.3 模型选型yolov8n 和 yolo11n 怎么选模型训练目录同时放了 yolov8n.pt 和 yolo11n.pt其实是给了两套选择。我从实际使用体验角度做了个对比对比项yolov8n.ptyolo11n.pt参数量约 320 万约 260 万推理速度快CPU 也能跑到实时更快适合边缘设备检测精度五类任务够用略低小目标场景有差距适用场景本项目主推best.pt 基于它训练低算力部署或实验对比如果你手头只有 CPU 环境yolo11n 跑起来会更轻松视频检测能做到不卡顿。如果追求检测效果尤其是远处人员这类小目标yolov8n 微调后的 best.pt 是更稳的选择。想对比验证的话把 five_type_det_service.py 里的 model_path 换成 yolo11n.pt 跑同一段视频就能看出差异。config 目录里还有 rtmdet_m 和 faster-rcnn 的 MMDetection 配置以及 rtmpose 的 MMPose 配置。rtmdet 和 faster-rcnn 属于对比基线rtmpose 则可以用于姿态估计——有了人体关键点能进一步识别人员是正常行走还是摔倒这在工厂安全里是更进阶的语义。5. 部署运行与常见问题排查让项目在你机器上跑起来5.1 环境清单装什么、装哪个版本这套系统依赖的核心库是 PyTorch、ultralytics 和 PyQt5。如果你用 GPU 跑CUDA 版本和 PyTorch 的匹配是第一道坎推荐在 PyTorch 官网用对应的 CUDA 版本命令安装而不是 pip 默认装 CPU 版。我整理了一份能稳定跑通的依赖清单依赖库版本建议说明Python3.9 - 3.113.12 对 PyQt5 兼容性不好PyTorch2.x CUDA 对应版纯 CPU 环境也能跑但较慢ultralytics8.x对应 YOLOv8 和 YOLO11PyQt55.15.x界面框架opencv-python4.x视频和图像处理numpy建议 1.24 以上与 opencv 配套即可我用一个小技巧检查环境是否正常装完依赖后先跑python -c from ultralytics import YOLOv8; YOLOv8(yolov8n.pt)能加载模型说明基础环境没问题再去跑整套系统把问题范围缩小到界面或视频环节。5.2 三步跑通整个项目第一步解压压缩包到纯英文路径比如D:/factory_fence/。路径带中文或空格PyQt 加载界面资源和 opencv 读视频都会出莫名其妙的错这是最值得提前规避的环境问题。第二步把 best.pt 放到项目根目录。压缩包结构里模型文件本身就在根目录下确认four/../best.pt这个相对路径能被 read 到即可。先测试推理脚本python detect.py --source 测试视频.mp4 --weights best.pt --conf 0.4这条命令会读取指定视频用 best.pt 做检测并在窗口或输出目录里生成标注结果。如果这一步输出框和类别名正常说明模型和数据链路没问题。第三步运行可视化系统主程序python main.py界面弹出来后点击打开视频按钮选择测试视频然后在画面上用鼠标划定危险区域多边形点击启动检测。此时视频开始逐帧播放人员检测框实时显示划定的区域叠加显示一旦检测到人员进入区域右侧告警列表就会出现记录。5.3 避坑指南四个真实踩过的坑坑一界面打开视频后直接闪退控制台报cv2.error: Assertion failed。这个报错几乎都出在视频路径上——测试视频文件名里带分号或特殊字符OpenCV 读文件时解析失败。解决方法是把测试视频复制到项目根目录并重命名为简单的英文名比如test.mp4同时检查cv2.VideoCapture的路径字符串前有没有多余空格。坑二检测框画出来了但人员进入划定区域后不触发告警。原因是危险区域标定时用了显示窗口的坐标比如 800x600 的预览图而检测框坐标是原始视频分辨率比如 1920x1080两个坐标系不匹配pointPolygonTest永远判不中。解决方法是把多边形顶点坐标按原始分辨率存如果代码里有 Resize 操作要同时把标定坐标除以缩放比例。坑三pycharm 里跑 main.py 报ModuleNotFoundError: No module named utils。原因是项目里同时有根目录的 utils 包和utils子目录Python 把其中同名包当成了模块IDE 的运行路径没包含项目根目录。解决方法是把项目根目录设为 Sources Root或者用命令行切到根目录后python main.py运行不要直接点 IDE 的运行按钮。坑四训练时 loss 曲线下降正常但验证集 mAP 几乎为 0。排查后常见原因是数据集里 labels 的 txt 标注文件类别索引越界——如果 data.yaml 里 names 定义了 5 类标注文件里却出现了5就超出索引范围了。加载数据时 YOLOv8 会把越界标注静默过滤掉导致正样本缺失。解决方法是写个小循环扫描所有 label 文件检查每行第一个数字是否小于类别数把异常样本揪出来。6. 二次开发思路 :把通用围栏改造成你自己的课程设计6.1 换检测类别五类变八类核心就改三处如果你的课程设计要求不是工厂场景而是换一种检测目标比如实验室安全、校园宿舍违规电器核心改动只需三处。第一处是dataset/data.yaml里的 names 列表改成你自己的类别名第二处是标注数据用 LabelImg 或 Labelme 重新标注你的目标数据集第三处是five_type_det_service.py里的类别过滤逻辑——check_alert里当前只对 person 类触发闯入告警你要把这里的类别判断改成你的业务目标比如检测手机或者检测宠物。这三处改完后跑一遍 train_mode.py用你自己的数据集训出 best.pt整个系统的围栏逻辑不需要动。6.2 告警联动从界面弹窗扩展到短信和声光报警默认告警停留在界面层面而工厂实际需求往往要联动硬件。改造点在check_alert返回告警列表之后的消费逻辑。常见做法是加一个基于requests的 Webhook 通知服务器收到告警后触发现场声光报警器或者用 Twilio 之类的服务发短信给安全员。我一般会先在告警函数里加一行落库代码——把告警记录写到 SQLite之后再接什么通知渠道都不缺数据链路。开发时建议把告警频控加上同一区域 5 秒内不要重复告警否则连续检测帧会刷爆日志。6.3 验证改造是否成功的三个指标改完代码最怕看起来跑通了但效果一塌糊涂。我习惯用三个量化指标来验收第一把测试视频跑完统计人员框在所有帧中被检测出的比例低于 90% 就说明置信度阈值要调低或模型要重新训练第二构造一段人员反复进出危险区域的测试视频确认告警触发帧数大于等于实际闯入帧数的 85%低于这个数说明区域判定逻辑有漏判第三记录单帧平均推理耗时CPU 环境超过 150ms 就说明模型选型偏重可以退回 yolo11n。做毕设或者课设答辩时能把这个三个指标讲清楚比堆任何花哨界面都有说服力。我第一次做类似项目时就吃过亏——界面做得花里胡哨结果现场演示时检测框剧烈抖动裁判一问精度指标直接答不上来。从那以后我每次改完检测类项目都强制走一遍召回率、告警准确率、单帧耗时这套验收流程宁可演示时界面朴素一点也要把核心指标背得滚瓜烂熟。希望这些拆解能帮你把这套系统真正跑起来再改出自己的版本。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑