首页 / 资讯中心 / 文章详情

基于YOLOv8的智能工厂电子围栏系统:从训练到部署

基于YOLOv8的智能工厂电子围栏系统:从训练到部署 ★ FEATURED ARTICLE
简介这是一份基于YOLOv8的智能工厂危险区域电子围栏系统完整资源包面向高校学生毕业设计、课程设计场景也适合工厂安全领域的技术人员用于快速搭建与验证。系统核心思路是利用YOLOv8实时检测监控画面中的人员或物体一旦进入设定的危险区域便自动触发告警与安全联动。压缩包共97个文件以约70个Python脚本为主涵盖检测服务、可视化界面、模型训练、配置文件等模块另含4个pt权重文件、XML配置、说明文档和演示视频整体大小24.21MB部署流程已通过教程简化即便技术背景较浅的用户也能按步骤完成运行。可视化界面采用图形化操作方式可直接呈现监控画面及告警信息模型训练模块则覆盖从数据预处理、参数配置到训练调优的完整链路为二次开发与功能定制打下基础。目前已有39人学习使用对于需要完整工厂安全检测方案的读者来说是一份省时省力的参考资料。1. 基于YOLOv8的智能工厂危险区域电子围栏系统需求分析与方案定位在工厂产线边、配电房门口、危化品仓储区这类高风险区域单靠物理围栏和人工盯监控很难做到即时干预。这套基于YOLOv8的智能工厂危险区域电子围栏系统用目标检测模型实时识别进入设定区域的人员和异常目标一旦越过围栏边界立即触发告警和联动处置把传统安防从“事后查视频”变成“事中秒级响应”。方案面向两类人做毕设或课设的学生需要一套能跑通、能讲清楚、能现场演示的完整系统工厂安全管理的工程人员需要一个能二次开发、能对接现场摄像头的检测服务。压缩包里已经带了训练好的best.pt权重、五类检测服务、可视化界面和测试视频部署不是从零调模型而是直接加载权重跑通全流程再按自己的数据做迁移训练。2. 系统总体架构设计从视频流接入到围栏告警的四层职责划分2.1 功能需求与技术选型为什么是YOLOv8智能工厂的电子围栏场景对检测算法有两个硬性要求实时性和可部署性。工厂摄像头通常是25帧每秒的流式输入检测模型要跟上这个节奏并且最好能在普通工控机甚至笔记本上运行。YOLOv8在这两者之间做到了很好的平衡模型训练目录里同时放了yolov8n.pt与yolo11n.ptn代表nano轻量版本参数量小、推理速度快适合边缘部署如果实际场景中摄像头距离远、目标小可以换成s或m版本用GPU显存换精度。对比几种常见选型能更清楚这个选择的分量。Faster R-CNN是两阶段检测器精度高但单帧推理在CPU上往往超过200毫秒很难做实时围栏RTMDet在速度和精度上表现也不错但MMDetection那套配置链和部署流程比YOLOv8重不少。config目录里保留了rtmdet_m_8xb32-300e_coco.py和rtmpose-m_8xb64-270e_coco-wholebody-256x192.py两个参考配置说明做方案时详细评估过MMLab体系最终主线放在YOLOv8上是因为训练链路短、导出方便、换数据集重训的成本更低。对学生做毕设来说时间最宝贵一个能快速出结果的选型比单纯追求精度指标更重要。模型单帧推理耗时GPU部署复杂度场景适配YOLOv8n约5-8ms低pip安装即可实时围栏主选Faster R-CNN约40-80ms高需MMDetection配置离线分析场景RTMDet约10-20ms中配置链较长精度优先场景# train_mode.py 中初始化检测模型的逻辑 from ultralytics import YOLO # 加载nano版本预训练权重参数量约3.2M适合实时围栏场景 # 摄像头距离远、目标小时可换成 yolov8s.pt model YOLO(yolov8n.pt) # 后续训练入口model.train(datadataset/data.yaml, epochs100, imgsz640)这段代码展示了train_mode.py里模型初始化的最小写法。yolov8n.pt作为预训练权重模型会加载在COCO数据集上学到的通用特征即使工厂数据集只有几千张图片也能在几十个epoch内收敛到可用精度。训练时换成yolo11n.pt的写法完全相同两个权重文件在ultralytics接口下是统一的。2.2 四层架构输入、检测、判定、联动的边界整套系统的架构按职责拆成四层层与层之间通过帧数据和事件对象解耦这是做这类系统时比较稳妥的做法。视频输入层负责对接不同来源。线上环境读取摄像头RTSP流线下测试读取本地视频文件压缩包里abnoenal_video_five_type_test目录下的mp4测试视频就是用来验证这条链路的没有摄像头也能完整跑通检测和告警流程。目标检测层加载model目录下的best.pt权重对每一帧画面做推理输出目标框坐标、类别ID和置信度。检测层的输出不直接交给界面而是先进入围栏判定层。围栏判定层是整个系统的业务核心。它维护一个或多个预定义的多边形区域代表画面中的危险区域当检测目标的最低点通常用框底部中心点表示落入多边形内部时触发“进入围栏”事件连续多帧命中才算有效入侵这样可以过滤掉单帧误检。告警联动层拿到入侵事件后按配置执行响应动作包括在可视化界面中高亮入侵目标、弹出告警卡片、记录带时间戳的告警日志以及调用外部接口触发声光设备。围栏区域的多边形坐标以归一化形式保存比如一个四边形危险区域保存为[[0.2, 0.3], [0.8, 0.3], [0.8, 0.7], [0.2, 0.7]]。归一化的好处是不同分辨率下不用重新标定640和1280的画面共用同一套比例坐标。# 围栏判定射线法判断目标脚点是否在多边形内 def point_in_polygon(px, py, polygon): inside False n len(polygon) for i in range(n): x1, y1 polygon[i] x2, y2 polygon[(i 1) % n] if ((y1 py) ! (y2 py)) and (px (x2 - x1) * (py - y1) / (y2 - y1) x1): inside not inside return inside这是经典的射线法实现从目标点向右水平发射一条射线统计与多边形边的交点个数奇数为在内部、偶数为在外部。代码简洁且不依赖第三方库在CPU上单次判断耗时可以忽略不计。注意这里用脚点而不是中心点来判断是因为人员站立时脚点更贴近实际站位中心点判断容易把站在围栏外但身体探入的人误报。这种分层设计在后期维护时的价值最明显。现场摄像头要换品牌只改输入层围栏误报太频繁只调判定层的连续帧阈值要对接工厂音柱只加联动层的回调接口。哪个环节出了问题顺着层边界排查就能快速定位不用把整个工程翻一遍。2.3 源码目录映射拿到压缩包先理清楚每个文件很多同学第一次拿到这类项目习惯性双击main.py报错了再回来说跑不起来。我一般建议先花十分钟对着目录梳理职责磨刀不误砍柴工。main.py可视化界面入口负责启动GUI、加载模型、绑定告警回调five_type_det_service.py五类检测服务封装对外提供推理接口内部完成模型加载、围栏判定、事件推送detect.py命令行检测脚本适合先用单张图片或单段视频验证模型效果model目录存放best.pt权重和辅助脚本best.pt是训练产物推理时直接加载utils目录YOLOv8训练推理的工具函数包括loss.py、metrics.py、plots.py、augmentations.py、autoanchor.py等config目录MMLab参考配置rtmdet_m_8xb32-300e_coco.py和rtmpose-m_8xb64-270e_coco-wholebody-256x192.py用于横向对比选型UI目录界面资源文件icon.ico是程序图标模型训练目录训练脚本和原始权重train_mode.py负责训练Detection_video.py负责视频检测这个目录设计有一个值得留意的点detect.py和five_type_det_service.py职责完全不同前者是验证模型后者是提供被UI调用的服务。开发时我习惯先用detect.py在一段测试视频上确认模型效果达到预期后再启动可视化界面这样能把模型问题与界面问题隔离开避免出现“界面起来了但画面是黑的分不清是没读到流还是模型崩了”的黑匣子状态。five_type_det_service.py中的五类指五个检测类别具体类别集合以数据集标签为准。通常在工厂安全场景中约定为人员、安全帽、车辆、火焰和烟雾但换数据集后类别名可以完全自定义。config目录里保留了rtmpPose的参考配置说明系统设计时考虑过姿态估计的扩展如果现场需要判断人员是否摔倒、是否在攀爬可以在此基础上叠加人体关键点模型。3. 模型训练流程与权重迭代从yolov8n.pt到best.pt的完整闭环3.1 数据集准备与标签体系压缩包内提到的“完整数据集”遵循YOLO格式的目录约定。建议先把数据集单独放在dataset目录下与代码目录分开管理避免训练时路径混乱。标准的目录结构是images和labels两个分支各自分为train和val子目录图片与标签文件一一对应。dataset/ images/train/ # 训练图片 images/val/ # 验证图片 labels/train/ # 训练标签 labels/val/ # 验证标签 data.yaml # 数据集配置标签文件是TXT格式每行代表一个目标类别ID 中心点x 中心点y 宽度 高度所有坐标值均归一化到0到1之间。以人员目标为例一行内容可能是0 0.512 0.335 0.184 0.620含义是类别0person目标中心位于画面51.2%横坐标、33.5%纵坐标处宽占18.4%、高占62%。这种纯文本格式的好处是可以用任何编辑器打开检查写脚本统计类别数量也很方便。拿到别人的数据集后第一件事不是直接开训而是抽查标签质量。我见过不少翻车现场图片里明明有目标但标签文件是空的或者类别ID与data.yaml里的names顺序错位。快速验证方法是用YOLOv8自带的标注可视化功能随机抽几百张图检查检测框是否贴合目标这一步能省掉后面大量排查时间。3.2 data.yaml配置与训练参数调优data.yaml是数据集的“身份证”训练和推理都要读它。内容看起来简单但names列表的顺序一旦和标签文件的类别ID错位会出现训练精度很高但预测类别全是错的诡异现象。# dataset/data.yaml train: dataset/images/train val: dataset/images/val nc: 5 # 类别数与five_type_det_service中的五类对应 names: 0: person 1: helmet 2: vehicle 3: fire 4: smoketrain_mode.py在训练时通过data参数指向这个文件names顺序必须与训练时保持一致。训练完成后推理时也要通过同一个yaml映射类别ID否则会出现检测到目标但标签名字对不上的问题。训练参数调优是影响最终效果最直接的因素。默认参数能跑出一个基础结果但如果想拿到满意的best.pt几个关键参数得按自己的硬件和数据量调整。下面给出train_mode.py中常见的完整训练配置# train_mode.py 训练执行逻辑 from ultralytics import YOLO model YOLO(yolov8n.pt) results model.train( datadataset/data.yaml, epochs150, # 训练轮次小数据集80-150轮足够 imgsz640, # 输入分辨率目标小可调到960 batch16, # 批次大小显存不够就降到8 patience20, # 早停耐心值验证集连续20轮不提升则停止 device0, # GPU编号CPU训练填cpu workers4, # 数据加载线程数 lr00.01, # 初始学习率 augmentTrue, # 开启数据增强 )epochs是训练轮次。数据集在几千张规模时150轮通常足够收敛数据集很大或者场景复杂就往上加到300轮。patience是早停耐心值验证集指标连续20轮没有提升就提前终止训练既省时间又防止过拟合。batch受显存限制16G显存跑nano模型用16没问题6G显存就必须降到8调不动batch就动imgsz两者对显存的影响是乘除关系。3.3 best.pt的选取逻辑与模型评估训练过程中ultralytics会自动保存last.pt和best.pt两个权重。best.pt的选取标准是验证集上的mAP最高而不是训练集loss最低。这是最常见的一个认知偏差训练集loss曲线一路向下很好看但验证集mAP上不去说明模型在死记硬背训练集属于过拟合。评估模型效果一般看三个指标。mAP50表示IoU阈值为0.5时所有类别的平均精度mAP50-95则是在0.5到0.95之间取多个阈值求平均要求更严格Precision和Recall分别反映误检率和漏检率。电子围栏场景更看重Recall漏掉一次入侵比多报一次警严重得多。如果训练结果显示Recall偏低可以适当降低置信度阈值或者增加该类别样本数量。best.pt训练完成后存放在模型训练目录或runs/train/exp/weights/目录下部署时把它复制到model目录替换掉原来的权重文件。这里有个容易混淆的点模型训练目录里的yolov8n.pt是初始预训练权重best.pt是训练产物两个文件要区分开。用best.pt替换model目录的旧权重后重新启动main.py系统就会使用新模型推理。3.4 训练完成的验证Detection_video.py的快速测试训练完成后不要急着启动整个可视化系统先用Detection_video.py做一次快速验证。这个脚本专门用来对视频文件做检测推理输入是一段测试视频输出是带检测框的标注视频可以直接看到模型在连续帧上的表现。python Detection_video.py --weights 模型训练/best.pt --source abnoenal_video_five_type_test/gB_9_s5_2019-03-07T16\;31\;4801\;00_rgb_body_005.mp4 --conf 0.5验证时重点关注三件事第一检测框是否稳定同一个目标在相邻帧里框的位置是否有大幅跳动第二类别标签是否正确五类目标是否都标对了名字第三置信度阈值是否合理0.5是最常用起点如果漏检多就降到0.3如果误检多就升到0.6。这一步确认没问题后再进入可视化界面会让后续调试省很多时间。4. 可视化界面与服务化封装main.py与five_type_det_service.py的协作方式4.1 可视化界面的功能布局可视化界面是整个系统的门面也是答辩时最直观的演示素材。界面核心是一个视频显示区实时播放摄像头或测试视频画面危险区域用半透明多边形叠加显示检测目标用彩色矩形框标出入侵目标用红色高亮。视频显示区下方是告警列表每一条告警记录包含时间、目标类别、置信度和围栏编号支持按时间筛选。界面右侧是控制面板存放常用的运行参数置信度阈值滑条、围栏判定连续帧数设置、视频源切换按钮、模型加载状态指示灯。置信度阈值滑条是演示时的利器评委想验证误报控制时把阈值拉高看漏检想验证漏检控制时把阈值调低看误报。围栏灵敏度则控制连续多少帧算有效入侵数值越高系统越保守。main.py承担了这些组件的组装工作。它的初始化流程是先加载YOLO权重再读取围栏配置然后启动视频线程最后把检测服务和界面控件绑定在一起。界面本身用常见的桌面开发框架实现刷新率控制在10到15帧每秒就足够流畅不需要追满25帧。4.2 five_type_det_service.py的检测服务接口five_type_det_service.py把模型推理、围栏判定、告警事件推送封装成一个独立服务模块UI层不直接接触YOLO接口。这样做的好处是模块可以独立测试先用命令行脚本跑一段视频验证服务逻辑再挂到界面上去出现问题不需要连UI一起调试。# five_type_det_service.py 核心接口设计 import time from ultralytics import YOLO from my_func import point_in_polygon # 围栏判定工具 class FiveTypeDetService: def __init__(self, weights_path, fence_config_path): self.model YOLO(weights_path) self.fence_polygons self.load_fence_config(fence_config_path) self.conf_threshold 0.5 def detect_frame(self, frame): results self.model(frame, confself.conf_threshold) events [] for result in results: for box in result.boxes: x1, y1, x2, y2 box.xyxy[0].tolist() cls_id int(box.cls[0]) score float(box.conf[0]) # 用框底部中心点作为人员落地点 foot_x (x1 x2) / 2 foot_y y2 for fence_id, polygon in enumerate(self.fence_polygons): if point_in_polygon(foot_x, foot_y, polygon): events.append({ fence_id: fence_id, class_id: cls_id, bbox: [x1, y1, x2, y2], confidence: score, timestamp: time.time() }) return events这个服务的核心逻辑在detect_frame方法中对输入帧执行推理遍历每个检测框取框底部中心点作为人员脚点逐个围栏区域做多边形包含判断。如果脚点在围栏内则生成一个告警事件。事件是结构化字典包含围栏编号、类别ID、检测框坐标、置信度精确到毫秒的时间戳UI层拿到这个事件列表后统一渲染。注意confidence字段要保留原始置信度不要在前端重新算。另外连续帧判定逻辑通常放在服务层内部封装一个FenceStateTracker类维护每个目标跨帧的状态。UI只消费最终的事件流不关心模型是怎么判定的。4.3 部署步骤从压缩包到可运行系统部署流程是这套方案比较省心的部分。解压后先按README.txt的说明安装依赖核心依赖是ultralytics和opencv相关包用pip安装即可。建议新建一个独立的Python虚拟环境避免和系统其他项目冲突。依赖装好后按顺序执行三步。第一步确认模型文件路径正确model目录下的best.pt存在第二步用detect.py对测试视频跑一次推理确认基本链路通第三步启动main.py进入可视化界面。测试视频就是abnoenal_video_five_type_test目录下的mp4文件无需摄像头也能演示完整流程。# 部署执行命令 pip install -r requirements.txt python detect.py --weights model/best.pt --source abnoenal_video_five_type_test/gB_9_s5_2019-03-07T16\;31\;4801\;00_rgb_body_005.mp4 python main.py如果现场环境没有GPU模型默认会尝试用CPU推理。yolov8n在CPU上的推理速度大约是每帧40到80毫秒处理15帧每秒的视频流问题不大。如果需要更高吞吐可以考虑用ONNX导出加速但毕设演示用原生的PyTorch推理已经足够。5. 常见问题与避坑排查五类最容易翻车的场景5.1 现象模型加载失败或路径报错系统启动时提示找不到权重文件或者加载到一半闪退。原因几乎都是路径问题main.py或detect.py里的模型路径写的是相对路径而终端的工作目录不在项目根目录下。解决方法是统一在项目根目录打开终端或者把代码里的相对路径改成基于文件所在目录的绝对路径计算。我一般会在脚本开头加一段路径处理逻辑用os.path.dirname(file)定位脚本位置再拼出模型文件的绝对路径这样在任何目录启动都不会出错。5.2 现象检测框错乱或类别标签全是乱的视频里检测框位置明显不对或者框是对的但标签名字对不上。两种原因一是模型权重与数据集不匹配加载了未训练的last.pt或者放错了权重文件二是推理时没有加载data.yaml导致类别ID无法映射到正确名字。解决方法是先确认best.pt是训练产物而不是yolov8n.pt初始权重再检查five_type_det_service.py或检测脚本中是否指定了names配置。排错时用一张标注过的图片单独跑一次推理对比检测结果和标注信息就能判断是权重问题还是标签映射问题。5.3 现象围栏区域不触发或持续误报围栏多边形已经画好了但人走到里面也不报警或者人站在外面不停报警。这通常是两个原因。区域不触发时先检查多边形坐标格式是用归一化坐标还是像素坐标两者混用会导致区域位置完全偏移误报频繁时检查判定逻辑用的是脚点还是中心点以及连续帧阈值设了多少。我踩过最典型的坑是检测框坐标从YOLO出来是像素值而多边形坐标是归一化值两者直接比较导致所有点都不在区域内解决方法是统一坐标系——要么全部乘上画面宽高要么全部归一化。5.4 现象部署到另一台机器缺依赖或版本冲突在自己的机器上跑得好好的换一台电脑就各种报错。原因是环境没固化不同机器的Python版本、CUDA版本、依赖包版本有差异。解决方法是导出完整的环境依赖清单用pip freeze把版本号固定下来。包里已经带了requirements.txt和部署教程但还是建议亲自在一台干净机器上按教程走一遍把报错记录下来。答辩时评委可能会问“换一台电脑能跑吗”亲手验证过才有底气回答。此外Python版本建议锁定3.8到3.10之间新版本ultralytics对Python的兼容边界不一定覆盖。5.5 现象训练时显存溢出或训练中途卡死显存溢出在训练环节很常见表现是epoch刚开始就报CUDA out of memory。原因是batch和imgsz搭配超出显存容量解决方法是先把batch降到8以下再考虑是否把imgsz从640降到512。训练中途卡死则通常在数据加载环节检查是不是数据集的某张图片损坏或者标签文件中有NaN值写一个脚本遍历全部标签文件检查解析是否正常就能定位。这两个问题都是训练流程里的高发问题提前在教程文档里写清楚能省掉很多答疑成本。6. 验收与答辩用一张检查表和一次端到端演示证明系统可用6.1 验收检查表逐项确认交付物完整交一份毕设项目不是代码能跑就完事的。验收检查表应该覆盖四层功能完整性、技术指标、代码规范性、交付物齐全性。功能完整性包括五类检测能否命中、围栏判定是否准确、告警记录是否带时间戳、可视化界面各控件是否可用技术指标包括推理帧率、置信度阈值调节范围、围栏灵敏度可配置代码规范性包括是否有README、关键函数是否有注释、目录结构是否清晰交付物则包括源码、数据集、训练好的权重、测试视频、部署文档。6.2 答辩演示思路从“能用”到“说服”演示不要从登录界面开始慢慢点评委没耐心看完整操作流程。正确顺序是先播一段测试视频展示检测框和围栏区域叠加效果然后人为触发一次入侵事件展示告警弹出、红色高亮、日志写入三个动作。接着把置信度阈值从0.5调到0.3让评委看到检测召回率提升再调回0.5说明误报控制。最后展示数据集图片数量和标注样例说明训练过程和best.pt的来源。评委常问的问题也提前准备为什么选YOLOv8而不是Faster R-CNN直接答实时性和部署便利性对比数据best.pt是怎么来的答训练过程中按验证集mAP自动保存的最佳权重五个类别为什么是这些答根据工厂安全事故的高频目标定的可以根据场景自定义类别。每个问题都有明确的答案支撑答辩就稳了。这套系统从交付到答辩最核心的经验是一条每一次拿到新环境我都强制走一遍“建虚拟环境、装依赖、跑detect.py、跑main.py”的完整流程把每一步报错截图存档。这个过程看起来笨但到了验收现场它能保证你不会在评委面前翻车。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站