news 2026/10/2 6:26:15

熔炼炉炉前烟尘视觉识别:轻量级CNN三分类与边缘部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
熔炼炉炉前烟尘视觉识别:轻量级CNN三分类与边缘部署实战

1. 项目缘起与整体设计思路

1.1 为什么要在熔炼炉炉前做烟尘视觉识别

熔炼炉车间有个很现实的问题:炉前加料、扒渣、出铜、出铝这些工序,烟尘状态直接反映炉内反应情况和环保排放水平。老师傅凭经验看烟色就能判断燃烧是否充分、要不要调风量、什么时候该关炉门,但这种经验很难量化,更没法24小时盯着。环保在线监测设备通常测的是烟囱末端排放,炉前逸散烟尘反而成了盲区。

我接触这个项目的出发点很朴素:用普通工业摄像头对着炉门拍,让算法实时判断当前是浓烟、淡烟还是无烟,把结果推给中控室和除尘系统。浓烟触发加大引风、淡烟维持、无烟降频节能。整套方案不依赖昂贵的红外热像仪或激光散射设备,一台带PoE的枪机加一台边缘计算盒子就能跑起来,单炉口硬件成本能压到几千块。

这个题目适合谁参考?做工业视觉的算法工程师、冶金企业的自动化技术人员、以及计算机视觉方向想做落地项目的学生。它不像人脸识别那样有现成数据集,但场景足够垂直,三类状态边界清晰,标注成本可控,是个很好的工业视觉入门实战。

1.2 三分类任务的定义与边界划分

浓烟、淡烟、无烟这三个类别听起来简单,实际定义起来要非常小心。我最初按“烟的浓度”去分,结果标注员之间分歧很大。后来改成可操作的视觉判据:

  • 浓烟:炉门开口区域被烟尘大面积遮挡,背景炉壁或炉内亮光基本不可见,烟团有明显的翻滚纹理,灰度值整体偏暗且方差大。
  • 淡烟:能看到烟尘飘动,但炉门开口的亮区或炉壁轮廓仍可辨认,烟呈半透明状,边缘模糊。
  • 无烟:炉门区域清晰,无持续飘动的烟尘,可能有少量热气扰动但无颗粒感。

注意:火焰和烟要分开。炉内明火属于正常状态,不能因为画面有亮橙色就判成浓烟。我在标注规范里明确写了“火焰不计入烟尘”,否则模型会把出渣时的火光误判。

1.3 技术路线选型:为什么不用目标检测而用分类

有人第一反应是用YOLO去检测“烟”这个目标。我试过,效果不稳定。原因是烟没有固定形状,边界模糊,标注框很难画一致,而且炉前烟尘经常和背景、炉壁、火焰粘连,检测框会飘。改成整图分类后,问题简单很多:把炉门区域裁出来,缩到224×224,直接分三类。分类任务对边界不敏感,标注只需要给整张图打一个标签,标注效率提升至少三倍。

模型选型上,我最终用了轻量级CNN,主干是MobileNetV3-Small,输入224×224,输出3类。理由很直接:边缘盒子算力有限,工业现场要的是稳定和低延迟,不是刷榜。MobileNetV3-Small在INT8量化后单帧推理能压到10ms以内,配合每秒5帧的采样,完全够用。训练阶段用ResNet18做对比,精度只差1.2个百分点,但推理速度慢了一倍多,不划算。

1.4 整体系统架构

整套系统分四层:

  1. 采集层:炉门侧上方装一台200万像素工业枪机,PoE供电,RTSP推流,帧率25fps,实际抽帧到5fps做推理。
  2. 边缘推理层:一台带NPU的边缘计算盒子,跑量化后的分类模型,输出三类概率和置信度。
  3. 业务逻辑层:连续多帧投票,避免单帧抖动误报;浓烟持续超过3秒才触发除尘联动。
  4. 展示与联动层:中控室大屏显示当前状态,同时通过Modbus TCP把信号给PLC,控制引风机频率。

