☰
家居火焰烟雾图像识别系统:从数据构建到轻量级部署实践
2026/10/18 20:28:08 网站建设 项目流程

家里最容易着火的地方,大概率是厨房。我身边就有朋友经历过油锅起火,人刚转身拿个东西,锅里的油就烧了起来,等回头的时候黑烟已经蹿到天花板。更让人后怕的是,家里的烟雾报警器往往要等烟雾浓度很高了才响,有时候人已经吸了几口烟。我开始琢磨这件事的时候,发现一个非常现实的问题:传统的烟感报警器靠的是"烟到了才报警",而图像识别系统可以做到"看到烟的苗头就报警"。这就是我做这套面向家居场景的火焰烟雾图像识别系统的出发点——用摄像头作为眼睛,用目标检测模型作为判断器,在火灾发生的早期阶段给出预警。

这篇文章把整个项目从数据到模型再到部署的完整技术路径写出来,包括我踩过的坑、实测出来的数据和最终的性能取舍。适合正在做火焰烟雾检测相关课题的研究生,也适合想给家里加一道视觉安全防线、有一定编程基础的开发者参考。整套方案没有花哨的地方,每个环节都是被现实情况逼出来的选择。

1. 家居场景为什么需要一套独立的火焰烟雾识别方案

1.1 传统烟感报警器的盲区在哪里

家用烟感报警器的工作原理主要是电离式或者光电式,靠检测空气中的颗粒物浓度来触发。这个机制有个物理层面绕不过去的瓶颈:它必须在燃烧产生的烟雾扩散到传感器位置、并且浓度达到阈值之后才能报警。如果人在客厅、厨房门关着,或者厨房抽油烟机开着把烟直接抽走了,报警器可能半天不响。而图像识别的方式天然没有这个限制——只要摄像头能拍到火焰或者烟雾的形态,就可以在第一帧出现异常时就捕捉到。

另一个是响应速度问题。光电式烟感从起烟到触发通常需要十几秒到几十秒,在燃料充分燃烧的情况下,这个时间差可能意味着火势从可控变成失控。视觉方案的帧率可以做到每秒钟实时处理几十帧画面,理论上在起火后两三秒内就能给出告警。这个延迟差异在真实火情里非常关键。

1.2 家居视觉环境比监控安防场景更复杂

很多人以为火焰检测就是把公开数据集跑一下就行,但实际部署到家里完全是另一回事。安防监控场景下的火焰检测目标通常是大面积的火灾区域,火焰特征明显,背景相对单一。家里不是这样:厨房有燃气灶的蓝色火焰,日常做饭的锅底有火苗;客厅有夕阳透过窗帘的红色暖光;浴室有蒸汽;抽油烟机有排出的油烟。所有这些视觉特征都和火焰、烟雾高度相似。

我最初用通用火灾数据集训练的模型,放到家里测试时误报率高得没法看。卧室里一件红色的毛衣挂在椅背上,模型能给出0.7以上的火焰置信度;厨房炒菜产生的水汽,直接被识别成烟雾。这些都是家居场景独有的问题,通用模型根本没有见过这些负样本。所以严格来说,家居场景需要的不是"火焰检测模型",而是一套能把"起火"和"日常做饭的生活痕迹"区分开来的专用系统。

2. 数据是火焰烟雾识别最大的敌人:数据集构建与标注策略

2.1 数据来源与采集路线

做这个项目之前我对数据是有预期的,但实际做下来还是超出了我的预判。公开的火灾数据集数量不少,但大多面向森林火灾和大型建筑火灾,家居场景的数据非常稀缺。我的数据来源走了三个方向:

第一个方向是整理公开数据集,从中筛选出适合家居场景的图像。这个过程要人工逐张过,把室外大火、远处烟雾这类和目标场景差距太大的图片剔除。处理下来大约留下了一千多张可用的火焰图片和几百张烟雾图片,涵盖明火、阴燃、不同光照条件下的火苗和烟雾形态。

第二个方向是自采数据。我在某实验室的模拟环境下搭建了一个简易的燃烧测试场景,用不同材料(纸张、木材、棉布)制造明火和阴燃条件,用普通家用摄像头和手机分别录制视频。这个环节很重要,因为自采数据的视角、分辨率和光照条件跟真实家庭场景最接近。我采集了大约四百多段短视频,每段几秒到几十秒不等。

第三个方向是负样本采集,这个放到后面单独说,因为它的重要性被大多数人低估了。

