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 整体系统架构
整套系统分四层:
- 采集层:炉门侧上方装一台200万像素工业枪机,PoE供电,RTSP推流,帧率25fps,实际抽帧到5fps做推理。
- 边缘推理层:一台带NPU的边缘计算盒子,跑量化后的分类模型,输出三类概率和置信度。
- 业务逻辑层:连续多帧投票,避免单帧抖动误报;浓烟持续超过3秒才触发除尘联动。
- 展示与联动层:中控室大屏显示当前状态,同时通过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的浓度值,更精细地控风机;二是多炉口统一管理,一个盒子跑多路视频,分摊成本;三是结合炉内温度、风量等时序数据做多模态融合,提前预测烟尘变化趋势。这些我还在试,等跑稳了再整理出来。