这个架构的好处是推理在本地,不依赖网络,断网也能跑;坏处是模型更新要现场刷机,所以我在盒子上留了远程模型热更新的接口。

2. 数据采集与标注的实操细节

2.1 摄像头安装位置与成像质量

摄像头装得好不好,直接决定项目成败。我踩过的坑:一开始把摄像头装在炉门正前方,结果炉门一开,强光直射,画面过曝,烟和火焰全白成一片。后来改到炉门侧上方约30度俯角,距离炉口3到4米,画面里炉门开口占画面下半部分,背景是车间墙壁,对比度好很多。

参数设置上,曝光用自动但限制上限,避免炉门打开瞬间过曝;白平衡固定,不要用自动,否则烟色会随光线漂移;增益调低,噪点少。镜头选6mm定焦,视野刚好覆盖炉门和周边一米范围。如果炉口尺寸变化大,可以用2.8-12mm变焦镜头,但变焦后要重新标定ROI。

实操心得:装好后先录一段包含加料、扒渣、出料全过程的视频,回放检查有没有反光、水雾、镜头脏污。镜头前加个简易气帘或防尘罩,熔炼车间粉尘大,镜头两天不擦就糊了。

2.2 数据采集策略与样本均衡

我采集了连续两周的视频,覆盖三个班次、不同天气、不同原料批次。抽帧策略是每秒抽1帧,但遇到状态切换时加密到每秒5帧,因为切换瞬间的样本最有价值。最终原始帧约12万张,去重和筛选后保留约3万张。

样本均衡很关键。实际生产中无烟状态占60%以上,浓烟可能只占10%。如果直接训练,模型会偏向无烟。我的做法是:无烟随机下采样到1万张,淡烟和浓烟各保留1万张左右,再补充一些边界样本,比如刚起烟、烟将散尽的过渡帧。最终训练集2.8万张,验证集4千张,测试集4千张,三类基本均衡。

2.3 标注规范与质量控制

标注用LabelImg或CVAT都行,但规范必须统一。我写了三页的标注手册,核心几条:

  • 只标注炉门开口区域内的烟,炉门外飘散的烟不算。
  • 火焰、热气、水蒸气不计入烟尘。
  • 烟尘遮挡面积超过开口区域70%判浓烟,30%到70%判淡烟,低于30%判无烟。
  • 画面模糊、镜头脏污、完全过曝的帧直接丢弃,不标注。

标注员培训后先标500张,我逐张检查,分歧率控制在5%以内才开始批量标。最终3万张里,我抽检了3000张,错误率约2.1%,主要是淡烟和浓烟的边界帧。这些边界帧后来单独拿出来做难例挖掘,对提升模型鲁棒性帮助很大。

2.4 数据增强与预处理

工业场景不像自然图像,增强不能乱用。我用的增强包括:随机水平翻转、亮度对比度微调(±10%)、高斯噪声、随机裁剪(裁掉边缘5%到10%)。不用垂直翻转,因为炉门上下方向有物理意义;不用大角度旋转,摄像头是固定的。

预处理统一到224×224,归一化用ImageNet均值方差。这里有个细节:炉门区域只占原图一部分,我先把ROI裁出来再缩放,而不是整图缩放。ROI用固定坐标,因为摄像头位置不动。如果摄像头可能被碰歪,加一个基于炉门边缘的自动校正,但那是后期优化,第一版固定ROI够用。

3. 模型训练与边缘部署全流程

3.1 训练环境与基础配置

训练在本地工作站上跑,单卡RTX 3060 12G,PyTorch 1.13,CUDA 11.7。数据加载用DataLoader,batch size 64,num_workers 8。优化器用AdamW,学习率3e-4,余弦退火,权重衰减1e-4。损失函数用交叉熵,但给浓烟类加了1.5倍权重,因为浓烟漏报的代价比误报高——漏报浓烟可能导致环保超标,误报只是多开一会儿风机。

