
工厂安全巡检的日常说实话挺让人头疼的。我接触过好几个制造型企业的项目安全员就那么几个人车间动辄几万平方米一天巡检下来光靠腿跑根本不现实。后来大家把目光放在现有的监控摄像头上想用视觉算法替人盯着——这就是“基于YOLO26的工厂人员违规行为检测”这套方法出现的背景。这个方向说起来不算新安全帽检测、反光衣检测都是近几年安防视觉里的老话题但真正落地到工厂场景能稳定跑起来、误报率压得住的方案并不多。这篇文章不是什么学术论文也不是厂商宣传稿就是我个人做这类项目时沉淀下来的一套方法从数据集怎么建、标注规范怎么定到YOLO26这个较新版本的模型怎么调、行为判定逻辑怎么写再到部署时精度和帧率怎么取舍。适合正在做工厂安全AI项目的人参考也适合刚接触目标检测、想了解“检测之后还有什么”的算法工程师阅读。文章里所有观点都来自实际项目经验不涉及具体厂商和具体厂名方法论可以放心照搬。1. 违规检测的边界哪些行为能检哪些行为是深坑1.1 工厂违规行为检测的真实需求工厂安全管理的核心诉求其实就一条把人违反安全规定的瞬间找出来在事故发生前拦住它。具体到视觉算法能做的部分大概可以分成下面几类。第一类是PPE个人防护装备佩戴检测。安全帽、反光背心、防护面罩、防割手套这类东西特征明显、边界清晰单帧静态图就能判断是整套系统里最好做、也最容易出效果的部分。第二类是区域闯入检测比如高风险设备区、危险化学品存放区、配电房人员未经授权进入就需要告警这类问题靠目标检测框和电子围栏做几何判断就能搞定。第三类是动作型违规比如翻越围栏、攀爬货架、违规吸烟这类问题牵扯到时序信息单帧画面根本看不出“这个人是在正常走路还是准备翻越”必须结合多帧轨迹来判定。第四类是被动型风险比如人员长时间倒地、在某区域停留超时这类已经算行为分析而不是简单检测了技术上要依赖跟踪和时序状态机。这里我想先说一个很多人容易踩的坑不要一开始就想着把所有违规行为都检出来。我见过好几个项目组需求清单列了十几项最后做出来一个都不可用。原因很简单每一项违规行为背后都是一套独立的数据采集、标注和判定逻辑摊子铺太大必然管不过来。我的建议是优先做PPE佩戴和区域闯入这两类高确定性违规它们依赖单帧或短时序就能判断误报率可控动作型违规放第二阶段等轨迹跟踪稳定了再上。1.2 单帧检测与行为判定的分工逻辑工厂人员违规检测系统里最底层的技术单元还是目标检测——把画面里的人、安全帽、反光衣、手机这类目标框出来。但“检测”和“违规判定”是两回事。YOLO26这类检测网络输出的只是“画面里有什么、在哪个位置、置信度多少”它本身不知道这个人是不是违规了。违规判定是在检测结果之上叠加业务逻辑。举个例子检测模型输出了一个人框和一个安全帽框判断“这个人是否戴了安全帽”需要计算两者之间的包含关系、距离关系再结合时间序列做确认。这个逻辑链路我在第四章详细展开。我之所以强调这个分工是因为算法工程师很容易陷入“我要用一个模型解决所有问题”的思维定式。真实工程里最优解往往是一个通用检测模型负责感知所有目标业务规则模块负责判断是否违规。这样检测模型的复用度高新增加一种违规行为时只需要改规则模块不需要重新训练模型。1.3 前置条件了解现场摄像头分布做这个项目之前一定要去实地走一遍把摄像头点位、角度、焦距摸清楚。工厂摄像头里大量是俯拍广角镜头安装在厂房顶部镀锌钢梁上高度七八米甚至更高画面里的人可能只有几十个像素高。这种条件下常规的640x640输入分辨率检测小目标会吃亏。所以项目启动前需要盘点每路摄像头的视野范围、分辨率、覆盖区域给每路流设定独立的检测兴趣区ROI。这一步决定了后面数据采集怎么规划也决定了模型输入分辨率该选多大。很多项目死在“摄像头图像质量太差导致算法无法使用”上排查到最后发现根本不是算法问题是选错了点位、拿低分辨率流去做高精度检测属于前置工作没做透。2. 数据集是第一道生死关自建数据与标注规范2.1 现场数据采集规划目标检测模型的性能上限由数据决定。用公开数据集比如通用目标检测数据集里的person类预训练之后必须用现场数据做微调否则模型在你的场景下会水土不服。现场数据采集要覆盖几个维度。第一是时间维度白班、夜班、黄昏、阴天、雨天都要录不同光照下安全帽和反光衣的颜色特征变化很大。第二是空间维度同一个工位从不同摄像头角度采集正面、侧面、背面、俯拍都要有模型才能学到姿态不变性。第三是行为维度违规动作发生瞬间的资料尤其珍贵这类数据少的话可以组织安全员配合做模拟演练采集——让工人穿戴好装备再故意摘掉帽子走一圈这种“摆拍”数据虽然动作稍有表演痕迹但对模型训练非常有效。采集时长建议每路摄像头连续录制不少于一周覆盖不同班次。采集到的视频先做分段抽帧每3到5秒抽一帧再把明显重复的帧去重。一套覆盖50个工位的工厂最终沉淀下来的有效图像通常在两三万张的量级这个规模对PPE检测类的微调来说基本够用了。2.2 类别体系的底层设计标注类别的设计直接决定后面所有逻辑的复杂度。我强烈建议采用以下类别体系类别标签含义说明person人体整体框所有业务判定的基础锚点helmet安全帽与person头部区域联合判定是否佩戴vest反光衣/工作服与person躯干区域联合判定是否穿戴phone手机结合手部区域判定是否违规使用smk烟火/香烟细粒度目标用于吸烟行为识别这里有个设计要点不要把“违规”本身作为标注类别。比如不要标一个“未戴帽”类别而是标出person和helmet两个独立类别让模型去学习“有无”关系违规判断交给后处理逻辑去做。这么做有三个理由。一是类别语义清晰“未戴帽”是person存在而helmet不存在模型学“缺失”概念非常别扭。二是数据利用率高一张“已戴帽”的图同时可以作为“未戴帽”判定的负样本。三是灵活性好如果后续新增了“红色安全帽专属区域”这种分级规则不需要重新训练模型只需要改规则。2.3 标注规范的实操细节标注这种密集小目标场景至少要遵循几条硬性规范。边界框要贴合目标轮廓不要求像素级分割精度但Person框要完整包含整个人体不能把框截断到小腿或肩膀helmet框要框住帽体本身不要把额头和头发框进来。遮挡目标的处理原则是可见面积超过30%就标低于30%放弃跨画面边缘的目标进入画面部分超过50%才标。模糊目标单独归一类在训练时作为“忽略”样本不参与损失计算。这里我提示一下不要忽略高分辨率原图的价值。摄像头原图往往分辨率较高直接用原图标注训练时再随机裁剪缩放等于免费做了数据增强模型对小目标的鲁棒性会好很多。如果先缩放到640x640再标注小目标基本就丢没了。标注工具个人推荐用开源的CVAT或者LabelImg都支持多人协作。标注完成后一定要做抽检抽检率不低于10%我吃过这个亏——标注员对“反光衣反光条算不算衣身一部分”理解不统一结果同类目标框的位置偏差很大模型训练出来边界框回归一直不稳后来把标注规范重新明确并返工了一轮指标立刻上来了。2.4 数据增强策略与难例补充YOLO26训练阶段建议开启Mosaic增强、随机透视变换、HSV色域扰动、随机水平翻转。其中Mosaic把四张图拼成一张训练能显著提升小目标的检测效果原因是拼接后每张子图在训练时仍然保留原始分辨率目标相对特征图是变大而不是变小。但要分类设置翻转选项。反光衣、安全帽这类对称目标可以开水平翻转但是含有文字或方向性特征的目标比如背部印字的工服翻转后语义会变化不建议对所有类别统一开启翻转。这类细节往往决定模型在真实场景下的泛化水平。难例补充是拉开项目上限的关键。针对性收集三类图一是小目标图人离摄像头远像素占比低于1%的图二是遮挡图人员交错、货架遮挡的图三是极端光照图逆光、夜间红外补光的图。这三类图如果占比太低模型在真实场景里就会暴露短板。3. 模型训练与调参把YOLO26训到能用的关键操作3.1 输入分辨率与推理代价的平衡工厂小目标检测场景输入分辨率不能只看常规的640x640建议从以下方案里选。场景输入分辨率说明近景/枪机640x640目标像素大足够中景/全景1280x1280兼顾小目标与速度广角俯拍1536x1536或切片推理目标极小需更高分辨率我做过一个俯拍广角车间的项目摄像头高度八米覆盖面积约八百平米一个站立工人的像素高度只有40到60像素。初版用640输入的时候安全帽的召回率只有六成左右肉眼可见地漏检。把输入分辨率提到1280之后召回率直接跳到八成多但推理耗时也几乎翻倍。如果GPU压力大还有一个偏方训练时用1280推理时用原始的较大尺寸原图用TTA测试时增强多尺度投票精度还能再涨一点但代价是帧率进一步下降。最终怎么取舍取决于现场算力和摄像头数量。多数工厂场景要跑十几路甚至几十路流每路至少要保证5到10帧每秒低于这个帧率人员移动快时跟踪会断行为判定就不靠谱了。3.2 训练策略从预训练到全层微调工厂现场数据量通常不足以从头训练一个大网络正确做法是在预训练权重基础上微调。我个人习惯分三步走。第一步冻结主干Backbone只训练检测头学习率设低一些比如1e-4跑几个epoch让检测头适应新类别的输出分布。第二步解冻主干的后半部分全模型一起训练学习率降到5e-5量级。第三步用Cosine退火策略逐步降低学习率加入EMA指数移动平均平滑权重能稳住后期训练波动。训练轮次不必太多。基于预训练权重的微调通常30到50个epoch就会收敛。我遇到很多新手一上来就是100个epoch模型看起来loss低了实际上过拟合到训练集的光照和场景上了换一路摄像头就拉胯。判断是否过拟合关键看验证集和训练集的loss差距以及现场新场景的实测效果。3.3 损失函数与类别不均衡的应对工厂违规检测里有个天然问题类别数量严重不平衡。person类到处都是helmet类也不少但phone、smk类样例很少翻越行为更是凤毛麟角。模型天然会偏向高频类别低频类别几乎学不到。应对手段有三板斧。第一板斧是类别权重给低频类别设更高的loss权重一般把phone和smk的权重设为person的2到3倍。第二板斧是Focal Loss让模型把注意力放在难分类的样本上抑制那些本身容易判对的大样本地带对密集小目标场景特别有效。第三板斧是最朴实的尽量扩充低频类别的数据。模型看过越少的类别权重再高也是巧妇难为无米之炊。还有一个容易被忽略的细节背景负样本。工厂车间里有大量反光材料、机器金属光泽、来往叉车这些都可能被模型误判成反光衣或安全帽。解决思路是训练时做“难负样本挖掘”——专门从误报多的监控片段里抽帧把它们作为无目标的背景图混进训练集。这一步对降低误报率的作用经常比调模型结构还明显。3.4 训练后处理NMS与置信度阈值模型推理输出的原始预测框数量众多需要非极大值抑制NMS去掉重叠框。YOLO26这类新版本检测头通常已经内置了NMS但有几个参数需要根据场景单独调。类别间重合严重的场景比如人穿反光衣时person框和vest框高度重叠NMS的IoU阈值如果设太高会把两个类别互相吞掉。建议IoU阈值设在0.5到0.65之间同时开启class-aware的NMS模式让不同类别之间不做抑制只抑制同类框这样反光衣框和安全帽框可以跟person框共存后处理逻辑才能拿到完备的目标信息。置信度阈值我建议分两类设置。一类是低阈值高召回给检测阶段用比如阈值0.25宁可多检一点噪声也要保证漏检少。另一类是高阈值给告警阶段用在时序确认逻辑里筛选阈值可以抬到0.6甚至更高。很多人只调一个全局阈值结果想压误报就把安全帽漏检提升了两头难受。4. 行为判定不只是检测跟踪、状态机与告警逻辑4.1 从检测框到“这个人是谁”多目标跟踪的必要性检测模型输出的框是独立的、没有身份信息的。要判断一个人是不是持续未戴帽、是不是翻越了围栏必须先把不同帧里同一个人的框关联起来这就是多目标跟踪MOT。工厂场景我推荐用ByteTrack。它轻量、不需要额外训练、在密集场景下表现稳定更重要的是它对低置信度框的处理策略——传统跟踪器把低置信度框直接扔掉但ByteTrack会利用低分框和遮挡信息做匹配这在人员交错频繁的车间里能大大减少ID跳变。ID跳变是行为判定的头号杀手。一个人走到货架后面被遮挡了两秒跟踪ID变了系统会把它当成“新出现的人”前面累积的“持续未戴帽计时”全部清零违规行为就漏报了。因此跟踪器的参数调优优先级很高匹配IoU阈值不要设太严允许一定程度的漂移优先保证ID稳定宁可偶尔把两个人串成一个人也不要频繁切换ID。4.2 基于几何关系的PPE佩戴判定拿到人框和安全帽框之后怎么判定“人是否戴了安全帽”很多人想得很复杂其实一个几何关系就可以做第一轮判断。先计算人框的头部区域——取人框上部15%到20%的部分作为头部参考区然后判断安全帽框和头部区域的交并比IoU或中心点距离。如果安全帽框中心落在头部区域内且IoU超过阈值判定为“戴帽”如果头部区域内没有helmet框判定为“未戴帽”。反光衣的判断同理把区域换成躯干区域人框中部30%到70%部分与vest框做重叠判断。这个几何判定简单粗暴但对俯拍角度误差较大。俯拍时头盔遮挡关系复杂帽子可能只露出帽檐框很小且偏移大。所以更稳的做法是检测模型直接输出“头部关键点”或“身体关键点”——比如用带姿态估计的YOLO版本或者额外接一个轻量关键点模型拿到头部、肩膀坐标再判断头盔与头部中心的空间关系。工程上如果不想引入额外模型我建议至少结合两帧的位置进行时序确认不要单帧拍板。4.3 区域闯入判定点与多边形的数学区域闯入检测本质上是一个几何查询目标点是否落在电子围栏多边形内部。实现上不用复杂模型射线法就够了——从目标点向右水平发一条射线计算它与多边形各边的交点数相交次数为奇数则点在多边形内偶数为外。或者用凸多边形的向量叉积法计算点与每条边的位置关系。工程上真正的难点不是数学而是坐标系的转换。摄像头的画面是2D像素坐标但工厂的围栏区域定义在3D车间平面图上直接把二维多边形画在画面上会随摄像头角度变化而产生偏差。主流做法是在画面上用标定工具人工绘制多边形ROI把它对应到实际物理区域如果摄像头是PTZ云台变焦摄像机转动后坐标系就变了需要做矫正或直接改用定焦枪机覆盖围栏区域。4.4 行为状态机让系统学会“再确认一次”单帧判定直接触发告警误报率一定高。因为单帧里存在大量偶然因素检测框抖动、目标遮挡、光影变化。解决方案是引入状态机和持续时间确认。我建议把每个跟踪目标设计成一个状态机包含几个状态观测中、确认违规、告警冷却、解除。每个违规类型有独立的确认帧数参数。比如未戴帽检测连续5帧都判定为“未戴帽”才进入确认违规状态防止单帧误判翻越动作跨度大确认帧数可以设置得高一些等轨迹明显跨越围栏线再告警。告警之后进入冷却期比如同一目标触发告警后2分钟内不再重复告警避免一个人持续不戴帽时系统疯狂弹警报。冷却期结束后如果仍处于违规状态再次告警。这一套状态机逻辑不复杂就是纯工程经验的累积但它决定了系统最后给人的观感是“靠谱”还是“狼来了”。4.5 告警信息沉淀截图、片段与结构化记录告警不只是弹个通知还要把证据链留下来。我在每个告警触发时会保存三样东西触发瞬间的高清截图、前后各5秒的视频片段、以及一帧结构化JSON数据内容包括目标ID、违规类型、置信度、跟踪轨迹点、摄像头编号、时间戳。这些沉淀下来的数据有几个用途。第一用于人工复核安全员可以在管理后台快速回看告警片段确认是否误报。第二用于数据回流确认是真正违规的片段可以直接加入训练集形成“以战养战”的迭代闭环确认是误报的片段则加入难负样本集下一轮训练专门压制它。5. 部署落地精度、速度与误报率的三角博弈5.1 模型导出与推理引擎选择训练好的PyTorch权重不能直接上生产一般先导出成ONNX再转成目标推理引擎的格式。工厂场景以GPU服务器和小型边缘盒子为主。Intel/AMD的CPU推理可以试OpenVINONVIDIA的GPU建议直接用TensorRT比原生PyTorch推理快两三倍没问题。转TensorRT时有几个坑。第一是算子兼容性YOLO26如果用了不常见的自定义算子转换可能失败或部分算子fallback到速度奇慢的实现遇到这种情况优先调整模型实现方式或开启ONNX简化。第二是动态尺寸建议导出时固定输入尺寸比如1280开启动态推理会引入性能损耗对多数固定摄像头场景没有必要。第三是校准数据INT8量化需要准备校准集校准集要覆盖现场的光照分布和典型目标布局我见过用通用数据集校准的模型部署后漏检率明显上升。5.2 帧率、抽帧策略与多路流管理工厂监控摄像头数量通常几十路上百路算力永远是紧张的。不可能每路流都用最大分辨率满帧率跑模型推理必须做资源规划。我的经验是分层策略。对重点高风险区域配电房、危化品区、翻越点分配全分辨率全帧率推理对一般生产区优先保证分辨率帧率可以降到每秒2到5帧——因为PPE佩戴这类状态是慢变化的人员不会一秒内摘戴交替低频抽帧对这类判定几乎没有影响对停车场、通道这类弱风险区甚至可以只在关键帧触发运动检测后才跑推理。RTSP流拉起来有个常见坑摄像头并发连接数有限。直接给推理程序开几十路RTSP同时拉流经常会遇到连接被摄像头拒绝的情况。合理做法是拉流层做个代理缓冲统一拉流推给内部队列推流服务再把帧分发给推理引擎减少与摄像头直接的连接数。5.3 误报率治理的持续闭环部署上线不是项目终点而是误报率治理的开始。我经手的项目里算法团队花在“上线上线之后跟误报搏斗”的时间丝毫不比训练模型少。最简单的治理手段是给每一类告警加“审核标签”——算法触发、人工复核结果属实/误报、误报原因分类天气/反光/遮挡/设备异常。每周拉一次周报统计哪些误报占比最高针对性修复。如果反光衣误报集中在逆光时段就补充逆光数据或者在后处理里加上时段抑制规则如果安全帽漏检集中在某个特定工位就检查那路摄像头是不是角度太偏、需要调整位置。这里我还想分享一个心得别迷信模型也别迷信规则把模型输出和规则逻辑放在同一个可配置的引擎里。现场需求的迭代速度非常快今天说要加一个“指定区域限高”规则明天说要对红色安全帽单独统计如果每次都改代码重新发版运维会被拖垮。把规则模块做成热配置安全员自己在界面上拖拽电子围栏、调阈值、开关行为类型算法团队只需要维护核心模型的更新周期。5.4 新场景迁移快速适配的套路工厂项目通常不是单点部署做完一个车间大概率要复制到另一个车间、另一个工厂。设备型号变了、车间光照变了、工人服装颜色变了新场景下模型性能掉一截是很正常的。快速适配有一套固定流程先在目标厂房部署旧模型跑一周收集全部检测结果和告警记录人工标出误报和漏报难例然后混入原训练集微调10到20个epoch再灰度上线只对重点区域生效对比新旧模型表现确认稳定后全量切换。整个周期通常控制在一到两周成本很低但能保证模型在“每个现场都是定制版”的前提下持续演进。6. 算力规划、运维挂图与常见问题速查6.1 算力测算的粗模型这里提供一个粗糙但实用的算力估算方法。单路1080P摄像头数据若输入分辨率1280、推理帧率5fps单路推理大约需要多少算力呢一张中端工业显卡的实际吞吐跑这类模型大约能支撑10到20路。边缘盒子的算力更紧张通常只能用640输入、2到3帧每秒适合低风险区低速抽帧。设备类型推理分辨率可用帧率可支撑路数估中端服务器GPU12805-10 fps10-20路边缘AI盒子6403-5 fps4-8路旧CPU服务器6401-2 fps不宜部署我建议在项目预算阶段就按这个量级做评估别被厂商“一卡支持百路”的宣传语忽悠那些数字通常是用极低分辨率加极低帧率加空场景测出来的实际还要留30%冗余给告警逻辑和存储。6.2 运维人员需要知道的三件事工厂的IT运维通常不是专业AI工程师系统交付时一定要把运维边界画清楚。我给客户整理过一个简易运维手册核心内容就三条第一摄像头角度被碰、画面被遮挡时算法准确度会大幅下降需要定期巡检画面第二告警大面积伴随画面偏色、模糊出现时是画质问题不是算法问题先去检查摄像头第三模型更新是周期性动作不是上线后一劳永逸。6.3 常见问题与处理路径速查表现象优先排查项处理方向安全帽漏检多目标是否太小提高输入分辨率或切片推理反光衣误报多反光、逆光干扰补充难负样本、调高阈值告警重复轰炸状态机冷却时间调长冷却期、增加确认帧数跟踪ID频繁切换遮挡、帧率低降低抽帧间隔或调跟踪匹配参数夜间效果差红外补光画质补充夜间数据或启用红外增强某路流延迟严重拉流连接数超限引入流代理统一拉流这个表写进项目文档能少接一半的运维求助电话。6.4 部署验收的正确姿势系统部署完成后验收是个技术活。我建议分三层做验收第一层是算法指标在留出的验证集上跑mAP和召回率但注意验证集必须包括现场采集的难例第二层是业务指标连续运行一周统计每天的检测总数、告警总数、人工复核误报数算出系统级误报率和漏报率第三层是稳定性指标连续运行72小时不宕机、不出现显存泄漏、不出现推理队列堆积。以我的经验看算法指标的漂亮程度和现场业务的可用程度经常是两回事——验证集mAP再高也抵不住现场一路摄像头逆光、一路摄像头被喷雾遮挡带来的误报。所以验收这一天最应该盯的是业务指标和稳定性指标而不是那张测试集报告。写在最后做这个项目之后我最大的几点体会这个方法跑通之后我心里最大的感受是这类工厂违规检测项目真正难的不是训练出一个高精度模型而是把模型放到一个嘈杂、动态、多变的真实生产环境里还能持续稳定输出。模型迭代是手段业务逻辑的稳定性、数据处理闭环、现场运维的分工这些才是项目能不能长期活下来的关键。最后再分享一个小技巧做这类项目时一定要把“检测结果可视化”做得认真。内侧的项目里我在调试界面里把每个人的ID、安全帽判定框、电子围栏、状态机状态全部可视化叠加在画面上让现场安全员一眼能看懂系统“在想什么”。这套可视化调试工具带来的收益远超预期——安全员能快速指出规则哪里不合理模型漏检在哪个位置我们根据反馈调整的每一次改动都比在电脑前盲调参数有效得多。这个项目做完后我甚至觉得任何视觉检测类系统都值得先把可视化调试做好再做正式产品。