工地安全监测这个事,做久了你会发现,真正难的不是摄像头不够多,而是摄像头拍回来的画面没人看得过来。我这几年一直泡在智慧工地和智慧城市安监环保项目里,从最开始的周界入侵、安全帽佩戴检测,到后来的场地烟雾明火报警、裸土未覆盖识别、土堆与水坑识别,算法模型换了一茬又一茬,踩过的坑比写过的代码还多。这期(系列第10347期)正好做个系统性梳理:建筑施工安全监测识别里的烟雾明火报警到底怎么做,裸土未覆盖图像识别的判定逻辑是什么,工地土堆和水坑又该怎么识别,以及从算法到真正落地部署中间那些文档里查不到的工程细节。如果你正在做智慧工地、智慧城市的安监环保类项目,或者打算给自己的工地监控加一层AI识别,这篇应该能帮你少走不少弯路。
1. 先搞清楚这套监测系统真正要防的是什么
1.1 从"人盯屏幕"到"算法盯现场":视觉识别为什么会成为工地标配
工地的安全监控早就不缺摄像头了,球机、枪机密密麻麻装了一圈。可问题在于,一个安全员面对十几路甚至几十路画面,注意力撑不过二十分钟,工地又是全天候动态变化的场所——白天有焊接动火,夜间可能有违规施工,雨天有基坑积水,大风天有扬尘裸土。靠人眼在这堆画面里盯出"初期烟雾"这种小概率事件,基本靠运气。
所以智慧工地的监测逻辑从"人盯屏"转向了"算法盯现场":摄像头继续负责采集,后端挂一套识别系统,先把画面里可疑的东西筛出来,再推给值班人员确认。这也正是视觉识别在这类项目里成为标配的原因——它不需要额外增加大量硬件,工地原有的监控网络可以直接复用,成本增量主要来自算法和算力。另外一个关键点是施工安全监测对"早期发现"的要求极高,烟雾刚刚出现的那一两分钟,往往就是扑救的黄金窗口,而人眼很难做到全天候盯住这个窗口。
1.2 四个识别对象背后的四类风险:明火、扬尘、堆载、积水
这个项目覆盖的四个对象不是拍脑袋定的,它们分别对应工地现场最典型的四类隐患:
- 场地烟雾与明火:直接对应火灾风险。电气焊作业、防水卷材热熔、木料堆放区、临时用电线路老化,都可能引发火情。烟雾和明火识别要解决的核心问题是"早",在火焰蔓延之前给出报警。
- 裸土未覆盖:对应的是环境保护监测里的扬尘问题。土方开挖、场地平整后裸露的土体,在大风天就是扬尘源,环保测评对此有明确要求——裸土必须用防尘网苫盖、植被覆盖或硬化处理。图像识别的任务就是自动判断"这块地到底盖没盖住"。
- 工地土堆:既是扬尘源,也是安全隐患。落地土方若堆放在基坑边缘、限制区域,可能造成堆载超限;土堆本身若未苫盖,又会反复产生扬尘。识别土堆的目的,一个是环保苫盖管理,一个是堆载和临边安全。
- 水坑与积水:工地上的积水坑是一个容易被忽略的隐性杀手。人员跌入、临时电缆漏电、基坑浸泡软化,都和积水有关。加上雨后泥泞道路影响运输安全,水坑识别本质上是在做"环境安全+作业安全"的双重监测。
这四个对象有一个共同特点:它们都是"高频存在但人眼容易脱敏"的目标。裸土天天在那摆着,看惯了就不当回事;水坑晴天干了、雨天又出现,反反复复;烟雾初期又轻又淡,离远了根本看不见。这恰恰是算法最擅长补位的地方——机器不会因为"看过太多次"而麻木。
1.3 "检出"和"确认"分开:整个系统设计的第一原则
在讲具体算法之前,我想先说一条贯穿整个项目的设计原则:检出是模型的事,确认是规则的事。
我见过不止一个项目,团队把全部精力花在提高模型准确率上,结果模型再好,推给安全员的告警里还是一堆误报。为什么?因为工地场景太杂了——电焊火花长得像明火,冬季水汽像烟雾,雨后蓝塑料布像水坑,夕阳直射能把整块屏幕烧成橙红色。单靠一个神经网络不可能把这些全部分清楚。
所以我在本项目里把链路拆成两层:第一层是检测/分割模型,负责从画面里找"疑似目标";第二层是规则引擎,负责从时间和空间维度上做二次确认——目标是否持续存在、面积是否达到阈值、是否落在豁免区域(比如有动火审批的焊接作业区)、是否和天气环境吻合。只有两层都通过,才真正推一条告警。后面讲烟雾明火、裸土、土堆水坑的具体实现时,你会反复看到这条原则的影子。
2. 烟雾与明火识别:难点不在"认出来",而在"别乱报"
2.1 为什么拆成两路模型,而不是一个模型通吃
很多人一开始会问:烟雾和明火都是火灾相关目标,为什么不训练一个多类别检测模型一把梭?我试过,效果并不理想。原因是这两类目标在视觉特征上几乎是两个极端:
- 明火是一个紧凑的高亮目标,颜色从内焰的蓝白色到外焰的橙色渐变,边缘锐利,而且火焰有规律的闪烁——频率集中在1到10赫兹之间,亮度随时间呈明显的周期性起伏。
- 烟雾则是典型的半透明目标,没有固定形状,轮廓模糊,灰度接近背景,靠颜色很难和灰墙、雾气、扬尘区分,唯一的显著特征是它整体往上飘、而且面积会慢慢扩大。
把这两类目标塞进同一个模型,模型内部的表征会被拉扯得很厉害。我的做法是拆成两路轻量级检测模型,一路专看明火,一路专看烟雾,各自配一套独立的验证逻辑。好处是调参互不干扰,明火那边误报多了,只动明火这条链路的规则,不会把烟雾那边也误伤。算力上也不用担心,两路模型都很小,在一个边缘算力盒子上并行跑毫无压力。
2.2 明火识别的三重确认:颜色、闪烁、持续性
明火检测模型输出的候选框,我只当作"疑似",真正拍板的是后面的三重确认:
第一重是颜色特征。火焰在HSV颜色空间里有比较稳定的分布区间——核心区域是高亮白黄色,外焰偏向橙红色。模型框出来的区域如果整体色相偏离这个区间,直接滤掉。
第二重是闪烁特征。这是明火最有辨识度的地方。我统计候选区域内连续30帧的亮度均值,计算方差和正负跳变次数,跳变超过6次才认为是疑似火焰。这里有个细节容易被忽略:火焰闪烁频率最高能到10赫兹左右,如果摄像头的分析帧率只有10帧每秒,采样率不够,闪烁信息会被混叠掉。所以涉及明火识别的摄像头,我一般要求分析帧率不低于20帧每秒,或者至少用30帧以上的滑动窗口做统计,否则火焰和普通高亮灯光根本区分不开。
第三重是持续性。火焰不会一闪就灭,候选目标必须连续出现不少于10帧,且面积占整幅画面的比例超过0.5%,才允许进入告警流程。
这套三重确认跑下来,最常见的误报源是电焊火花。焊花的颜色和闪烁都像明火,但它的特点是位置固定、面积小、随着焊工停手就消失。解决办法是在系统里维护一张"动火作业区域表"——由工地安全员把当天有焊接审批的作业区和时间段录入系统。落在作业区内的明火候选,把置信度阈值从0.45提到0.75,并要求在焊接工单结束之后仍然持续出现才告警。这样既不会漏掉真正的电焊引燃(火花落在可燃物上会蔓延),也不会让安全员被焊花反复骚扰。
2.3 烟雾识别为什么更难:半透明目标让检测器天然吃亏
烟雾识别的难度比明火高一个量级。检测模型框一个半透明目标时,边界是模糊的,框的位置和大小在帧与帧之间会剧烈抖动,直接拿检测框做跟踪会得到一堆不稳定结果。
我踩过一轮坑之后的稳定做法是:检测模型只负责输出烟雾候选区域,后续接一个专门的验证链路。第一步先做背景建模——因为大部分工地摄像头是固定点位的,可以用高斯混合模型维护一个背景,把那些突然出现的、和背景差异明显的区域抠出来。第二步看运动方向,用光流估计候选区域整体的运动方向,烟雾的移动方向基本是向上的。第三步是纹理验证,烟雾内部是模糊均匀的,我用一个轻量级分类器判断候选区域是不是"烟状纹理",这一步能把水蒸气、雾、扬尘这类目标挡掉大半。第四步看增长,烟雾面积会随时间缓慢扩大,连续20帧内面积增长率超过设定值才算数。
这里有一个很实际的教训:冬季施工时,工人宿舍的排气筒、食堂油烟、水泥罐车排气,全都长得像烟雾。光靠模型,误报率能到吓人的程度。我的处理方式是在配置里维护豁免区域掩码——食堂、锅炉房这类固定热源点,直接降低灵敏度或者完全屏蔽;动火作业区内的焊接烟尘,则复用上面说的动火作业时间窗逻辑,只在工单结束后残留烟雾才判定异常。
下面是一个脱敏后的规则配置片段,供参考:
{ "flame_detect": { "model_conf": 0.45, "min_area_ratio": 0.005, "flicker_min_switches": 6, "persist_frames": 10, "cooldown_seconds": 900 }, "smoke_detect": { "model_conf": 0.35, "min_area_ratio": 0.008, "rise_direction_weight": 0.6, "growth_rate": 0.2, "persist_frames": 20, "special_zones": [ { "name": "welding_zone_A", "mode": "relaxed" }, { "name": "canteen_stack", "mode": "muted" } ] } }注意cooldown_seconds这个字段,我统一设置成900秒。同一片区域确认一次火情之后,15分钟内不再重复告警,这是防止告警风暴的关键——真着火了不是一个点,而是一大片区域若干摄像头同时报警,不去重的话值班手机能直接被打爆。
3. 裸土未覆盖识别:环保测评倒逼出来的"一块地皮"判断
3.1 裸土判定的标准与图像特征:不是"看到土"就报警
裸土识别看起来比烟雾明火简单——不就是判断画面里有没有土吗?真做起来完全不是这么回事。环保测评关注的不是"有没有土",而是"土有没有被盖住"。一块堆满建筑垃圾的区域、一片长满杂草的荒地、一条灰扑扑的硬化路,离远了看都和裸土有相似之处。所以我的实现用的是语义分割,而不是单纯的目标检测。
分割模型对每个像素分类,类别包括:裸土、绿网覆盖、植被、硬化地面、其他。第一步先把"地块"这个概念引进来——模型输出的裸土像素不是直接拿来告警的,而是先通过连通域分析聚合成一块块地皮。第二步每块地皮单独计算"覆盖率":这块地皮上,绿网、植被、硬化这三类像素加起来占了多少比例。第三步拿覆盖率跟规则比对,只有裸土占比超过80%、且面积超过设定值的地块,才进入告警候选。
图像特征上,干裸土在HSV色相里集中在10到40度的黄褐色范围,纹理呈颗粒状;绿网覆盖区域是深绿或深灰的规则网格纹理,边缘往往有折痕形成的深色线条;植被是自然杂乱的绿色纹理;硬化地面是低纹理的灰色,而且边界直。这些特征组合起来,分割模型是可以学得不错的,但真正让项目翻车的往往是下面这些边界情况。
3.2 绿网、防尘布、植被与湿土:最容易翻车的几个混淆项
第一对冤家是绿色密目网和草地。两者都是绿色,但密目网有规则的网眼结构,用纹理滤波器一照就露馅——草地纹理是随机杂乱的,密目网有周期性的高频成分。不过下雨之后,密目网被泥水打湿,网格纹理会被糊掉一半,这时候很容易被分到裸土里去。我的做法是在分割模型之外再挂一个轻量级二分类器,专门判断"这个绿色区域是不是苫盖物",即使纹理信号弱了,颜色和形状信息还能兜底。
第二对冤家是湿土和沥青/硬化路面。雨后湿土颜色接近深褐甚至发黑,表面反光强,纹理变均匀,跟沥青路从颜色和纹理上都很难分。如果只靠单帧图像,这条基本上无解。我的办法是加时间维度:白天晴天时同一位置的土通常是干黄色的,如果雨后颜色突变,用一段时间的颜色分布做背景参考,能显著减少错分。
第三类是"盖了一半"的地块。绿网破了、苫盖布被风吹开一角,这在实际工地太常见了。这种地块的覆盖率往往在60%到80%之间,属于模糊地带。我定的规则是未覆盖比例超过20%就算不合格,宁严勿松——苫盖本来就是应急措施,露一块和露全部在环保测评里都叫"未覆盖到位"。
这里还要提醒一句:工地是动态场,正在开挖的基坑、刚翻出来的土方,天然就是裸露的。如果系统这时候报警,迎来的不是感谢而是骂声。所以我在配置里加了施工活动豁免机制——活跃开挖区域的工单生效期间,该地块的裸土告警自动延时4小时再触发。这个机制帮我在项目验收评分里挽回了不少印象分。
3.3 面积估算与持续时长:把"像素告警"变成"地块告警"
分割模型吐出来的是像素,可安全员要的是"哪块地、多大面积、该谁去盖"。像素面积和生产面积之间隔着一个摄像机标定。
我的做法是地面单应性标定:在画面里选一个已知尺寸的参照物——比如硬化路的宽度、围挡的高度或标准活动房的长度——用四个以上的点算出图像坐标到地面坐标的映射,这样像素面积就能换算成平方米。标定误差控制在10%以内就够用了,毕竟裸土告警要的不是精确测量,而是判断"这块地够不够大、需不需要处理"。
持续时长是另一个容易忽略的维度。一块地今天裸着,明天还裸着,它不会因为你的告警就立刻被盖上——苫盖需要调人和物料,动辄半天。如果系统每两小时巡检一次,每发现一次就推一条告警,安全员一天能收到十几条"同一块地"的提醒,很快就麻木了。我的规则是:同一地块连续两个巡检周期(间隔2小时)都判定不合格,才正式生成一条整改工单;后续每4小时复检一次,直到覆盖达标。这样既保证了问题不被遗漏,又把消息频次压到了人可以接受的程度。
另外,裸土告警和扬尘在线数据联动是个好用的增效手段。我在项目里接入了现场的扬尘传感器,如果当下风速低、PM10数值正常,裸土告警自动降级为"提醒",不推给值班人员,只在日报里汇总。反过来,如果风速高、扬尘超标,即便裸土面积刚刚超过阈值,也立刻升级为告警。这一条规则在环保测评期间特别管用,既不会漏掉关键时机,也不会让正常施工被无效告警干扰。
4. 土堆与水坑识别:同一套分割网络,两种完全不同的业务逻辑
4.1 土堆识别不只为环保,更是堆载与临边安全的"眼睛"
说到土堆识别,很多人第一反应是"这不就是裸土识别再加个高度判断吗"。有一定道理,但土堆识别的业务价值远不止苫盖管理。
真正让业主方重视土堆识别的,是堆载安全和临边风险。工地上落地土方如果堆在基坑边坡附近,会增加边坡荷载,雨天可能引发滑移;堆在电缆沟、管线带上,可能压坏地下设施;堆在消防通道上,影响应急通行。所以系统里的土堆识别,核心任务是两件事:第一,检出画面里的土堆目标;第二,判断它和"禁区"(基坑边缘、管线区域、通道)的关系。
视觉上怎么区分"一堆土"和"一块裸土平地"?关键看形态。土堆有凸起的轮廓,侧面有由光照形成的渐变阴影带,边缘处有地平面到堆顶的高度落差。我用的分割模型先产出土体掩码,然后对掩码做形态学分析——计算凸度和圆形度。平铺的裸土掩码是扁平的大块不规则形状,土堆则更像一个紧凑的凸起团块。再用阴影带辅助判断:土堆的背光侧一定有一条稳定的阴影渐变区,这是平面裸土不具备的。
土堆和禁区的位置关系,用像素级IoU就能算。但更实用的是先把禁区在地面标定好的坐标系里画出来(多边形),然后算土堆掩码边缘到禁区边界的最近距离。阈值取多少要看现场安全交底的实测值,我一般按基坑安全距离规范要求来设,比如临边3米范围内不允许堆载,那距离小于3米就触发告警。
4.2 水坑识别的难点:反光、倒影、低纹理,分割模型最容易在这里翻车
水坑识别是我在这个项目里调得最久的一个模块。水的视觉表现有两个极端:要么是晴空或灯光反射下的高亮区域,亮到刺眼;要么是阴影里暗沉沉的一块均匀暗面。共同点是内部纹理极低——水面几乎是整幅画面里梯度变化最平缓的区域之一。
所以我的分割逻辑不是单纯找"蓝色",而是组合三个线索:内部纹理均匀度(局部梯度方差极低)、边缘不规则的边界带(水坑边缘往往贴着泥泞土坎)、以及颜色上的灰蓝偏色。雨后的工地,水坑通常呈现出天空的倒影色,而不是你以为的"水的颜色"。
但真正折磨人的是那些长得像水的东西。蓝色防尘布被雨水打湿后,远看就是一块高亮的平滑区域;黑色沥青路面的反光、油渍、塔吊阴影在地面上的投影,都可能通过低纹理检验。我踩得最狠的一次,雨后一上午系统推了47条水坑告警,值班安全员电话直接被打到关机。后来总结出三条教训:
第一,加时间一致性校验。水坑不是瞬间出现的,它的形成和消退有一个过程,单帧检出不能算数,连续多帧稳定存在才能确认。第二,加天气联动。连续24小时无降雨时,所有"疑似水坑"自动降级,默认是反光或深色地物,只存疑不告警;一旦有降雨记录,水坑告警恢复正常级别。第三,区域去重冷却。同一片区域15分钟内只保留一条告警,事件合并处理。
这三条加完,水坑告警的日推送量从几十条降到了个位数,而且真正有价值的基坑积水告警一条都没漏。
4.3 单目视觉的局限与实测妥协:我们不做水位计,但能做好"有没有水"
必须承认,单目摄像头在水坑这个场景上是有物理极限的——它测不了水深,也测不准水底情况。一个看似普通的小水坑,可能泥底下是松软的流沙,也可能是断掉的钢筋头。摄像头能告诉你的是"这里有水""面积多大""大概在什么位置",但"水有多深""水下有什么"它管不了。
我的处理方式是做分层告警:摄像头负责广度覆盖,发现积水区域、估算面积;关键部位——比如基坑底部、配电箱周边、地下车库入口——再补装超声波液位计或投入式水位计做精确测量。摄像头的定位是"第一道预警网",把地面巡检人员可能漏掉的小面积积水先找出来,再由人带着测量工具到现场做定论。这个取舍在方案评审时也被专家认可了,因为工地上的积水风险,绝大多数时候"过深的水"和"不该有水的地方出现了水"是两码事,后者恰恰是视觉识别的主场。
说到面积估算,水坑和裸土一样要用到地面标定。但水坑的边缘不像裸土那样清晰,蒸发收缩、风吹涟漪、倒影错位都会让掩码边缘抖动。所以我给水坑的面积计算加了一个中值滤波——取连续5帧的掩码面积做中值,代替单帧结果,稳定性好很多。
5. 部署链路:从算法原型到能7×24跑的边缘节点
5.1 摄像头选型与点位:不是分辨率越高越好,而是"角度对"才好
很多人把识别效果不好归咎于分辨率不够,一上来就上800万像素。以我的经验,对这个场景来说,400万像素足够,真正决定成败的是安装角度。
不同检测对象对视角的要求是矛盾的。烟雾和明火需要斜视视角——能同时看到火焰本身和烟雾升腾的轨迹,最好还能看到火源周围的可燃物;裸土覆盖需要俯瞰大场景——塔吊顶部或者高位立杆上往下看,一块场地的苫盖情况一目了然;土堆识别则需要侧视,侧光才能看到堆体的阴影和轮廓高度。一个摄像头不可能同时满足所有视角,所以点位设计上我做的是"双角度覆盖":高处全景俯瞰管裸土和土堆,近地斜视管烟雾明火和水坑,中间用视野重叠区域做交叉验证。
选型上还有几个容易被忽视的点。一是要带强光抑制和宽动态。逆光环境下,太阳直射会让画面里出现大面积的过曝区,宽动态做得好不好直接决定明火识别的稳定性。二是要支持手动关闭降噪或可调降噪强度。运动估计降噪会把烟雾这种低对比缓慢运动的区域整个抹平,反而降低检出率。三是协议支持ONVIF/GB28181,方便接入第三方平台和取流。
供电和网络也得提前规划。塔吊顶部的摄像头要走光纤或高质量无线网桥回传,还要考虑防雷;临建板房区域的摄像头可以走PoE,但要注意PoE交换机的功率预算;偏远区域如果布线困难,太阳能供电加4G/5G回传也能顶一阵子。这些工程约束如果等算法调完了再回头补,返工成本非常高。
5.2 边缘算力分配:一个盒子拖4路1080p,量化与裁剪怎么平衡
算法原型可以在服务器上随便跑,但商业化落地基本都要求边缘部署——工地不能指望拉一柜子GPU服务器,也不可能把上百路视频全传回云端做实时分析。我们用边缘AI盒子,NPU方案,把它挂在工地监控机房,就地解码、就地推理、只把事件和截图传出去。
算力规划上我按下面的表格做前期评估,具体数字会因平台而异,但思路可以复用:
| 任务 | 建议模型结构 | INT8推理耗时参考 | 分析频率 |
|---|---|---|---|
| 烟雾/明火检测 | 轻量级目标检测模型 | 每帧10-20ms | 每路每2秒一帧 |
| 裸土/土堆分割 | 轻量级语义分割模型 | 每帧15-25ms | 每路每5秒一帧 |
| 水坑分割 | 轻量级语义分割模型 | 每帧15-25ms | 每路每5秒一帧 |
一个中等规格的NPU盒子,解码4路1080p、10fps视频流,同时跑上面三套任务,负载能做到六成到七成,还有余量应对突发。这里的关键技巧是帧调度——不需要每路视频每一帧都跑全部模型,烟雾明火是安全性最高的事件,频率给高一点;裸土和水坑变化慢,巡检频率给低一点。这样把算力花在刀刃上。
模型量化一定要上INT8。我的经验是,YOLO这类检测模型从FP16压到INT8,mAP损失控制在1到2个点以内,推理速度却能翻两倍以上。边缘侧的模型部署我统一走ONNX导出、量化、转NPU格式这条链路,中间遇到过几次算子不兼容的问题,解决方式很朴素——换掉那几个不支持的算子结构重新导出,避开复杂模块比硬啃算子支持列表省时间。
5.3 告警闭环:从"屏幕上弹一条消息"到"整改完才销号"
告警识别算法只是整个系统的前半截,后半截是告警闭环。我把事件处理拆成五个状态:疑似确认、推送、签到、整改、复检销号。
模型加规则双重确认后,事件进入"待推送"状态,附带截图和一段10秒的短视频证据。推送渠道我做了分级:一般事件推给值班安全员;明火、烟雾这类高危急事件,除了推给安全员,还要同步给项目负责人,并且如果2分钟内没人确认,自动电话语音播报。然后是现场处置——责任班组接单、到场处理、拍整改后照片回传。最后系统自动复检,确认画面里已经看不到目标,工单才能销号。整个流程在智慧工地平台上可查可追溯,业主方巡检时最看重这个,因为闭环数据比模型准确率更能说明系统真的在起作用。
对外对接也要提前想好。视频流走GB28181推到监管平台,事件数据用Webhook推给现有智慧工地管理平台,数据表结构固定成一张标准事件表——时间、点位、摄像头ID、告警类型、置信度、截图路径、处理状态、责任人。原始录像本地保存7天,告警事件和截图至少保存90天,这是追溯和纠纷处理的基本盘。
6. 实测三个月踩过的坑:比算法本身更值得记住的案例
6.1 夕阳把摄像头晒成"一团火":阳光直射导致的过曝误报
项目上线第二周,某工地西侧围墙上的枪机每天傍晚六点左右准时报明火,调出截图一看,画面里大半块屏幕都是橙红色的——低角度夕阳直射镜头,传感器被晒到饱和,颜色特征和明火完美重合。
第一轮修复是物理层面的:加遮光罩、调整云台朝向,避开正对东西方向低角度的阳光。第二轮是算法层面的:加了一条前置规则,当画面里高光饱和区域占比超过30%时,不进明火判定流程。更关键的是闪烁校验发挥了作用——过曝区域的亮度是稳定的,方差极低,根本不满足闪烁跳变条件,即使第一层颜色检测命中了,第二层也把它拦住了。从那以后,每加一个点位,我都会先确认它一天里会不会被阳光直射,这个验收项直接写进了点位核查清单。
6.2 焊花被当成火灾,又要"管住火"又"不打扰干活"
结构施工阶段是明火误报的高发期。塔吊顶俯拍下来,整个作业面上到处是电焊火花,系统一天能报几十条"疑似火情",安全员从紧张到麻木只用了一个星期。
我们最终靠的是2.2节说的动火作业区域表。焊工的作业时间和区域提前录入系统,作业区内的明火置信度阈值抬高,同时增加一条"工单外持续出现"的兜底规则——只要火花在作业区外出现,或者作业工单结束后依然存在,就照常告警。这套规则上线后,明火误报降了80%左右,而真正危险的情况反而抓得更准了:有一回焊花落在作业区边缘的模板堆里,引燃了木料,因为位置在作业区边界、且持续存在,系统照实报警,值班安全员5分钟到场处理,那次事故被及时按住了。这是整个项目里我觉得最有价值的一次报警。
6.3 雨后"假水坑"刷屏:蓝塑料布、黑色沥青和天空倒影
前面提过一上午47条水坑告警的案例,这里再展开说说根因。雨后的工地,蓝色防尘布被淋湿后变成高亮平滑的大块区域,低纹理特征非常接近水面;黑色沥青路上的天空倒影更是和水坑几乎一模一样;塔吊长臂的阴影在地面上形成暗色条带,和水坑的暗色形态重合。单靠分割模型,这些全都会被框成"疑似水坑"。
我的修复分三层:第一层加纹理均匀度加边缘不规则度的双重校验;第二层加时间一致性,连续多帧稳定存在才算;第三层是我认为最管用的——天气联动。查一下最近24小时有没有有效降雨,没有的话所有水坑告警降级为疑似,只在日报里出现;有降雨记录才按正常告警推。再配合区域冷却去重,误报直接就压下来了。这套逻辑跑了一个雨季,水坑告警的准确率从不到30%提到了70%以上。
6.4 昼夜切换导致模型"失明":彩转黑之后特征全变了
这个坑我一开始完全没想到。某天晚上项目方反馈:夜里电焊违规作业,系统一点反应都没有。查了日志才发现,摄像头在晚上8点自动从彩色切换成黑白画面,而我们的模型训练数据几乎全是白天彩色图。红橙色的火焰在黑白画面里变成了灰白色块,黄褐色的裸土变成了深灰色,模型输出的置信度全线掉到0.2以下——算法相当于瞎了。
修复方案是双模型策略:白天跑彩色模型,晚上单独跑一个用夜间图像训练的灰度模型。这里有个小技巧,推理前把输入图像统一转灰度再喂夜间模型,比直接用彩转黑后的压缩画面效果好,因为模型只学亮度特征,不会被颜色通道的异常值干扰。硬件层面,预算允许的点位直接换全彩夜视摄像头,用补光灯保持彩色画面,彩色模型就能全天候工作。从那之后,我把"夜间模式识别效果验证"列进了每个项目的必测项,不管摄像头有没有夜视功能都要过一遍。
跑到现在,这套系统给我的最深体会是:大家聚在一起聊项目,总爱比模型的mAP谁更高,可真到工地现场,决定口碑的是有效告警率——推给安全员的一百条消息里,有多少条是真正需要起身去处理的问题。裸土没盖、土堆超限、水坑挡道、冒烟起火了,这些事每一条都实实在在,但每一条误报也都在消耗安全员的信任。把误报压下去,比把模型精度再往上抠零点几个点重要得多。安全员被"狼来了"骗过三次之后,再关键的告警也会被无视。我后续打算把渣土车出场冲洗识别、临边防护破损识别也加进这套体系,等跑一段时间再回来聊聊。