训练轮次设了80轮,实际在第52轮验证集准确率到峰值98.3%,之后开始过拟合。我保存了验证集最优的权重,同时用EMA(指数移动平均)平滑参数,最终测试集准确率97.8%,浓烟召回率98.5%,淡烟召回率96.2%,无烟召回率98.1%。

3.2 模型量化与推理加速

边缘盒子是瑞芯微RK3588,NPU算力6TOPS。PyTorch模型不能直接跑,要转成ONNX再转RKNN。转换过程中有几个坑:

  • ONNX opset版本选11,太高RKNN不支持。
  • 输入固定为1×3×224×224,动态shape在NPU上效率低。
  • 量化用混合量化,第一层和最后一层保持FP16,中间INT8,精度损失最小。

量化后模型大小从9.8MB降到2.6MB,单帧推理从FP16的28ms降到INT8的8ms。实测连续跑24小时,NPU占用率稳定在35%左右,盒子温度控制在55度以内,不需要额外风扇。

3.3 多帧投票与状态机设计

单帧分类会有抖动,比如烟刚起时模型在淡烟和浓烟之间跳。我加了一个长度为15帧的滑动窗口,窗口内多数投票决定当前状态。同时设计了一个简单状态机:

  • 当前状态为无烟,连续5帧浓烟才切到浓烟。
  • 当前状态为浓烟,连续10帧无烟才切回无烟。
  • 淡烟作为过渡态,切换条件放宽到3帧。

这样处理之后,状态切换次数从每分钟十几次降到两三次,中控室看曲线不再眼花。状态机参数可以根据现场烟尘变化速度调,反应慢的炉子可以把窗口拉长。

3.4 与PLC和除尘系统的联动

联动通过Modbus TCP。边缘盒子作为客户端,PLC作为服务端,盒子把当前状态写到一个寄存器:0无烟,1淡烟,2浓烟。PLC程序里做逻辑:浓烟持续3秒,引风机频率加到45Hz;淡烟维持30Hz;无烟降到20Hz。同时中控大屏用WebSocket推状态,每500ms更新一次。

注意:联动逻辑一定要加延时和死区,否则烟尘一闪就调风机,设备频繁启停容易坏。我在PLC里加了最小运行时间保护,风机频率变化间隔不低于30秒。

4. 现场常见问题与排查实录

4.1 模型误报漏报的典型场景

现场跑起来后,误报主要集中在几种情况:

问题现象可能原因排查方法解决措施
出渣时火光被判浓烟训练集火焰样本少回放误报帧补充火焰负样本,标注为无烟
镜头脏污导致全图模糊判淡烟图像质量下降检查镜头加镜头脏污检测,模糊度超阈值报警
夜间补光不足判无烟红外灯功率不够对比白天夜间换大功率补光灯,或加夜间增强
水蒸气被判淡烟水汽和烟纹理相似观察季节变化补充水蒸气样本,标注为无烟
烟刚起时在淡烟浓烟间跳边界样本不足看置信度曲线增加过渡帧训练,调状态机窗口

4.2 边缘盒子稳定性问题

盒子跑久了会遇到内存泄漏、NPU驱动崩溃。我做了几件事:推理进程用systemd守护,崩溃自动重启;每24小时定时重启一次推理服务;日志轮转,避免磁盘写满。另外盒子电源要稳,车间电压波动大,加了个小UPS,实测能扛住瞬间掉电。

4.3 网络与数据回传

RTSP流如果直接拉,带宽占用高。我在盒子上做了抽帧,只把推理结果和关键帧截图回传,原始视频本地存7天。关键帧是状态切换前后各5秒的图,用于事后追溯。回传用MQTT,轻量且支持断线重连。

4.4 模型迭代与远程更新

现场数据分布会变,比如换了原料、改了工艺,模型需要迭代。我在盒子上留了一个模型更新接口,通过内网上传新模型文件,校验MD5后热替换,推理服务自动重载。更新过程不影响PLC联动,因为状态机在业务层,模型只负责出概率。