2.2 正负样本的平衡设计与难例挖掘

火焰烟雾检测最容易翻车的地方不在正样本不够,而在负样本不够"坏"。我用一个形象的类比来说明:如果模型只见过"燃烧的火"和"没火",它就学不会区分"夕阳的红光"和"火焰";只有让它见过足够多"长得像火但实际上不是火"的图片,它才能从误报的边缘上撤回来。

我用了大概整个数据构建工作量的四成去采集负样本。厨房油烟(开着抽油烟机爆炒的场景、小火炖汤产生的水蒸气)、浴室淋浴的蒸汽、夕阳的红霞、红色窗帘在晚风里飘动、红色的气球、炉灶上正常煮饭的火苗——这些全部纳入训练。我还在训练过程中用"难例挖掘"的思路做了迭代:每一轮模型训练完,就拿模型没用过的视频片段去跑推理,凡是置信度在0.3到0.8之间的"模糊"样本,全部人工审核,确认是误报的就加入负样本集。这个循环跑了三轮,误报率降了一个数量级。

2.3 标注规范与质量校验

标注看起来是体力活,但质量直接决定模型上限。我给火焰烟雾标注建了一套自己的规范:

  • 火焰区域标注外接矩形框,要求至少覆盖火焰主体,不把周围被照亮的物体框进去;
  • 烟雾区域比火焰更难框,烟雾是半透明扩散的,我要求标注者框出"浓度明显可见"的核心区域,扩展的淡薄烟雾不强行包含;
  • 不清楚是否着火的模糊图片单独放一个"待定"文件夹,不强行标注;
  • 每张图至少由两人独立标注,IoU低于0.7的重新讨论。

这里有个易踩的坑:很多人标注火焰的时候习惯把火焰和它产生的火光一起框进去,导致模型学到的是"亮红色区域"而不是"火焰结构",误报率会明显上升。火焰的形态不同于普通红色物体,它有内部明暗变化和飘动不定的边缘,标注时框得太散会让模型抓不到这种纹理特征。

3. 模型选型:从检测到轻量化改造的取舍

3.1 为什么选择了检测+分类的两级架构

在模型选型时我对比了几条路线:直接用目标检测模型做火焰烟烟雾单阶段识别、用图像分类模型对整幅画面做二分类、以及检测加分类的两级架构。

单纯的检测模型比较直接,比如在YOLO系列框架上训练一个多类别检测器,一类火焰一类烟雾。但问题在于烟雾的形状和位置极不稳定,一片弥散的薄烟可能占满整个画面上方,用矩形框去框它本身就是一件很别扭的事。检测器对这类"无固定形态"目标的表现并不理想。

纯分类模型的思路是把整张图喂给卷积神经网络,输出"正常/起火"二分类。这个思路简单,但定位能力很差——模型说画面里有异常,但它不告诉你在哪,也不告诉你是什么。而且整图分类对背景敏感,换个家具摆放就可能误判。

最终我用的是检测+分类的两级架构:第一级用一个轻量目标检测模型负责找出"疑似目标区域",第二级用一个小型图像分类模型专门对裁剪出来的区域做精细化判断,区分"明火/烟"和"与火相似的负样本"。这样第一级保证召回率,第二级压低误报率,两级各司其职。

3.2 轻量化网络的量化与剪枝实测

家居场景的部署算力远不如云端。我的目标是让整套系统运行在一块几百块钱的开发板上,这就逼着我把模型压到极致。

基础检测部分,我在YOLOv5的nano版本和YOLOv8的n版本之间做了对比。YOLOv8n的参数量约3.2M,FP32模型约12.6MB,在开发板上的推理延迟实测约为80到120毫秒每秒帧。YOLOv5n稍快一些,但准确率略低。考虑到家居场景对误报的容忍度更低,我选择了YOLOv8n作为主干。

压模型主要走两步:第一步是INT8量化,把权重从FP32压到8位,模型体积降到约1.4MB,推理延迟降到40到60毫秒。这里要注意量化后的精度损失,实测mAP下降约1到2个百分点,但在可控范围内。第二步是通道剪枝,对分类头部分的冗余通道做剪枝,这块优化空间不大,因为小模型本身已经比较紧凑,硬剪反而会掉点。实测下来在便宜板卡上的最终性能是:推理帧率约20到25帧每秒,单帧可处理,完全满足家居场景的实时需求。

4. 火焰的"闪烁"和烟雾的"扩散":时序特征消解误报

