在火焰和烟雾识别这行里有一条不成文的共识能做火焰识别的团队一抓一大把能把烟雾识别做好的没几家。火焰再怎么说有颜色、有形状、有闪烁频率好歹是个物体烟雾呢没有固定形状、没有固定颜色、边界模糊、半透明、还会随风飘散你在图像里看到的烟雾区域像素值其实是背景被烟雾散射后的结果不是烟雾本身。这就带来了第一个麻烦你怎么定义烟雾区域如果让标注员在画面上框出烟的范围你会发现不同标注员给出的边界差异极大甚至同一个标注员隔一天再标同一张图框都能差出几十个像素。因为烟雾的边界是渐变的没有一个清晰的像素级分界线你让标注员凭感觉画那标注噪声能大到让模型怀疑人生。烟雾的第二个特征难题是颜色极其不靠谱。浓烟是黑色的因为碳颗粒吸收了所有可见光水蒸气为主的烟是白色的因为水滴散射了所有波长化工品燃烧产生的烟可能是黄色、蓝色甚至紫色的各种颜色全有。你如果试图用颜色阈值来检测烟雾那就是刻舟求剑——今天黑色烟雾能检到明天换一批材料烧出白色烟雾来你的算法就废了。那用什么纹理和动态特征。烟雾在静止时有一种独特的模糊纹理跟背景的锐利边缘形成鲜明对比。经典的烟雾检测算法2015年前后那一批大量使用LBP纹理描述子和小波变换来捕捉这种模糊性。这些传统特征在计算资源受限的嵌入式设备上至今还有人在用因为它们不需要跑神经网络简单、快速、功耗低。但深度学习时代谁还用LBP啊大家直接用CNN去学烟雾的隐式纹理特征让网络自己发现哪些纹理模式对应烟雾。YOLO、SSD这些检测器同样适用于烟雾检测只不过你需要在烟雾数据集上重新训而且训练的时候得有策略。烟雾检测在训练数据上遇到的最大问题是烟雾的尺度变化极快。刚起火时烟雾可能只有几个像素宽的一条细线几秒钟后就膨胀成覆盖半个画面的浓云。你如果用固定感受野的模型去同时覆盖这两个极端尺度那感受野要么太大漏了小烟要么太小盛不下大烟。所以我们做烟雾检测时通常采用图像金字塔 多尺度滑动窗口的策略——同一帧画面缩放到多个分辨率分别推理再把结果合并。这个方案的算力消耗是单尺度推理的3到5倍但为了兼顾早起烟雾和蔓延后的大烟这个代价得认。烟雾识别的另一个大坑是误报源实在太多了。你想象一下这些场景清晨的湖面水雾在逆光条件下拍到就是一片白茫茫跟火灾烟雾一毛一样工厂烟囱正常排放的水蒸气在寒冷天气里拉出长长的白烟施工现场的粉尘、扬沙在图像里也是半透明的漂浮物汽车的尾气尤其是柴油车起步时那一股黑烟厨房的炒菜油烟家里做饭的时候烟雾探测器经常乱响就是这个原因雨天的雨丝和雨雾跟烟在视觉上的模糊效果极其相似所有这些非火灾烟雾在图像层面的特征跟真正的火灾烟雾高度重叠。你让一个纯视觉模型去区分这是烧木头产生的烟和这是烧柴油产生的尾气那基本是强人所难。两者的颜色、纹理、动态特征在多数情况下没有本质区别。工业界的解决方案通常有两个维度。第一个维度是引入运动轨迹分析。火灾烟雾的扩散模式是有规律的——从一个源头向外辐射状扩散而且通常伴随上升热气流所以烟是向上飘的。而水蒸气或者扬尘可能是整片均匀分布的、没有明显的源头和方向性。你通过光流法或者粒子跟踪算法分析烟雾区域的运动矢量场如果运动模式符合源头发散 上升的规律那么是火灾烟雾的概率就大大增加。这个方案在理论层面很漂亮但在工程实现上有三个难点一是光流算法本身就慢在边缘设备上跑光流是种奢侈二是运动轨迹分析需要连续多帧数据无法在单帧上做判断这引入了几秒钟的延迟三是风的影响会把火灾烟雾的上升轨迹吹偏大风天这个上升发散模型就失效了。第二个维度就更系统了——多传感器数据融合。在视觉之外加一个颗粒物浓度传感器PM2.5/PM10或者加一个一氧化碳/二氧化碳传感器。火灾烟雾的颗粒物浓度和气体成分跟水蒸气、扬尘、汽车尾气有本质区别。你把视觉的疑似烟雾区域和传感器的空气异常信号做时空对齐两者的交集就是高置信度的火警信号。这套方案的成本上去了传感器硬件数据融合平台但效果是实打实的。我一个客户在垃圾焚烧厂部署了纯视觉方案误报率高达每天20次后来加了一氧化碳传感器做交叉验证误报率直接掉到每天0.5次运维人员终于不用半夜起来看摄像头了。烟雾识别还有一个被忽视的难题烟雾会遮挡火焰但火焰不一定产生烟雾。有些火灾比如酒精燃烧、氢气燃烧几乎是完全无烟的但温度极高。如果你只在系统里部署了烟雾识别那这类火灾就彻底漏报了。所以我反复强调火焰和烟雾识别应该是并行的两个通道而不是互相替代的。任何声称烟雾识别就够了的方案都是在拿用户的安全在赌。最后我想聊聊烟雾识别领域一个相当反学术的经验。学术论文里通常用公开数据集比如Bilkent烟雾数据集、FRIDA数据集来评测算法但这些数据集有一个致命缺陷——它们大多是在无风或者微风条件下拍摄的烟雾的形态稳定、扩散慢、边界相对清晰。你在这个上面训出来的模型一到真实有风场景烟雾被吹得支离破碎、忽浓忽淡模型表现得像从没训练过一样。解决这个问题只有一个办法在真实场景下吹着电风扇拍烟雾数据或者干脆在室外有风天去拍摄。数据采集的过程极其痛苦——你得等合适的天气、合适的风向、合适的光照而且真实的火灾烟雾不是随时随地能采集的你得找消防训练基地或者做可控燃烧实验。这个过程费时费力费钱但没有捷径。在火焰烟雾识别这个行当里算法架构的差距远小于训练数据质量的差距。谁的数据更贴近真实部署场景谁的模型就更管用就这么简单。