资讯动态

钢水罐实例分割落地:Mask R-CNN+RegNetX与未定义物体检测实践

发布时间:2026/10/23 5:14:13 来源:尧图企业网站定制
连铸车间的监控大屏上我盯着一幅钢水罐图像愣了几秒——罐体表面的氧化铁皮反光、水口处涌出的钢水亮斑、渣线位置的侵蚀纹路在普通目标检测模型眼里全是特征干扰。真正让我下决心换方案的是现场安全员的一句话“我们最怕的不是认不出钢水罐而是画面里突然出现一个不该出现的东西系统却毫无反应。”那之后就立项做了这套系统技术路线锁定在Mask R-CNN与RegNetX骨干网络的组合上目标不只是认出钢水罐还要把未定义物体没有训练标签的异常物一并纳进感知范围。这篇文章把我踩过的坑、调过的参数、最终落地的推理链路全部写出来给做工业视觉检测、特别是做高温场景实例分割的朋友一个还原度足够高的参考。1. 钢水罐检测的难点剖析为什么这一场景不能只做目标检测1.1 高温场景下的成像特性与视觉干扰钢水罐在连铸车间的状态是动态的罐体从预热工位到受钢工位再到浇钢工位表面温度从几百摄氏度到上千摄氏度不等。可见光相机在这种环境下获取的图像普遍存在三个问题。第一是热梯度引起的背景辐射噪声罐体边缘往往会发虚因为高温空气的折射率变化导致画面局部抖动第二是反射耀斑尤其是氧化铁皮和液态渣层形成的镜面反射区域灰度值可能和钢水罐本体的目标区域几乎一致第三是烟尘颗粒在镜头前的随机遮挡会让罐体轮廓出现断裂。这些问题叠加起来对视觉算法的要求就不仅仅是框住目标那么简单。普通的目标检测输出的是边界框矩形但钢水罐是悬浮在复杂背景中的一个高温物体工作人员更需要知道罐体的精确轮廓——罐口是否结壳、渣线侵蚀到哪个位置、罐底有没有异常凸起物。只有像素级的分割掩膜才能提供这些信息。1.2 实例分割为什么是刚需我在方案选型时也犹豫过直接用YOLO系检测器加分割头行不行实测下来问题主要出在目标之间的相互遮挡和粘连上。连铸车间的钢水罐经常多台并排停放罐体之间间距小顶部的水口、透气砖、吊耳等部件又会互相遮挡。YOLO的分割方案本质上仍是基于网格的密集预测对重叠实例的分离能力比较弱。Mask R-CNN走的是两阶段路线第一阶段用区域建议网络RPN生成候选区域第二阶段对每个候选区域进行ROI Align池化再并行输出分类、回归和掩膜。每个实例独立生成掩膜的机制让它天然适合工业现场这种遮挡严重、实例密集又需要精确边界的场景。我在一个模拟现场数据集上做过对比同样条件下Mask R-CNN架构的掩膜IoU比单阶段分割方案高出约0.13这个差距在钢水罐渣线检测这类需要看边界细节的任务里非常明显。1.3 未定义物体这个需求是怎么被逼出来的项目推进到一半客户提了一个需求钢水罐周围如果出现非预期的物体比如遗落的工具、脱落的耐火材料碎块、异常侵入的异物系统也要给出告警。问题在于这类物体的类别在训练集中根本不存在传统分类思想下的模型对这种未知类别会强行归类到已知类中导致漏报或误报。我把这个问题拆成两层第一层是这个位置是不是有实体物体第二层是这个实体是不是已知定义的类别。第一层可以通过分割掩膜的前景概率来判断第二层则需要在特征空间里做分布度量。这决定了整个项目不能只训一个闭集分割模型还得保留一条异常感知通路。模型选型最终落在Mask R-CNN上也因为它的ROI特征可以很方便地复用于这种开放空间的判断。2. RegNetX骨干网络的选型逻辑速度还是精度2.1 ResNet被替换的原因Mask R-CNN最早的标配骨干是ResNet50或ResNet101但我在实际部署中明显感觉到两个痛点。一是计算量偏大工业现场用的工控机GPU往往是老型号的专业显卡算力有限ResNet101在1920×1080分辨率下跑一次前向推理就要消耗大量时间留给后处理的时间窗口被压缩得很厉害。二是ResNet的倒瓶颈结构在特征复用上存在冗余它的skip connection是简单恒等映射网络表达能力虽然够但同等算力下特征效率偏低。RegNetX的设计思路来自对网络设计空间的系统搜索。它把网络宽度、深度、组宽度这些超参数放进一个受限的设计空间里通过复杂度正则化搜索出一系列性能接近帕累托最优的骨干结构。简单来说RegNetX在结构上比ResNet更精打细算同样的FLOPs能换来更高的分类精度。2.2 RegNetX在Mask R-CNN里的具体工作方式我把骨干网络切成四个阶段每个阶段的特征图分别进入特征金字塔网络FPN的不同层级。RegNetX的每个block包含一个1×1的瓶颈卷积加一个3×3的分组卷积再加一个1×1的恢复卷积分组卷积的组数由设计空间搜索确定。Block之间用一个简单度参数控制通道数扩张速度这种严格的宽度递增规则让特征信息在不同尺度上的分布更均匀。在钢水罐检测这个任务里最受益的是FPN的P2层高分辨率低语义特征和P2-P5之间的跨尺度融合。钢水罐的体积大罐口细节小两者对特征尺度的需求差距很大。RegNetX的高效通道配置让P2层不至于因为计算预算不够而被压缩罐口的孔洞结构、吊耳边缘这些小目标特征能保留到ROI Align阶段。2.3 我选用的具体配置与推理实测我最终锁定的是RegNetX-3.2GF版本配合FPN输入分辨率固定为1344×768。训练时的batch大小是8混合精度训练开启优化器用带动量的随机梯度下降初始学习率0.02配合线性warmup。推理时先用TensorRT把模型导出为FP16精度整图检测加掩膜后处理单帧耗时约68ms折算下来每秒能处理接近15帧满足现场监控系统对连续画面的基本需求。这里有个容易忽略的坑RegNetX的预训练权重基于ImageNet分类任务但Mask R-CNN训练时的下采样率是固定的。如果RegNetX最后一个阶段的步长设置不正确FPN的P5层输出的感受野会与C5层不匹配导致大目标检测时掩膜边界出现系统性偏移。我在调这个的时候花了整整两天最终的解决办法是在pytorch的backbone配置里给stem层补充一个3×3的stride2卷积确保输出步长严格对齐标准的32像素。3. 数据集构建与标注策略钢水罐场景的独特之处3.1 现场采集与清洗任何下游算法都受限于上游数据质量钢水罐场景尤其明显。我最初用网上公开的工业视觉数据集做预训练效果好差参半于是决定下现场自采。采集设备是一台近红外增强的黑白工业相机加装窄带滤光片波长选择对应钢水辐射较强的谱段能有效压低烟尘干扰。采集策略分三个阶段清晨低光照期采集罐体预热状态中点时间采集受钢状态夜班采集浇钢状态。每个状态至少覆盖三台不同损耗程度的钢水罐。得到的原始视频经过关键帧提取、模糊度评分、去重后保留下约5200帧有效样本。这一步要注意的是正负样本比例纯背景帧别删光因为RPN的负样本采样需要大量背景上下文否则训练出的建议网络会对罐体周围的区域过于敏感。3.2 标注类别的粒度设计钢水罐场景的类别体系我做了四层罐体主体、渣线区、罐口边缘、吊耳。标注工具是面性标注软件多边形闭合区域直接生成二值掩膜。类别粒度值得多说一句渣线区和罐体主体原本是同一种材料但分开标注后模型能学到两者在纹理和边缘上的差异对状态判断很有价值。标注过程中遇到一个棘手问题——罐体表面附着的小块渣壳大小、形状随机和罐体本身几乎融为一体。刚开始标注员凭感觉把它们全标成罐体结果模型分割边界变得混乱。后来我调整了标注规范凡是面积小于罐体总面积5%的附渣统一归到背景类让模型学会忽略它们面积超过这个阈值的独立标为罐体附着物作为特殊类参与训练。这样一来模型对罐体本体的边界判定反而更干净了。3.3 数据增强的边界控制钢水罐图像的增强不能无脑套通用目标检测的增强策略。像随机裁剪和大幅旋转这类几何增强会在罐体边缘引入过多的人工痕迹因为真实场景中罐体的长宽比和姿态范围其实很有限。我最终保留的增强手段是亮度扰动、小角度旋转±5度以内、轻微缩放和椒盐噪声注入。有一项增强效果出奇地好在训练图像上随机叠加热浪扭曲效果——对局部区域做正弦偏移置换。这让模型对高温气流导致边缘抖动产生了显著的鲁棒性验证集掩膜IoU直接提升了2个百分点。这项增强原本是模拟图像去雾里常用的手段用在钢水罐数据上非常有针对性。4. 未定义物体检测实践从闭集分割走向开放空间感知4.1 掩膜解耦与背景占用分析我的技术路线是让系统对每个像素做两级判断。第一级是Mask R-CNN原有的前景/背景分割输出目标区域掩膜。第二级是把掩膜以外的部分当成候选区域用背景模型判断是否存在未定义物体。具体做法是把推理阶段得到的掩膜做连通域分析对每个连通域计算三类特征面积、填充度、边缘梯度强度。如果某个掩膜区域的填充度低于阈值同时边缘梯度强度异常高就判定它可能是训练集未覆盖的新物体。这个逻辑的出发点很简单已知物体在分割结果中通常表现为紧凑、完整、边界平滑的掩膜而未知物体的掩膜往往是松散的碎片或带尖锐边角的形状。4.2 基于ROI特征的分布度量仅仅靠掩膜形状特征有三个局限无法区分真正的未知物体和已知类在遮挡条件下的形变。于是我在ROI Align之后接入了一个轻量的特征分布度量模块。思路是对已知类别在特征空间的分布做一个统计建模推理时把每个ROI的特征向量映射到马氏距离空间距离超过置信阈值的ROI被标记为疑似未知物体。这个模块放在两个FC层之后向量维度是256维。训练时只喂已知类的ROI特征让度量模块学会表征已知类特征分布的中心和协方差。推理时它并不改变Mask R-CNN的预测结果只作为独立的异常打分器输出一个可疑度分值。现场测试中这套机制成功捕捉到了两个训练集从未出现过的物体一个空调检修工遗落的扳手一块脱落的滑动水口滑块。4.3 伪代码级别的推理逻辑输入image, model(trained Mask R-CNN RegNetX) 输出instance masks, known labels, abnormal regions 1. model(image) - detections, masks 2. for each detection in detections: 3. roi_feature model.roi_head.get_feature(detection) 4. mahalanobis_distance metric_module.compute_distance(roi_feature) 5. if mahalanobis_distance threshold_unknown: 6. detections[i].is_unknown True 7. 8. segmentation_masks masks mask_threshold 9. connected_comp mor.components(segmentation_masks) 10. for each comp in connected_comp: 11. area_ratio comp.area / min(MaskArea) 12. fill_ratio comp.area / comp.bounding_rect_area 13. edge_strength comp.mean_edge_gradient 14. if fill_ratio 0.5 and edge_strength high_edge_threshold: 15. candidate_new_region.append(comp) 16. 17. final_abnormal union(unknown_detections, candidate_new_region) 18. trigger alarm if final_abnormal is not empty第10到15行的逻辑是面对一个很现实的问题当未定义物体与已知目标重叠时ROI特征度量的可靠性会下降。比如脱落的耐火砖恰恰搭在钢水罐边缘掩膜一部分与罐体重叠一部分悬空。这时掩膜形状特征反而更关键悬空部分的填充度和边缘梯度暴露了它的陌生性。所以实战中我是两条线索一起用逻辑与结果合并后进入告警判断。4.4 误报控制与时间维度平滑告警系统最怕的就是误报太多把现场人员搞疲劳。未定义物体检测本身比已知类检测更容易误报因为未知类没有真值可对照。我引入了时间维度的确认机制单帧出现可疑区域不触发告警连续三帧或两秒钟内累计出现五次以上才触发。这个策略直接砍掉了超过一半的单帧噪声告警代价是检测延迟增加了0.5秒左右但现场对这种延迟是可以接受的。5. 训练与调参实战记录那些数据集之外的硬骨头5.1 锚框设定与正负样本采样钢水罐在图像中的尺寸跨度很大从全画面的大型主体到远端的微小目标都可能出现。标准Mask R-CNN的锚框是五级尺度32到512像素加三种宽高比这对钢水罐场景不够用。我把锚框扩展到七级尺度额外增加1024和2048两档宽高比调整为{0.8, 1.0, 1.4}。原因是钢水罐整体偏竖直的长条形0.8的宽高比能更好贴合罐体的纵向轮廓。RPN阶段默认的正样本IoU阈值是0.7负样本是0.3。我在调试时发现0.5到0.7之间的锚框在钢水罐边缘大量存在这些对于掩膜分支来说是有效学习信号。于是我把正样本采样阈值放宽到0.5代价是负样本采样难度增大。配合在线困难样本挖掘每次mini-batch中的困难样本占比保持在一个合适的水平掩膜边界的精细度有了肉眼可见的提升。5.2 损失函数设计与权重策略Mask R-CNN的训练目标包含五个损失RPN分类损失、RPN回归损失、头部分类损失、头部回归损失和掩膜分割损失。默认版本里掩膜损失的权重是1.0但在实际训练中钢水罐场景的掩膜精度几乎决定了渣线侵蚀判断的准确度我把掩膜损失的权重提高到了1.5。另外我加了辅助的边界感知损失对掩膜边缘像素的梯度做一个L1惩罚项。这个损失帮助模型在罐体轮廓处产生更锐利的分割边界。实测掩膜边界平均像素偏移从原来的约3.6像素降到了2.1像素。代价是训练收敛速度下降了约10%但换来的是现场可用的精度值得。5.3 超参数记录与调参心得我最终用的关键超参数组合附在下面方便直接参考输入分辨率1344×768配合中等尺度的锚框比例兼顾速度和细节主干网络RegNetX-3.2GF FPN输出特征通道数256优化器SGD动量0.9权重衰减0.0001学习率初始0.02训练到第16轮时降到0.002第22轮降到0.0002总训练轮数26轮每轮约3200步正负样本比例ROI采样时保持正负样本比例接近1:3掩膜分支输出分辨率28×28训练在单卡GPU上完成混合精度开启后显存占用约11GB。收敛过程的观察点是验证集掩膜IoU曲线在16轮之前上升很快之后进入平台期。我那个2.1像素的边界精度是在第22轮之后才出现的所以如果你发现模型掩膜边界一直粗糙别急着改网络结构先看看训练轮数够不够预训练权重迁移是否充分。6. 部署与现场稳定性工业系统的另一半工程量6.1 TensorRT导出与工作站部署训练好的PyTorch权重不能直接上工控机我把它导出为ONNX再转TensorRT引擎精度选项用FP16。这里有几个容易踩的坑RegNetX的grouped convolution分组卷积在TensorRT某些版本中优化不充分会退化成普通卷积导致推理速度大幅下降。解决方法是升级到支持的版本并在基准测试中实际验证速度。显存优化也值得一提。工控机的GPU显存有限而Mask R-CNN需要保存中间特征图和ROI特征显存峰值出现在FPN特征金字塔阶段。我把输入大小限制在1344×768后单帧峰值显存大约4GB。如果要跑多路视频流建议在训练时就按实际的batch size和输入尺寸评估显存需求别等部署时才调整。6.2 光斑误检的时序滤波处理现场测试阶段最头疼的问题来自钢水罐浇钢口下方的光斑。钢水流出时亮度极高会在罐体下部形成强光反射反射区域的分割掩膜有时会误检成罐体附着物或异常物体。单帧看这些区域的边缘和梯度确实和真实物体很像视觉算法几乎无法在单帧范围内区分。我加了两个后处理模块一是亮度分布检查钢水光斑通常在水平方向上呈渐变分布而真实物体边缘是突变式的用边缘突变率过滤一部分光斑二是光斑的时间闪烁特性光斑的灰度值波动频率较高而真实物体的灰度变化是缓慢的。这个差分特征滤除了大量现场光干扰造成的误检。6.3 与现场控制系统的联动结构部署到现场时视觉系统输出的告警最终要交给PLC联动处理。我的方案是视觉工控机通过工业以太网与PLC建立通信告警信息以结构化数据上报事件类型已知类状态/疑似未知物体、置信度、区域坐标、时间戳。PLC收到告警后会执行声光报警和人机界面弹窗同时触发对该区域摄像头的录像标记。联动结构里最容易被忽视的是时间同步。工业现场的工控机时钟可能和PLC时钟有偏差录像标记时间不准事后追溯根本找不到对应片段。我后来在系统里加了NTP时间同步模块确保视觉服务器与PLC保持毫秒级偏差这个细节在我之后复盘时被认为是整个部署工程里性价比最高的一项改进。7. 踩坑回顾与可复用的经验清单7.1 迁移学习中的分类语义漂移我把在通用场景预训练的Mask R-CNN权重直接拿来初始化钢水罐模型时发现前几轮训练损失下降异常缓慢。原因是通用数据集里的类别语义分布和钢水罐场景差异太大模型一开始就把大量关注点放在提取那类不相干的纹理上。解决办法是分两步走先用冻结骨干的方式跑一个小epoch让颈部以上头适应新数据再解冻全部参数做全量微调。这样收敛速度明显加快最终精度也更高。7.2 关于未定义物体训练的哲学训练过程中我反复被组员问既然要检测未知物体能不能先用GAN生成一堆假未知物体混进训练集我试过效果不理想。因为生成的物体特征和真实钢水罐场景中的物理物体差异太大模型学到了生成的生硬边缘作为判别信号实际部署时反而对真实的工具、碎片不够敏感。我的结论是未定义物体的检测能力不靠见过更多奇怪东西来获得而是靠对已知东西的精确建模来反推。把已知四个类别的特征空间边界刻画得越紧新物体落入边界之外的概率就越高。这也是为什么我为这个任务选择的骨干网络必须足够高效——特征提取的质量直接决定了整个异常感知通路的上限。7.3 如果从零做一次我会改变什么从项目复盘角度看我会更早地引入现场在线标注反馈机制。当时场景中不断出现的新物体都是通过离线采集、人肉标记后周期更新模型周期至少在两周左右。如果能在告警触发时顺便把现场图像缓存下来定期推送至标注平台让模型在一个月内快速吸收新的未定义物体特征系统的实用价值会提高一个量级。另外我会在一开始就统计清楚光斑、烟尘这些背景干扰的时间分布特征而不是等项目上线后才在误报中逐个排查。后验补救虽然有效但代价是现场等待时间变长给用户的耐心账户透支了不少。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