4.1 单帧检测的误报来源分析

如果只用单帧图片做判断,哪怕是检测加分类的两级架构,在家居场景里误报率依然偏高。我跑完一轮离线测试后统计了误报的主要来源,排在前几位的是:

  • 强光线变化:夕阳透过窗户突然照进来,整个画面色调变成暖橙色;
  • 燃气灶正常火苗:厨房做饭时炉灶上的火焰确实是真实的火焰,但对安全系统来说它不应该触发报警;
  • 电视屏幕上的火焰画面:客厅电视播放电影中的火灾镜头;
  • 抽烟产生的少量烟雾:形态和初期阴燃烟雾太像了。

单帧检测的致命问题在于:它判断的是"画面上有没有像火焰的东西",而不是"这个火焰是不是正在燃烧"。正常的燃气灶火焰、电视里的火焰画面、蜡烛的火焰,从单帧视觉特征上和火灾火焰几乎没有区别。要区分这些场景,必须借助时间这个维度。

4.2 基于时序确认的报警判定策略

火焰有一些非常稳定的物理特征,其中最能和"静态红色物体"区分的特征是闪烁。火焰的闪烁频率主要在0.5到8赫兹之间,也就是说火焰的亮度变化是持续波动的,而气球、红色窗帘、夕阳照射在墙上的光斑都不具备这种高频波动特征。

我的时序判定策略是设计一个带状态机的确认机制。模型连续处理每一帧画面,我只记录检测到火焰候选和烟雾候选的帧结果,不立即触发报警。状态机的逻辑是:

  • 火焰报警:连续5帧中至少4帧检测到火焰候选,且候选框的中心位置在连续帧间的位移不超过设定阈值,才会进入"疑似火焰"状态;进入状态后再持续3帧确认,触发报警;
  • 烟雾报警:烟雾扩散速度慢,特征是面积逐渐增大、边缘在扩散,我采用累计变化检测,要求连续10帧中检测到烟雾候选超过7帧,且烟雾区域面积呈单调增长趋势,才触发报警;
  • 炉灶火苗豁免:如果检测到的火焰候选区域固定在画面中的某个特定区域(比如灶台上方),且面积变化幅度小于阈值,可以判定为正常炉火,不触发报警。

这套机制在实际测试中把因为电视画面临时画面、室内灯光变化引起的误报基本消除了。它本质上不是用更聪明的模型,而是利用了"火灾是持续演进过程"这个更可靠的先验信息。

4.3 多种干扰场景的实际测试

我在数据集之外专门准备了一批干扰测试视频,模拟各种"看起来像火灾但实际不是"的场景:窗外夕阳、电视屏幕播放森林大火、厨房炒菜油烟、浴室蒸汽弥漫、穿红色衣服的人走动、蜡烛放在桌面上等等。用这套视频对完整系统做端到端测试,结果是:

  • 夕阳和红色衣物基本不再触发报警,误报率从初版的每10分钟一次降到了每24小时约2到3次;
  • 炒菜油烟导致的烟雾误报还是存在,主要发生在爆炒产生浓烟且抽油烟机未开的情况下,这个场景和真正起火的烟雾Ex在视觉上确实过于接近,后面还会专门说这个问题;
  • 电视里的火灾画面因为火焰不连续、角度变化大,偶尔会进入疑似状态,但极少达到连续确认的阈值,最终没有触发完整报警。

时序机制的代价是报警延迟。火焰从第一帧被检测到到最终触发报警,实测延迟约2.1秒;烟雾约4.5秒。对于家庭火灾场景,这个延迟完全可以接受,相比传统烟感报警器的实际响应时间反而快了一个量级。

5. 部署到家庭设备上的实践记录

5.1 硬件选型与算力评估

我最初想用USB摄像头直接接开发板,主控板选择关键看三点:能否流畅跑量化后的模型、接口是否够用、耗电和发热是否适合长期挂机。对比了几种方案后,实际测试下来跑INT8量化的YOLOv8n稳定在20帧以上,部署跟踪和状态机后CPU占用率在60%左右,整体温控良好,外形也适合放在家里。板卡更换的考虑因素还包括摄像头接口的兼容性和系统层面的软件生态是否成熟,这部分直接影响后续调试效率。

供电方面我用了12伏电源适配器加稳压模块,实测长期运行的功耗在5瓦出头,一个月电费五块钱左右。摄像头选择的是普通的200万像素广角摄像头模块,关键参数是视场角,这个直接决定覆盖范围。

