熔炼炉烟尘AI视觉识别实战:三分类模型与边缘部署
前阵子做完一个熔炼炉烟尘AI视觉识别的项目,核心就是给炉前画面做浓烟、淡烟、无烟三分类实时监测。本来以为只是个普通的图像分类任务,结果从现场勘察、相机安装、数据采集到模型部署,踩了不少坑,也总结了不少经验。这篇文章不写PPT式方案,就按我实际动手的流程,把关键决策、参数、代码思路和排查方法都摊开讲,希望给正在做类似工业视觉项目的朋友一点参考。
先说明白这东西是干什么的:熔炼炉在冶炼过程中,炉口冒出的烟气状态能直接反映炉内反应剧烈程度、除尘系统是否正常、辅料投放是否过量。传统做法靠老师傅盯监控或者安装粉尘浓度仪,但前者容易疲劳漏看,后者只能测烟囱出口的颗粒物,往往滞后。我们做的这套系统,就是在炉口上方装一个工业相机,把画面实时传给边缘计算设备,用AI模型判断当前是浓烟、淡烟还是无烟,一旦出现浓烟立即告警并联动现场PLC,同时把分类结果和截图存进数据库,方便事后追溯。适合谁看?如果你正要上马类似的工业视觉监测项目,或者想在工厂环境里落地一个图像分类小模型,这篇文章能帮你少走不少弯路。
1. 项目全景:为什么要盯住炉口那缕烟
1.1 烟色是冶炼工况的“晴雨表”
熔炼炉前的烟不是简单的“污染物”,它承载着大量工艺信息。我在现场和老师傅聊天时,他们年轻时没有在线仪表,判断炉况全靠看烟:烟气发黑且浓,说明燃烧不充分或者有机物、辅料投入过量;烟气青白且淡,代表反应稳定,炉温区间正常;烟几乎看不到,要么是熔炼间歇期炉子本身安静,要么是除尘抽力太大,把烟气瞬间拉走,这本身也值得关注。所以“浓烟/淡烟/无烟”三分类,不是我们凭空拍脑袋定的,而是老师傅几十年的经验被数字化了。
这套分类对应到生产管理上有三个直接价值。第一是环保监管,浓烟溢出意味着无组织排放超标,环保平台上随时可能被抓拍;第二是设备保护,浓烟往往伴随炉压异常,除尘布袋可能堵了或脉冲阀坏了,早发现一秒就少损失一点;第三是工艺优化,通过统计浓烟发生的频次和时间段,可以反向追溯是不是加料节奏不合理。一个三分类标签,背后连接的是安全、环保、设备、工艺四个维度,这也是项目能立项的根本原因。
1.2 传统监测方式的三个痛点:滞后、误报、看不清
很多人会问,工厂里不是已经有粉尘浓度仪和视频监控了吗,为什么还要专门做一套AI识别?我在调研阶段把现场现有系统都捋了一遍,发现它们各有各的短板。
粉尘浓度仪装在烟囱或除尘管道里,测的是颗粒物浓度,但它反映的是“除尘系统出口”的结果,不是炉口局部的瞬时状态。烟气从炉口逸散到被除尘管道吸走,中间有几十秒的时间差,等浓度仪数值飙起来,浓烟早就冒完了。视频监控虽然有,但是全靠中控室值班人员眼睛盯,一个人同时看十几个画面,注意力撑不过二十分钟。更麻烦的是,传统视频分析的阈值报警很容易误报——熔炼时火光闪烁、天车经过、蒸汽飘过,都会触发假报警,现场工人被折腾几次以后就不信这套系统了。
这个场景很像家用场景里的烟雾报警器:它能告诉你“有烟雾颗粒”,但分不清是炒菜油烟还是真失火。我们要做的AI视觉识别,本质上就是给监控画面装一个“懂炉况的大脑”,直接判断烟气形态是正常还是异常,而不是停留在“有没有烟”这个层面上。
1.3 为什么用“AI视觉+三分类”,而不是更复杂的目标检测
项目启动时,内部也讨论过要不要做目标检测、实例分割,把烟团的轮廓、面积、位置都算出来。后来我们统一了判断:用户的核心诉求是“炉口到底处于哪种状态”,这是一个场景级别的状态判断,不是“画面里有几个烟团”的物体检测问题。三分类模型只需要回答“这张图是浓烟、淡烟还是无烟”,模型结构简单、训练数据容易标、推理速度快,在边缘设备上非常友好。
打个比方,这就好比体检时你先量体温判断是否发烧,而不是直接去做肺部CT。浓烟、淡烟、无烟不是三种“物体”,而是同一种烟气在不同工况下的连续形态,用分类模型天然合适。而且分类模型的鲁棒性比目标检测强很多:烟是半透明的、边界模糊的、随风飘散的,检测框本身就很难标准确,硬做检测反而会引入大量标注噪声。
2. 方案选型:从相机硬件到算法模型的取舍
2.1 相机选型:宽动态比高分辨率更重要
工业视觉项目最容易犯的错就是盲目上高分辨率相机。我们最初也想过上800万像素,后来现场跑了一圈发现,熔炼炉前最要命的问题不是“看不清细节”,而是“动态范围不够”。炉子正常冶炼时温度上千度,火光强烈,而烟气本身是半透明的灰白色或青黑色,普通相机会出现两个极端:要么炉口火光一片死白,要么背景暗得看不见烟。
所以我们最终选了宽动态(WDR)工业相机,分辨率只要求500万像素,帧率15到30fps就足够。为什么帧率不需要高?因为烟气形态变化是秒级的,而且我们后面还有滑动窗口做平滑,太高的帧率只会增加边缘设备的计算压力。镜头用的12mm定焦,视野大概覆盖炉口前方两三米的范围。这里有个关键点:不要用自动对焦镜头,冶炼现场有剧烈热浪,自动对焦会频繁拉风箱,画面反复虚化,模型就废了。固定焦距、固定光圈,调好后用螺丝锁死。
安装位置也很讲究。相机不能直接正对炉口,热辐射会把传感器烤坏,一般装在炉口侧上方,斜着向下看炉口区域。防护罩必须配水冷套加压缩空气吹扫,镜头前面要持续吹气,否则冶炼粉尘十几分钟就能糊满镜片。这个细节如果前期不考虑到位,后面模型准确率再高也白搭,因为输入图像本身就是糊的。
2.2 算力平台:边缘盒子为主,服务器推理为辅
选算力平台时,我们对比了三条路线:纯CPU工控机、边缘AI盒子、中心GPU服务器统一推理。纯CPU跑MobileNet这类轻量模型虽然也能跑,但现场工控机还要处理视频流、数据库写入和告警联动,CPU占用率一高,推理延迟就不稳定。中心GPU服务器性能强,但熔炼车间到机房的网线动辄几百米,一旦网络闪断,监测就失效了,这在安全场景里是不能接受的。
最后我们选了边缘AI盒子,带GPU或NPU的那种,算力大约在30到100 TOPS区间,部署在炉前的弱电间里,通过网线直连相机,模型推理和告警判断都在盒子本地完成。中控室的服务端只负责接收结构化结果、存数据库和展示界面,网络断了也不影响现场监测。选型逻辑很简单:把计算推到数据产生的地方,减少网络依赖,这是工业实时监测的第一原则。
2.3 网络模型:轻量化分类网络加预训练微调
模型选型上,我们没有用YOLO系列的检测模型,而是选了轻量化的图像分类网络,比如MobileNetV3、EfficientNet-Lite这类结构。原因前面说过,这个任务本质是图像分类。轻量化模型在边缘盒子上的推理延迟能做到几十毫秒,而且体积小,更新部署都方便。
这里必须强调一个经验:不要从零训练。我们用ImageNet预训练权重做初始化,然后在自己的熔炼炉数据集上微调。虽然熔炼炉烟气和ImageNet里的日常生活图像分布差异很大,但预训练模型已经学会了边缘、纹理、颜色等基础视觉特征,微调能显著减少训练时间并提高收敛稳定性。在我做过的工业项目里,预训练权重即使对“看起来完全不一样”的工业场景,也普遍能带来5到10个百分点的准确率提升,属于白捡的便宜。
3. 三分类模型实现的关键细节:从标注到推理
3.1 三类状态的判定标准与边界
做分类模型前,最难的不是写代码,而是定“什么是浓烟、什么是淡烟、什么是无烟”。如果标准模糊,三个标注员能标出三种结果,模型训出来就是一团浆糊。我们最终形成了可量化、可操作的标注规范,核心标准是这样定的:
- 无烟:画面中炉口区域没有可见的烟流,背景物体轮廓清晰可辨。
- 淡烟:有可见的烟流或烟团,但呈半透明状,透过烟气还能隐约看到背景轮廓,烟色偏白、青或浅灰。
- 浓烟:烟团致密、不透明,背景被大面积遮挡,烟色偏黑、深灰或黄色,通常伴随翻滚扩散形态。
这里容易踩的坑是淡烟和浓烟的边界。我们规定了一条硬性参考线:如果烟气背后炉口钢结构的轮廓还能辨认,就是淡烟;如果完全看不清且烟团占据画面显著区域,就是浓烟。标注时我们还做了双人交叉复核,同一批图两人标,一致性低于95%的样本直接丢回重标。分类模型的性能上限很大程度取决于标注一致性,这一点怎么强调都不为过。
3.2 数据采集与样本清洗:数量、来源与平衡
数据是工业视觉项目的命根子。我们从现场相机连续录制一周的视频,覆盖早中晚三个班次、晴天阴天、加料期和正常冶炼期,然后用固定帧率抽帧,再经过人工清洗。清洗规则有三条:第一,画面被天车、人员、检修平台大面积遮挡的帧删掉;第二,镜头起雾、被粉尘糊住的模糊帧删掉;第三,熔炼炉停炉检修期间的“死画面”删掉。
最终每个类别保留8000到15000张图,三类加起来约三万张。这个数量对于三分类任务来说完全够用,再多边际收益就很小了。类别平衡上,我们发现“淡烟”样本天然偏少,因为正常冶炼时烟气形态比较稳定,变化不多,于是我们做了两件事:一是采集时特意选择不同风量、不同物料配比时段,增加淡烟形态的多样性;二是在训练时给淡烟类别更高的损失权重,让它不至于被样本多的类别“淹没”。
3.3 训练配置与评估指标:一个可复用的基准方案
下面给出我们实际用的训练配置,都是常见做法,直接抄作业问题不大。输入分辨率224×224,数据增强用随机水平翻转(熔炼炉画面左右对称)、随机亮度对比度扰动、随机旋转正负10度、随机裁剪缩放。训练用PyTorch,优化器AdamW,初始学习率1e-3,配合CosineAnnealing学习率调度,主干用MobileNetV3-Large预训练权重,最终全连接层改成3分类。Batch size在边缘盒子上设32,训练60个epoch,Loss用CrossEntropy,并按类别的样本数比例设置权重。
评估指标不能只看总体准确率,要重点看混淆矩阵和每类召回率。我们给浓烟召回率定的硬目标是95%以上,因为浓烟的后果最严重,宁可把淡烟误报成浓烟,也不能让真正的浓烟漏掉。第一次训练出来的模型总体准确率93%,但浓烟召回率只有88%,一看混淆矩阵,大量浓烟被分成了淡烟。原因在于浓烟形成过程中存在大量中间帧,烟气从淡变浓的过渡态模型分不清。解决方案是加强数据清洗,把模糊的过渡帧重标,同时适当增加浓烟样本的亮度扰动,让模型对烟色和密度更敏感。
3.4 实时监测的工程化逻辑:滑动窗口与连续帧判决
模型在单帧上跑得再准,直接拿来做实时告警也会被现实打脸。工业现场画面里,可能有一帧突然飘来一片水蒸气,模型误判成浓烟触发警报;也可能加料瞬间烟从无到有,只闪过一帧。解决这个问题必须做时间维度的平滑,这是工业视觉和学术竞赛最大的区别。
我们用的是连续帧判决加去抖状态机:模型每秒处理两帧,每一帧输出一个三分类结果,然后放进一个长度为6的滑动窗口里。只有当一个类别在窗口内出现至少4次,状态才切换。也就是说,从烟气形态变化到系统确认并告警,大约有2到3秒的延迟,这在工业场景里完全可以接受,换来的是误报率大幅下降。状态切换还设置了“保持时间”,比如从淡烟变无烟要连续确认5帧才真正切过去,避免烟团飘动时状态来回跳。告警输出通过Modbus TCP写PLC寄存器,同时把分类结果、置信度和截图以JSON格式推给中控平台。
4. 实操过程:从现场走线到模型上线的完整链路
4.1 第一周:现场勘察、设备安装与数据准备
项目启动的头几天我们基本都泡在车间里。第一步是选相机安装点,用脚手架和临时支架把相机架在炉口侧上方,反复调整俯仰角,确认画面能覆盖炉口全部区域且没有立柱遮挡。第二步是布线,工业现场布线不能怕麻烦,网线和电源线分开走金属穿线管,避免动力电缆干扰信号。相机供电用工业级24V电源,现场电压波动大,必须带稳压和防浪涌功能,否则相机晚上容易自动重启。
第三步是调试图像参数。刚开始用自动曝光模式拍出来的画面惨不忍睹:炉火一亮,整个画面全是白的。我们换成手动曝光,把快门时间固定在一个适中值,然后打开宽动态模式,同时拉低高光区域的增益。熔炼炉火光不是持续均匀的,它会波动,所以后期训练数据里专门加入了不同曝光倾向的增强样本,让模型适应“亮度变化但分类不变”的真实场景。数据采集阶段,录像机连续跑了一周,每天按8小时有效生产时段保存,累计超过300GB视频。
4.2 数据标注与第一版模型:在反复折腾中找手感
这周的工作量最大。我们用脚本定时从视频里抽帧,每5秒抽一帧,抽出来的图先做个粗筛,再用一个简单工具快速打标签。为了让模型见多识广,我有意把不同时间段的图像混在一起,早班、中班、夜班的光照完全不同,夜间补光灯下的烟色和白天的烟色差别很大,这些都要让模型学到。
第一版模型训完,测试集整体准确率93%,看着还行,但一分析混淆矩阵就发现问题:淡烟召回率只有79%,很多淡烟被认成了无烟。这个结果其实在预料之内,因为淡烟本来就是最模糊的类别,半透明的烟在暗背景下和工地背景融为一体。当时咬咬牙做了两个调整:一是重新梳理淡烟标注,把“能看到烟但很淡”的样本单独抽出来再标一次,二是设了类别权重,淡烟的损失权重调到1.5倍。改了之后淡烟召回率提到91%,整体准确率到95.6%。
第一版模型上线试运行后还发现一个新问题:除尘风机喷吹瞬间,画面里会扬起一大股粉尘,白花花一片,模型直接判成浓烟。这其实是“粉尘”和“烟”的语义混淆,从图像上看它们确实都表现为大面积不透明遮挡。解决办法是在采集阶段专门截取喷吹时段的大量画面,把它标为无烟或淡烟(因为这不是炉况异常),让模型学会区分“从下往上冒的粉尘”和“从炉口翻涌的烟”。这件事让我更深刻地理解了一个道理:分类模型区分的是“视觉模式”,不是物理本质,你必须把所有会出现的视觉干扰模式都喂给它。
4.3 边缘端部署与实时化改造:把模型压到能跑
模型验证通过后,真正上线前的最后一步是部署优化。边缘盒子上我们先用推理框架把PyTorch模型转换成优化格式,再做INT8量化,模型体积从几十兆降到十几兆,推理延迟从80毫秒降到30毫秒左右。这里有个值得提醒的点:量化后一定要用真实现场数据重新跑一遍评估,因为INT8量化会让模型精度轻微下降,烟气和火光这种高动态范围的场景尤其容易掉点。我们量化后浓烟召回率从95%掉到92%,后来通过校准数据集选择时多覆盖了夜间灯火通明的样本,才把召回率拉回94%。
部署架构是:相机RTSP视频流接入盒子,盒子里的推理服务每500毫秒取一帧,完成分类后走状态机逻辑,结果经Modbus TCP传给现场PLC,同时把告警记录和截图推到中控室服务器。服务器端用Web界面展示当前状态、历史趋势和告警日志,支持按时间段筛选浓烟发生次数。上线第一周,系统运行稳定,内存占用几乎不变,单帧推理延迟没超过50毫秒,告警从烟气出现到中控室弹窗约2秒,现场反应时间比原来人工盯屏快了一个数量级。
5. 常见问题与排查技巧实录
5.1 烟与水蒸气、灰尘分不清
这是工业烟气识别最典型的干扰问题。熔炼车间里既有熔炼烟气,也有冷却水产生的水蒸气,还有除尘器喷吹扬起的灰尘。图像上它们都是半透明或不透明的白色/灰色团块。排查时我们发现一个有趣现象:烟气通常从炉口位置向上翻涌,水蒸气多从地面或管道缝隙飘出,除尘粉尘是瞬间弥漫整个画面的。因此除了给模型补充对应负样本,我们还在算法后处理上加了空间先验——如果异常烟雾区域不在炉口ROI范围附近,就算分类结果是浓烟也不告警。这种“模型+规则”的组合非常实用,纯靠模型硬扛永远有死角。
5.2 熔炼火光反光与夜间低照度
火光反光会改变烟气的视觉颜色,浓烟在强光下可能看起来发红亮,淡烟在逆光下会接近透明。排查时我们发现夜间补光灯虽然能照亮炉口,但会在钢铁结构上形成镜面反射,这些高光点被增强后的模型误当成浓烟团。解决办法有三个层面:图像预处理加局部直方图均衡,把动态范围压下来;数据增强里人工模拟强光斑;在训练时把熔炼炉高亮背景区域作为噪声专门加进去。实际上,模型训练到最后,对光亮变化已经很不敏感了,但这个问题在项目初期确实让我失眠了好几天。
5.3 换炉型、换物料后模型失效
工业生产的残酷之处在于,你以为模型稳定了,结果车间第二天换了批矿料,烟的颜色从青白变成黄褐,模型立刻懵了。这是因为烟气的颜色、密度和物料成分强相关。我们给出了一套务实的应对方案:保留已上线的通用模型,用新炉型的视频快速采集几百帧,人工标记后做小规模微调,整个过程控制在半天内完成。同时建议现场每换一次物料批次,就把当天的烟气截图存到“新待标注池”,每周抽几百帧快速人工确认,发现准确率下降再启动微调。工业视觉项目不是“一锤子买卖”,持续的数据回流和模型迭代是常态。
5.4 常见问题速查表
| 故障现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| 浓烟频繁误报 | 除尘喷吹粉尘、水蒸气干扰 | 查看告警截图,对比干扰源时间 | 补充负样本,增加ROI空间规则 |
| 淡烟漏报成无烟 | 暗夜环境对比度不足 | 检查夜间图像亮度和补光状态 | 增加夜间数据增强,提高淡烟权重 |
| 画面模糊、特征丢失 | 镜片粉尘覆盖或镜头热浪扰动 | 到现场看镜头吹扫是否正常 | 加大压缩空气压力,清洗镜片 |
| 模型在换料后准确率下降 | 烟色发生明显变化 | 采集新批次图片跑预测 | 用新数据微调模型 |
| 告警延迟过大 | 网络抖动或盒子CPU抢占 | 看盒子CPU占用和网络丢包 | 限制其他进程,改用固定IP直连 |
6. 我对这类项目的一些实践经验
项目收尾后,我最大的体会是:工业AI项目成功的关键不是模型多先进,而是对现场物理环境的理解有多深。熔炼炉烟尘AI视觉识别这个项目,技术上就是一套再普通不过的图像分类加状态机,但它能真正落地,靠的是把“老师傅看烟”的经验转换成标注规范,把“现场硬件环境”的约束转换成相机安装和防护方案,把“恶劣图像干扰”转换成数据增强和规则兜底。这些东西写不出来的时候觉得神秘,做通了之后回头看,都是些踏踏实实的笨功夫。
另外还想分享一个小技巧:这类项目一定要把“浓烟不漏报”放在最高优先级,宁可牺牲一些误报率指标,也不能让真正的浓烟逃过去。我们在告警逻辑里加了一个“置信度若低于阈值但类别概率分布异常,则自动记录待人工复核”的缓冲机制,这样做不会频繁打扰操作工,又不会漏掉极端情况。后续这个项目的自然扩展方向是:在现有三分类基础上增加烟尘浓度的相对量化估计,或者把不同炉膛编号都做成可配置模型,再或者叠加炉压、温度等工艺参数做多模态联合判断。工业视觉这条路,一但跑通第一个落地场景,后面的价值就越做越大了。