5. 实操心得与后续扩展方向

这个项目从立项到稳定运行花了约三个月,其中数据采集和标注占了一半时间。我的体会是:工业视觉项目,算法只占三成,七成在数据和现场适配。模型精度从95%提到98%可能只要一周,但从98%到稳定运行要解决镜头脏污、光照变化、设备抖动、网络中断一堆杂事。

几个具体建议:第一,标注规范一定要先小批量试标,分歧率降下来再铺开,否则返工成本极高。第二,边缘部署优先选支持INT8量化的芯片,FP16在工业盒子上往往跑不动。第三,联动逻辑一定要加延时和死区,别让算法直接控设备。第四,留好远程更新和日志回传,现场跑起来后你不可能天天去车间。

后续可以扩展的方向:一是加烟尘浓度回归,不只分类,还输出一个0到1的浓度值,更精细地控风机;二是多炉口统一管理,一个盒子跑多路视频,分摊成本;三是结合炉内温度、风量等时序数据做多模态融合,提前预测烟尘变化趋势。这些我还在试,等跑稳了再整理出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 6:25:00

ESP32/ESP8266在线开发工具全指南:浏览器搞定仿真、编译与烧录

1. 被工具链劝退的人,这次有救了做 ESP32 和 ESP8266 开发的朋友,应该都体会过那种“还没开始写代码,先被环境折腾到怀疑人生”的滋味。装 ESP-IDF 要拉一堆 Python 依赖和编译工具,用 Arduino IDE 又嫌生态太碎,配 Pl…

作者头像 李华
网站建设 2026/10/2 6:25:00

芯片内置时钟辐射:RE超标根源与全链路抑制方案

1. 问题不是“滤波没用”,而是你滤错了对象“RE超标”这个词,在EMC实验室里几乎和咖啡因一样常见——工程师盯着频谱仪上那根顽固凸起的尖峰,手指无意识地敲着桌面,嘴里念叨着“再加个磁珠”“换更大电容”“把滤波器往PCB边缘挪两…

作者头像 李华
网站建设 2026/10/2 6:25:00

智能家居硬件开源项目怎么找?四大渠道与实操指南

想做智能家居硬件,大多数人的第一步都会卡在同一个地方:找不到一个“能照做”的开源项目。打开 GitHub 搜“smart home”,立刻弹出一万多个仓库,软件面板、固件、传感器驱动、语音助手混在一起,你根本分不清哪个是真正…

作者头像 李华
网站建设 2026/10/2 6:24:56

ESP32-P4NRW32X高配RISC-V MCU实战:存储调度、HMI与边缘AI落地

拿到一块丝印着ESP32-P4NRW32X的板子时,很多人第一反应都是懵的:它到底是官方的 ESP32-P4 开发板,还是哪家第三方模块厂商订制的封装?我最早也被这个后缀绕晕过,后来查了原理图、翻了官方物料编码习惯,才确…

作者头像 李华
网站建设 2026/10/2 6:24:55

无线脑电原型实战:BW16+ESP32-CYD低成本实时波形显示

做脑电相关的东西,大多数人第一反应是贵、难、医疗级。但这两年开源脑电模块和低成本自带屏的开发板把门槛压得很低。我这次用一块 BW16 无线模组、一块 ESP32-CYD 彩色屏开发板,再接一颗常见的单通道脑电模块,搭了一条从头皮到屏幕、再到手机…

作者头像 李华
网站建设 2026/10/2 6:24:52

Vector全解析:中断向量表、C++容器与CANoe工具链

看到“等了30年,Vector真的放大招了”这个标题,我第一反应是:哪个Vector?因为这个名字在三个完全不同的圈子里同时出现。汽车电子工程师想到的是Vector Informatik那套CANoe/CANape工具链;嵌入式开发想到的是MCU上电时…

作者头像 李华