5.2 摄像头安装位置与角度对识别率的影响

这个环节完全是在真实环境里试错试出来的。第一次测试我把摄像头放在客厅角落的电视柜上,仰角大约30度拍向对面墙壁,结果问题很典型:火焰本身是向上燃烧的,仰角拍摄会压缩火焰在画面中的纵向尺寸,小火焰的检测率直线下降。后来我把摄像头安装到厨房吊柜下方,顶部俯拍灶台区域,火焰的形态特征变得非常清晰。

烟雾检测对视角更敏感。烟雾上升后会在天花板附近积聚,如果摄像头安装高度太低,只能拍到烟雾的底部边缘,检测难度会大幅增加。我的实测结论是:摄像头安装高度至少要在2米以上,俯拍角度覆盖主要可能起火的面,同时尽量避开射灯和窗户直射光。画面中如果有高强度光源直射,会让火焰区域的对比度严重下降,模型在强光下的召回率会掉接近三成。

5.3 白天/夜晚/逆光三种典型场景实测

部署完成后我做了连续一周的实测,覆盖三种典型光照场景:

白天的厨房,自然光充足,检测效果最好,明火和烟雾都能比较准确地检出。夜晚关灯状态下的客厅更适合用带红外夜视的摄像头,不过红外模式下火焰的视觉特征会变化——颜色信息基本丢失,火焰在红外图像里表现为高亮区域,形状结构更突出。实测下来红外模式下火焰检测的召回率反而略有提升,但烟雾检出率有所下降,因为红外图像里烟雾的对比度不如可见光。第三种是逆光场景:窗户在摄像头背后,画面中背景亮度极高,前景物体往往被压暗成剪影。这个场景对火焰和烟雾检测都是干扰最严重的,火焰的亮红色特征会被强烈的背景光冲淡,置信度普遍下降。我的处理办法是开启摄像头的宽动态范围功能,同时在后处理中对过曝区域的检测置信度做降权处理,避免产生高置信度的误报。

6. 这套系统还解决不了的问题

文章写到这儿,得说点大实话:这套系统能在家居场景里做到实时预警,但它并不是万能的。有几种情况当前版本的方案处理不了,我把它们写出来也是给后面想做这块的朋友提个醒。

第一个是油烟与起火烟雾的边界问题。爆炒时不开抽油烟机,锅里冒出的浓烟和阴燃阶段的烟雾在视觉上几乎无法区分。我试过增加颜色特征、纹理分析,但物理上这两者都是半透明的灰白色气溶胶颗粒,单靠摄像头从外观上区分实在强人所难。比较务实的解法是加入传感器联动:当图像检测到烟雾候选时,再叠加燃气传感器或者PM2.5传感器的信号,多模态综合判断。

第二个是超低照度下的彩色信息丢失。摄像头在全黑环境下切换到红外模式后,火焰的颜色特征消失了,系统只能靠形状和亮度判断,误报率会小幅回升。我的处理是降低了该场景下的报警阈值灵敏度,宁可延迟报警,也不要被错误的报警打扰。

第三个是隐私问题,也是系统能不能真正落地住进家里的关键。家里的摄像头长期运行,画面数据如果被滥用,后果比火灾更可怕。我最终的方案是让所有推理都在本地设备完成,摄像头画面不出本地网络,不上传任何一张原始图像到云端,只在触发报警后推送文字通知到手机。这个设计牺牲了一点远程查看的便利性,但换来了用户对系统的信任。

第四个是模型对"小火苗"的识别能力。蜡烛、打火机、香薰这类小火源,在画面中的像素面积很小,特征不够充分,检测置信度偏低。如果家里有小孩子玩火,这类小火苗被漏检的可能性是存在的。我尝试过在数据集里加入大量小火苗样本,但效果提升有上限,这是一个需要从传感器方案层面解决的事情,光靠算法已经喂不饱了。

做这个项目最大的体会是:火焰烟雾检测看起来是图像分类问题,做到最后其实是物理约束和现场经验的结合。模型告诉你"这里有东西像火",但你得结合场景、时序、光照、安装方式才能判断它到底是不是真的火。如果你也想做类似的家居安全系统,我的建议是先花时间去厨房看一整天做饭的全过程,把你希望系统忽略的画面和希望系统报警的画面列清楚,再开始标数据和训模型——这个步骤能帮你省掉后面大量反复迭代的时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询