做了几年安防视频监控的算法落地,说真的,烟火识别这活儿看着不起眼,做起来相当磨人。工厂园区、森林防火、秸秆禁烧、仓储物流,到处都在喊“AI识别烟火”,但真正好用的方案不多。很多人上来就扔一个YOLO模型,跑通几个测试视频就以为完事了,等放到现场,晴天误报、晚上漏报、树叶晃一晃就报警,折腾几轮又回到原点。
这篇文章我不想聊那些花里胡哨的概念,就从一个做项目的角度,把视频监控烟火识别从原理、选型、训练到工程落地、踩坑排查的全过程拆开讲透。适合正在做消防智能化、安防监控算法、边缘计算盒子集成的同行,也适合准备入行做视觉识别的开发者参考。读完之后,你对这个领域会有一个非常落地的认知,至少不会在方案选型和误报排查上走我走过的弯路。
1. 先说说传统方案为什么撑不住:从“摄像机前有烟”到“机器认出烟”
视频监控烟火识别这件事,核心难点从来不在“有没有摄像头”,而在“怎么把画面里的烟和火从各种干扰中区分出来”。很多客户一开始给的诉求很朴素:我厂房里装了十几个枪机,晚上没人值守,你帮我做个东西,冒烟了、起火了能报警就行。
听着简单,真做起来是另一回事。
1.1 烟火识别的真实痛点:不是识别不出来,是错得让人受不了
烟火识别项目里最容易被低估的是误报成本。漏报一次可能酿成大事故,误报一百次呢?保安和值守人员会对系统失去信任,最后把报警声一关,整个系统变成摆设。我接手过的一个园区项目,上一家供应商交付的烟火识别系统三天两头被阳光、车灯、蒸汽触发,值守人员已经把报警推送设置成静默了,等于没装。
所以做这个方向,第一关不是模型精度,而是对业务场景的理解:你要在什么样的环境里识别,白天还是晚上,室内还是室外,有没有蒸汽、粉尘、强光、植物遮挡,这些都直接决定了技术路线怎么选。
1.2 颜色阈值、帧差法这些老办法到底失败在哪
早期做烟火识别,主流玩法是传统图像处理。烟雾的颜色偏灰白,火焰偏红黄,于是有人直接用YCbCr色彩空间提取阈值;烟会飘,火会闪,于是有人用背景建模、帧差法、光流法做运动检测。单看论文挺漂亮,实际部署就露馅了。
颜色阈值最大的问题是光照一变化就崩。同一个摄像头,上午十点和下午三点的画面白平衡完全不同,晴天和阴天的色偏也差很多,固定阈值根本罩不住。运动检测更头疼,树影摇动、摄像头微抖、车灯扫过都算运动,误报多到没法看。另外,传统方法完全无法理解“远方半透明飘散的一缕轻烟”和“近处一团清晰的白色雾气”的差别,在像素层面它们长得太像了。
这些方法不是不能用,而是只能做“前过滤”——也就是把明显不动的、无色的区域筛掉,减轻后续模型的压力。指望它们直接出结果,在工程上是走不通的。
2. 烟火在画面里到底长什么样:视觉特征与识别突破口
要训练一个真正可用的烟火识别模型,必须先搞清楚画面里的烟和火在成像上有什么规律。这里我结合自己的项目经验,把烟雾和火焰的关键视觉特征拆开讲。
2.1 烟雾的两大难点:半透明和轮廓不定
先说烟。烟在视觉上有两个显著特点,让它比火焰难识别得多。
第一是半透明。烟是颗粒物悬浮在空中形成的,它对背景有遮挡,但又没有完全挡住。这意味着烟雾区域的颜色是“烟的颜色”和“背景颜色”的混合,不同光照下差异极大。深色背景下烟是灰白色的,浅色背景下烟反而看起来偏暗,这在像素层面很难用一个固定的颜色分布去描述。
第二是轮廓不定。烟雾没有固定形状,它会随着气流扩散、旋转、拉伸。一个烟团刚出现时可能是个小点,两秒后变成一条线,再两秒变成一大片。CNN模型天然对“固定结构”敏感,比如人、车、桌子,因为它们有可重复的局部纹理和边缘结构。烟这个东西的纹理是模糊的、边缘是渐变的、结构是高频变化的,所以要检测小而清晰的烟,难度远高于检测大而模糊的烟。
2.2 火焰的“活”属性:闪烁频率与颜色分布
火焰比烟雾友好一些。它有比较典型的颜色分布——核心区域偏亮白,外焰偏橙红,这是高温燃烧的物理特征,在可见光成像里相对稳定。火焰还有一个很有用的动态特性:闪烁频率。扩散火焰的闪烁频率大致在8到12赫兹区间,这个频段是算法可以捕捉的“生物指纹”,一般的灯光、反光、红色物体都不具备这个频段上的规律性脉动。
不过火焰也有坑。夜间场景下,火焰的亮度会非常高,容易过曝,导致颜色信息丢失,整个火团变成一团白色亮斑。白天阳光直射下的金属反光、红色车漆、橙色工装,颜色分布和火焰非常接近,单看颜色完全没法分。
2.3 时序特征反而是稳定信号
我做了几个项目之后,一个比较深的体会是:烟火识别想稳定,不能只靠单帧图像。烟火区别于绝大多数干扰物的重要特征是它的“动态演化”。
烟雾会持续产生、扩散、改变形状,火焰会闪烁并且带动周围烟雾运动。而手机屏幕闪光、红色灯光、车尾灯这些单帧很像烟火的东西,在时间维度上是不演化的,或者演化方式非常机械。后来我在算法架构里普遍加入时序判定:连续几帧都有检测结果、且检测区域的运动特征符合烟火扩散规律,才触发告警。这一条过滤规则,比任何分类模型都能砍掉大量误报。
3. 技术路线选型:传统CV、深度学习检测器还是多模型组合
聊完特征,就到了选路线的时候。做烟火识别不是非得最先进的模型,而是要找“现场环境下能稳定跑、能迭代、出的问题你能兜住”的方案。我自己试过三种路线,下面逐一对比。
3.1 检测器选型:从YOLO到Transformer的取舍
先说主检测器。现在业界用得最多的还是YOLO系列的检测模型,比如YOLOv5、YOLOv8。选择它们不是因为精度最高,而是因为工程生态最成熟:训练代码开源、导出ONNX/TensorRT方便、在Jetson和各类边缘盒子上都有现成的加速方案,出了问题社区资料也多。烟火识别对实时性要求不算极端,但部署设备往往算力有限,一个能在RK3588或者Jetson Orin Nano上跑到20到30帧每秒的检测器,在项目里比一个精度高但只能跑5帧的Transformer模型有价值得多。
至于Vision Transformer,我做过对比实验,在烟火这类形状自由、目标尺度变化大的任务上,ViT确实有优势,尤其是在捕捉全局上下文、理解“大片弥漫的烟雾区”时效果更好。但问题是参数量大、推理开销高、部署调试复杂,在动辄对接几十路摄像头的项目里,设备成本会翻好几倍。我的建议是:硬件充裕、对漏报容忍度极低的森林防火项目可以考虑;一般厂区项目,用YOLO系配合数据增强完全够用。
还有一条细分路线:图像分割。如果现场有大量广角大场景画面,烟火只占据画面很小一块区域,检测框往往画不准边界,这时候可以用语义分割模型(比如U-Net变体)把烟火区域从背景里抠出来。代价是标注成本高、后处理复杂,我一般只在重点监控区域叠加使用,不会全场景铺开。
3.2 分类复核模型:误报的最后一道闸
部署过检测模型的人都有体会:检测器的误报是“结构性”的——它在某些特定场景上会稳定地犯错。比如某一路摄像头对着厂区大门,傍晚的夕阳会在固定位置引发误报;某一路对着马路,红色货车经过时会把车头当成火焰。
这时候单纯的检测模型很难彻底解决问题,因为它已经在训练阶段把“红色车头”和“火焰”的特征混在一起了。我的做法是在检测模型后面加一个轻量级分类复核模型,专门对检测框裁剪出来的图像区域做二分类:“真实烟火”还是“疑似误报”。分类模型的输入是裁剪区域加上前后多帧的连续图像,相当于用一个小网络重新审视检测器的候选框。MobileNetV3或EfficientNet-Lite这一档就够用,十几毫秒的推理耗时,换来的误报率下降非常可观。
3.3 我最终采用的组合策略
复盘我落地过的项目,一个比较成熟且好复制的组合是三层结构:
第一层,实时检测模型(YOLOv8s或同类)负责在每一帧画面里找到疑似烟火的区域。第二层,轻量分类复核模型对候选区域做二次确认,过滤颜色和纹理层面的典型误报。第三层,时序规则引擎负责“最后的裁决”——结合检测框的运动轨迹、区域扩散趋势、连续命中帧数,决定是否输出告警。
这三层分别解决的是“有没有目标”“像不像烟火”“是不是正在演化成烟火”三个层级的问题,思路比单模型清晰,也便于后续单独优化每一层。
4. 从模型到项目:摄像头、算力与告警链路的工程化落地
算法只是项目的一半,另一半是摄像头和系统的工程实施。烟火识别项目有大量脏活累活是发生在模型之外的,但这部分直接决定了项目能不能验收。
4.1 摄像头选型与视角部署建议
摄像头选不对,算法再好也白搭。烟火识别对摄像头的核心要求不是像素多高,而是动态范围和低照度表现。一个容易忽略的参数是焦距和视场角:视野太宽,远处的烟在画面上只有几个像素,再好的模型也认不出来;视野太窄,又容易漏掉视野外的火情。实战中我一般建议采用“全景巡视+重点盯防”的组合:广角枪机负责大范围扫描,云台球机或长焦枪机负责对重点区域(比如危化品仓库、配电房、堆料场)做局部精细监控。
另外非常建议优先选择支持标准RTSP/ONVIF协议的设备,能直接拉流接入算法服务。很多项目败就败在摄像头协议私有,SDK又难调,算法工程师一半时间耗在对摄像头的适配通信上。
4.2 抽帧策略与推理性能平衡
视频是25帧每秒的流,但烟火蔓延是一个相对缓慢的过程,烟雾从出现到肉眼可见通常需要几秒以上,火焰的闪烁又是高频的。实际部署时,我通常不会对每一帧都做检测,而是以2到5帧每秒的抽帧频率做推理。这样既保留了足够的时序判定样本,又把算力占用控制在一个很低的范围。
推理设备的选择跟着摄像头路数走。16路以内的小型项目,一台工控机加一张RTX 4060级别的显卡,或者用RK3588这类国产边缘盒子,足够带起来;几十路的大项目,需要分布式的推理节点,或者用GPU服务器集中处理,具体要看现场网络带宽和机房条件。
4.3 告警联动与人工复核闭环
识别到的烟火信号,不能只停留在平台弹个窗口。做项目时我会把告警链路做成一个完整闭环:首先,告警必须包含现场画面截图和一段短视频,方便值守人员确认;其次,告警要能够联动现场的声光报警器和应急广播;最后,系统要有告警反馈机制——值守人员确认是误报还是真实火情,这个反馈结果要被记录并回流到训练集里。
这一点是从亲身经历得出的教训。没有人工反馈闭环的烟火识别系统,永远在原地踏步。有了反馈,每一次误报和漏报都会变成新的训练数据,系统的表现会几个月内越用越好。
5. 实测中踩过的误报与漏报坑:逐个排查的真实过程
这个章节本来不想写,因为写出来等于公开处刑自己踩过的坑。但想想这些东西对同行最有用。烟火识别项目里,算法训练只占两成时间,剩下的八成时间都在跟误报和漏报搏斗。下面挑几个最有代表性的案例复盘。
5.1 晨雾把轻雾当成烟:一次典型的“看起来很像”误报
有个厂区项目测试期间,连续三天早上八点准时报警,地点固定在厂区东侧一片草地上。值班人员反馈说没有火源,我看截图也挺像烟雾,灰蒙蒙一片。后来我到现场蹲守才发现,这是典型的清晨低空水汽——太阳刚升起来时,草地上的水蒸气遇冷凝结成轻雾,在逆光角度下成像颜色和质感跟烟高度相似。
这个案例让我意识到,只用静态图像识别烟火是有上限的。后来我加了两个规则:一是结合时间信息,清晨和雨后是水汽高发时段,对这类告警提高确认阈值;二是看动力学特征,水汽轻雾往往是整体漂移,而真实烟雾会从火源点持续向上升腾,存在明显的“起源点”。这个补充规则生效后,同类误报基本绝迹。
5.2 红色货车、橙色工装如何骗过火焰检测
还有一次误报更滑稽。厂区主干道上连续出现火焰告警,我拉出截图一看,是一辆红色集装箱货车在阳光下经过,车顶的红色金属漆在特定角度形成了一片高光反光,颜色特征和火焰外焰高度重合。
这种误报是最典型的颜色陷阱。单靠检测器很难根治,因为货车在移动、画面在变化、颜色又接近。我的解决办法是把复核分类模型的输入从单帧图改成连续帧序列,并让模型学习“火焰在闪烁,车漆反光是渐变”的时序差异。另外,在检测器的后处理里增加先验知识:检测框如果呈现刚性的形状变化轨迹,比如匀速直线运动、只移动不变形,就极大降低烟火概率。烟火通常是原地扩散、轮廓轮廓逐渐增大的。
5.3 夜间逆光下的小目标漏报
漏报案例更棘手。某次夜测,测试点在一处路灯与黑暗交界区域,试验火焰已经烧到一定规模了,算法还是没有告警。查日志发现,检测器在大部分帧上都把火焰区域过滤掉了,原因是夜间火源亮度极高,过曝后整片区域呈现亮白色,与周围环境对比度太强,检测器将它归类为“高光噪声”了。
这个问题的根子在训练数据的分布:训练集里的火焰样本大多来自白天,夜间过曝的火焰样本太少,模型没见过这种形态。解决方式是针对性地补采夜间数据,并在训练时加入过曝和低光增强。现在我的烟火训练集一定会故意构造几种夜间形态:过曝白热状态、带光晕状态、暗背景下小火焰状态,每个类型至少几百张,效果立竿见影。
5.4 每一次误报都是负样本:数据闭环的价值
踩了这么多坑之后,我养成了一个习惯:每个项目的视频流都会持续保存一周的告警前后片段,定期把误报案例整理成负样本库,回灌到训练集里做增量训练。刚开始的时候,这个负样本库大概几百张,模型每周都要重训一轮。坚持两三个月之后,误报率会明显收敛,而这个过程是用一个固定算法解决不了的。
烟火识别没有“训一次就能用一万年”的方案,环境在变,光照在变,干扰物在变,只有把数据闭环跑起来,系统才是活的。
6. 数据集与训练收敛的务实话:数据配比、标签细节与评测口径
聊完工程和踩坑,回到模型训练本身。烟火识别项目跑得多的人,都有一套自己的数据处理习惯,这里挑几个直接影响模型效果的细节说。
6.1 正负样本配比:不是越多越好,是越“对”越好
烟火识别训练集很容易犯一个错误:正样本收集太少,负样本随便一堆,然后模型疯狂偏向负类,导致漏报率高得离谱。另一个错误是正样本类型单一,全是清晰的大火焰,一放到现场就被小目标、远距离、半遮挡场景打败。
我自己的经验是,训练集的重心要放在“难正样本”上。同一场火,要有近景、中景、远景,要有顺光、逆光、夜间,要有被树木遮挡一半的、只有淡淡烟雾的。负样本则要贴近现场:树影、云影、路灯、红色车漆、水雾、扬尘、焊接火花、电焊弧光、烟囱正常排烟,这些都是真实场景里最常见的干扰源。正负样本比控制在1比3到1比5之间,保证模型见过足够多的“假烟火”但又不至于被淹没。
6.2 标注细节决定模型上限
烟火数据集的标注比通用目标检测更讲究。烟雾目标没有清晰边界,不同标注员画的框可能差出一倍。我的规矩是:训练用的检测框宁可大一点,把整个烟雾扩散范围框住,也不要只标最浓的核;火焰的框要包含外焰,因为外焰的颜色和形态是识别火焰的重要信号;对于“烟和火同框”的情况,要分别标注两个类别,不要混在一起。
标签一致性对模型收敛非常关键。所以我建议训练集标注完成之后,一定要有一个人统一复核一遍,把框的准绳拉齐。这个工作枯燥,但对精度的提升是最实在的。
6.3 评测口径:漏报率、误报率与确认时延
项目验收的时候,测评标准必须提前和客户对齐。烟火识别项目最核心的三个指标,我的建议如下:
漏报率是底线性指标,测试期内的实际火情应该做到零漏报。误报率用“每路摄像头每天误报次数”来衡量,一般目标控制在0.5次以下,也就是两天不超过一次误报。确认时延指的是从火情出现到系统推送告警的时间,烟雾蔓延到肉眼可明显识别通常在十几秒量级,规则引擎的时序判定窗口一般设置在连续3到5帧,整个时延可以控制在10秒以内。
实测下来,这三个指标里最难的不是漏报率——因为训练集中正样本管够之后漏报率很容易压到很低——而是误报率。误报率考验的是对现场环境的理解深度和对负样本库的积累,它才是烟火识别项目真正拉开差距的地方。
7. 下一步可以做的优化方向与实际心得
烟火识别永远不会是一个“做完”的项目。随着项目积累,我逐渐在主线方案之外看到了几个值得投入的优化方向,也在这里分享给大家,顺便聊聊个人对这类项目的一些体会。
7.1 红外热成像通道与可见光融合
可见光方案有一个物理上限:黑夜、浓烟遮挡、低能见度环境下,可见光成像质量断崖式下跌。红外热成像不受这个限制,高温目标在热成像里非常突出。越来越多的存量监控项目开始加装双光谱设备,如果预算允许,直接把热成像通道送入烟火识别流程,配合可见光通道做交叉验证,识别的鲁棒性会提升一个档次。
目前的问题是成本还是偏高,一套好的双光谱云台价格很可观。但消防和安防项目对这类硬件的接受度正在提高,我认为这是烟火识别确定性很强的一个演进方向。
7.2 从单帧识别走向时序预测
另一个方向是我正在做的前瞻性尝试:把烟火识别从“检测当前帧有没有烟火”变成“预测未来几十秒内会不会产生烟火”。很多火灾在真正起火之前有征兆性特征:局部温度异常带来的热浪扰动、微小水滴的快速蒸发、特定区域出现有规律的亮度波动。这些信号在人眼看来并不起眼,但用连续帧序列训练时序模型,是完全有机会提前嗅到危险的信号。
这个方向目前还没有特别成熟的工程方案,主要还是依赖足够多真实异常场景的数据积累。但对于高危值守场景,提前哪怕30秒预警,价值都是巨大的。
7.3 最后的个人体会多聊几句
做了几个烟火识别项目以后,我最深的一点体会是:这个方向绝对不是“模型好=效果好”的线性关系。模型、数据、工程链路、现场理解,四条腿缺一条都站不稳。特别是现场理解,你必须亲自去蹲过几个现场,看过清晨的水汽、傍晚的夕阳、厂房里的蒸汽和路过的红色重卡,才知道你的系统要面对的是什么。
另一个实用的建议是给客户或团队建议在部署初期保留一个人工复核坐席。烟火识别不可能第一天就完美,运行之后持续收集误报数据、持续迭代,比一开始就买几百万的高端设备更有效。我见过太多项目死在“调试期结束后没有人管数据闭环”这个环节上。
所以如果让我给后来者一句实在话:别迷信什么独占技术,把数据闭环跑起来,把现场的干扰看透,把这件枯燥事做到位,你的烟火识别系统自然比大多数同类方案要稳定可靠。