news 2026/10/27 19:43:40

钢铁缺陷识别工程实践:成像链路、模型训练与部署闭环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
钢铁缺陷识别工程实践:成像链路、模型训练与部署闭环

1. 从车间里的那束手电光说起

如果你在冷轧精整线的出口段站过一个班,大概会记住这样一个画面:带钢以每秒十几米的速度从眼前掠过,质检员站在操作台上,手里拿着强光手电,眼睛盯着钢带表面,靠反光的变化去捕捉那些一闪而过的麻点、划伤和折印。一个班下来,眼睛是花的,判断标准也在悄悄漂移——同一条划痕,上班第一小时判为降级,第六小时可能就放行了。这不是人的态度问题,是生理极限问题。

钢铁缺陷识别这件事,本质上要解决的就是"人眼看不住、规则写不完"两个矛盾。人眼看不住,是因为速度太快、时间太长、注意力有限;规则写不完,是因为传统机器视觉靠的是人工设计特征——阈值分割、形态学运算、纹理统计量、边缘检测,这些方法在实验室打好光的样片上跑得很漂亮,一到现场就崩,原因很简单:钢铁表面的背景纹理太复杂了,轧制纹、氧化铁皮、乳化液残留、水渍、反光带,全都在干扰你,而缺陷本身的形态又变化多端,同一种"划伤",有细如发丝的,有宽如指甲盖的,有沿轧向的,也有斜向的,光照稍微偏一点,灰度分布就面目全非。

深度学习进这个场景,靠的不是"高级",而是它把"特征怎么提"这件事从工程师手里拿走,交给了数据。你给它几千张带标注的缺陷图,它自己去找那些人类说不清楚但确实存在的纹理模式。这也是为什么这几年从热轧到冷轧、从镀锌到中厚板,越来越多的产线开始尝试这条路线。

这篇内容面向的是准备动手做这件事的人:可能是刚接到任务的算法工程师,可能是产线上负责质量信息化的技术员,也可能是想搞清楚这套东西到底靠不靠谱的工艺人员。我会把从类别体系设计、成像链路搭建、模型选型、训练调参到现场部署的完整链路讲一遍,重点放在那些文档里不会写、但现场一定会遇到的问题上。

先说一个结论,可能有点反直觉:在钢铁缺陷识别项目里,模型往往不是最难的环节,最难的是缺陷类别怎么定、图像怎么采、误报怎么收场。这三件事决定了项目的上限,模型只是把上限兑现出来。后面几节会反复回到这个判断上。

2. 缺陷类别体系没定清楚,后面全是返工

2.1 类别不是越细越好,而是越"可执行"越好

我见过不少项目一上来就列了三十多个缺陷类别,热轧的结疤、麻点、压印、辊印、边裂、夹层、氧化铁皮压入、塔形、镰刀弯,冷轧的孔洞、折印、乳化液斑、锈斑、划伤、擦伤、平整纹,镀锌的锌粒、锌疤、漏镀、镀层脱落……列得挺全,问题是标注的人分不清,模型也学不动。

正确的做法是回到业务本身问一个问题:这些缺陷在下游工序里,处理方式是否真的不同?如果"划伤"和"擦伤"在判定上走的是同一套降级规则、同一个客户接受标准,那它们在模型里就应该合并成一个"线性机械损伤"类。反过来,如果"氧化铁皮压入"需要单独统计反馈给热轧工序做工艺追溯,那它就必须独立成类,哪怕它和"麻点"在图像上高度相似。

我在一个模拟项目里做过这样的对照:初始类别体系有 21 类,训练出来的模型整体准确率看着还行,但混淆矩阵显示有 6 组类别互相串得厉害,人工复核发现这 6 组里有 4 组本来就是同一个工艺成因、同一个处置方式。合并成 15 类之后,模型的有效识别率提升了接近 8 个百分点,标注速度也快了一截。这不是模型的功劳,是类别体系理顺了。

所以在项目启动的头两周,我会坚持做一件事:拉上质检、工艺、下游工序三方,一起把缺陷字典写出来。每个类别必须包含四样东西——典型图像、边界定义、与其他类别的区分要点、判定阈值。缺一样,后面标注就会出分歧。

2.2 一份能落地的缺陷字典长什么样

下面这张表是我习惯用的格式,字段不多,但每个字段都在解决一个具体的分歧点:

字段作用举例说明
类别编码唯一标识,用于标注工具和数据库D-LIN-01
类别名称现场通用叫法线性划伤
典型图像至少 5 张不同光照、不同严重程度的样片存档在共享目录
形态定义长宽比、走向、边缘特征长宽比大于 8,走向与轧向夹角小于 15 度
区分要点和最容易混的类别怎么分与"折印"的区别:折印有周期性重复,且伴随轻微厚度变化
严重度分级轻、中、重三档的判定依据长度小于 50mm 为轻,50 至 300mm 为中,超过 300mm 为重
处置规则判级、降级、切除、需人工复核中度及以上降级,重度需切边处理

这张表看起来是管理工作,实际上直接决定了标注质量和模型的收敛速度。我踩过的坑是:项目做到一半,工艺那边更新了客户接受标准,"轻微锈斑"从可接受变成了需记录,结果之前的标注全得重来一遍,因为当时的标注根本没区分严重度。严重度这个维度一定要在第一天就加上,哪怕模型一开始只做类别判断,后面要做分级时也不用重新标。

2.3 类别不平衡这件事,从标注阶段就要开始管

钢铁缺陷的分布极度倾斜。正常表面占 99% 以上,剩下的 1% 里,麻点和划伤可能又占了一大半,真正稀有的边裂、夹层可能几千张图里才出几例。这种长尾分布不是训练阶段靠损失函数就能完全拉平的,标注阶段就得有意识地补。

我的做法是建一个"样本台账",按类别记录当前样本数,设定最低样本门槛——比如每个类别至少 500 个独立实例(不是 500 张图,因为一张图里可能有多处缺陷)。达不到门槛的类别,要么去产线上主动"找"(比如调整排产计划,专门跑一批容易出边裂的规格),要么用合成的方式补(后面会讲),要么就诚实地承认这一类暂时不做,先上线能做的类,不要让一个只有 30 个样本的类别拉低整体表现。

提示:稀有类别的样本,宁可少而准,不要多而糊。我见过为了凑数把相似类别的图硬塞进来的,结果模型学到的是一团模糊的中间态,误报率反而更高。

3. 成像链路决定天花板,模型只能在下面跳舞

3.1 分辨率、行频、视场,这三个数是算出来的不是猜出来的

很多人接手项目第一件事是找模型,我的习惯是先算三个数:最小可检缺陷尺寸、相机分辨率、行频。算法很简单,但算错一个,后面全废。

假设现场要求能稳定检出 0.2mm 的麻点。按工程经验,一个缺陷至少要被 3 到 5 个像素覆盖,模型才能稳定学到它的形状特征,取中间值 4 像素,那么空间分辨率就是:

单像素对应实际尺寸 = 0.2mm / 4 = 0.05 mm/px

再假设这条产线的带钢宽度是 1250mm,如果只用一台线扫相机覆盖全宽,需要的像素数就是:

1250mm / 0.05mm/px = 25000 px

两万五千像素的线扫相机在市面上不是没有,但价格和后续的算力压力都很可观。更常见的工程做法是分成 4 台 8K 相机拼接,每台覆盖约 320mm 幅宽,像素数留一点重叠余量。这时候视场宽度就是 320mm,分辨率 0.04mm/px,比要求更宽松一些,属于合理的设计余量。

行频的计算同样直接。产线速度按 1.5 m/s(也就是 1500 mm/s)算,纵向分辨率要和横向保持一致,同样是 0.04mm:

行频 = 1500 mm/s ÷ 0.04 mm/px = 37500 Hz

三万七千五百赫兹,这个数超过了大部分常规线扫相机的行频上限,真按这个配置去做,要么降低速度、要么放宽分辨率要求、要么用多台相机做纵向分区。我列这个计算过程,是想说明一件事:成像参数的确定是产线速度和检出精度之间的硬约束博弈,"我想要更高的精度"这句话在现场是要付出代价的。

实际项目里我见过一种折中的方案:横向用高分辨率保证能看清细节,纵向分辨率适当放宽到 0.08mm,行频降到 18750 Hz,同时把检测目标调整为"长度方向的连续性"——因为水平划伤这类缺陷在纵向是贯穿的,纵向分辨率低一点不影响判断,只有垂直方向的点状缺陷会受影响。这种"按缺陷走向分配分辨率"的思路,是省成本又能保住效果的做法。

3.2 打光方式选错,再好的模型也白搭

钢铁表面缺陷的成像难点在于:它是一个高反光的金属曲面,缺陷有凸起的(锌粒、结疤)、有凹陷的(麻点、压印)、有纯色差的(锈斑、乳化液斑)、有纯几何的(划伤、折印)。这四类缺陷对光照的响应完全不同,用一种打光方式通吃是不可能的。

我一般会把光源方案拆成几路:

  • 高角度漫射光:整个表面被均匀照亮,适合看颜色和反射率差异,比如锈斑、乳化液残留。缺点是凸起和凹陷的对比度会被抹平。
  • 低角度暗场光:光线以很小的角度掠射表面,只有凸起或凹陷的边缘会亮起来,划伤、压印、锌粒这类几何缺陷在这路光下非常明显。这是钢铁表面检测里最常用也最有效的一路。
  • 同轴光:适合镜面程度高的冷轧板,能抑制反光不均。
  • 条形光加偏振片:对付水膜、油膜造成的干扰,偏振片能压掉一部分镜面反射。

多路光不是简单叠加,而是每一路配一个独立的检测通道,各自跑各自的模型或者共享骨干网络、分开输出头。这个设计的理由是:不同缺陷在不同光照下的信噪比差异太大,混在一起训练等于让模型自己去解一个光照混叠的谜题,白白浪费容量。

提示:光源的稳定性比光源的亮度更重要。恒流驱动、定期校准、灯珠老化的衰减曲线要记录。我遇到过一次批量误报,最后查出来是某一路条形光的一个灯珠坏了,导致该区域整体偏暗,模型的归一化被带偏了。

3.3 触发与同步:一个容易被忽略的隐性故障源

线扫相机靠编码器触发,编码器信号来自产线的测速辊或者电机编码器。如果触发信号不稳,图像会出现纵向拉伸或者压缩,缺陷的形状就变了,模型自然认不出。

这个问题在现场的典型表现是:同一卷钢,头部检测正常,中段开始误报增多。原因往往是产线在加速或减速段,测速辊打滑或者编码器分辨率不够,导致实际行频和图像行数不匹配。

解决办法有两个层面:硬件上,编码器尽量选高分辨率的,装在不会打滑的辊子上,信号线走屏蔽;软件上,在预处理阶段做一次"行间距校验",用图像里已知的周期性特征(比如轧制纹或者标记线)反推实际的行间距,做一次轻微的纵向重采样。这个校验模块代码不多,但能救回不少莫名其妙的误报。

4. 分类、检测还是分割:三条路线的真实取舍

4.1 先把问题拆成"找得到"和"认得准"两件事

新手常犯的错误是把"缺陷识别"当成一个单任务。实际上它至少包含两个子问题:缺陷在哪里(定位)和缺陷是什么类别(分类)。这两个子问题的难度和评价标准完全不同。

定位难在召回——漏掉一处缺陷,后面分类再准也没用。分类难在精度——定位框里到底是不是真缺陷、是哪一类,误判会直接变成误报。

所以工程上我更倾向于两阶段或者多任务的架构,而不是一个端到端的检测模型硬扛所有事情。

4.2 三条路线的适用边界

路线代表方法适用场景主要代价
图像分类ResNet、EfficientNet、ConvNeXt缺陷位置已经由前道工序或粗定位给出,只需要判类别依赖 ROI 裁剪质量,无法处理多缺陷共存
目标检测YOLO 系列、Faster R-CNN、DETR需要同时给出位置和类别,缺陷尺寸差异不太极端小目标召回是难点,标注成本高
语义/实例分割U-Net、DeepLab、Mask R-CNN缺陷边界不规则、需要算面积占比、需要精细判级标注成本最高,推理慢,边缘像素精度难保证
无监督异常检测PaDiM、PatchCore 一类缺陷样本极少、冷启动阶段、类别尚未定义只能判"异常"不能判类别,对光照变化敏感

我在实际项目里的组合通常是这样的:先用一个轻量的候选区提取模块做粗筛,再用分类网络做细判。粗筛可以是一个小分辨率的检测模型,也可以是基于传统方法的对比度分析——后者在很多场景下依然有效,因为缺陷区域和背景的局部对比度差异是客观存在的,用积分图做局部均值方差分析,速度快、不用训练、不会过拟合。

细判阶段的分类网络,输入是从原图裁出来的 ROI,尺寸归一化到 224 或 288。这里有个细节:裁剪时要留足够的上下文。只裁缺陷本身,模型看不到周围的正常纹理,反而难以判断;我一般会按缺陷外接框的 1.5 到 2 倍扩边,让模型能看到"缺陷和背景的对比关系"。

import cv2 import numpy as np def crop_with_context(img, box, scale=1.8, out_size=288): x1, y1, x2, y2 = box w, h = x2 - x1, y2 - y1 cx, cy = (x1 + x2) / 2.0, (y1 + y2) / 2.0 half = max(w, h) * scale / 2.0 H, W = img.shape[:2] nx1 = int(max(0, cx - half)) ny1 = int(max(0, cy - half)) nx2 = int(min(W, cx + half)) ny2 = int(min(H, cy + half)) patch = img[ny1:ny2, nx1:nx2] # 保持长宽比的前提下缩放,空白处用边缘像素填充 patch = cv2.resize(patch, (out_size, out_size), interpolation=cv2.INTER_AREA) return patch

这段代码没什么高深的东西,但扩边系数scale是个需要调的参数。我试过 1.2、1.5、1.8、2.2 四档,在模拟项目的数据集上,1.5 到 1.8 之间效果最稳,1.2 的上下文太少,2.2 以上缺陷在图中占比太小,分类头容易忽略它。

4.3 冷启动阶段,无监督方法值得一试

很多产线刚上线时,根本没有缺陷样本库——设备刚改造完,历史数据全是正常品。这时候硬着头皮去标几百个缺陷是不现实的。

无监督异常检测在这个阶段能救场。它的思路是:只用正常样本训练,学出一个"正常表面的分布",推理时任何偏离这个分布的局部区域都标为异常。这类方法不需要缺陷标注,几十张正常图就能跑起来。

但它有几个明显的局限,必须提前知道:第一,它只能告诉你"这里不对劲",不能告诉你"这是什么缺陷";第二,它对光照和材质的整体漂移非常敏感,换一个钢种、换一批轧辊,正常表面的纹理变了,模型就开始大面积误报;第三,阈值很难定,定高了漏检,定低了满屏框。

我通常把它定位成"上线初期的过渡方案"和"长期运行的兜底方案"——前者的意思是,用它先跑起来攒数据,等有标注了再切到监督模型;后者的意思是,监督模型总有覆盖不到的稀有缺陷,用一个异常检测通道做补充,至少能把它捞出来交给人工复核,而不是彻底漏掉。

5. 训练阶段的参数与技巧,哪些真有用哪些是玄学

5.1 数据增强在这里是个高风险动作

通用视觉任务里那套增强手段——随机旋转、颜色抖动、随机裁剪、MixUp——搬到钢铁缺陷上,有一半是帮倒忙的。

原因在于缺陷的语义和方向、颜色是绑定的。"划伤"基本都是沿轧向的,你把它随机旋转 90 度,它就变成了一个现实中不存在的形态,模型学到的是噪声。"锈斑"的颜色是它最重要的判别特征,你做一个强力的 HSV 抖动,等于把这个特征毁了。

我实际用下来比较安全的增强组合是:

import albumentations as A from albumentations.pytorch import ToTensorV2 train_tf = A.Compose([ # 小角度旋转,模拟相机安装的轻微偏差 A.Rotate(limit=8, border_mode=cv2.BORDER_REFLECT_101, p=0.5), # 亮度对比度微调,模拟光源衰减和曝光波动 A.RandomBrightnessContrast( brightness_limit=0.12, contrast_limit=0.12, p=0.6), # 轻微高斯噪声,模拟传感器噪声 A.GaussNoise(var_limit=(3.0, 12.0), p=0.3), # 轻度模糊,模拟对焦漂移 A.GaussianBlur(blur_limit=(3, 5), p=0.2), # 弹性形变,非常轻微,模拟带钢张力变化 A.ElasticTransform(alpha=1, sigma=8, p=0.2), A.Resize(288, 288), ToTensorV2(), ])

注意几个细节:旋转限制在 8 度以内,超过这个范围就不符合现场的实际分布了;亮度和对比度的调整幅度都压在 0.12,因为产线的光源是恒流的,实际波动不会太大,增强过头反而制造了不存在的困难样本;弹性形变的参数调得很温和,只是想模拟张力带来的轻微几何畸变。

有一个增强我是明确禁用的:水平翻转。初看好像没什么问题,但如果你仔细想过缺陷的物理成因,会发现某些类别的分布是有方向偏好的(比如边部的缺陷通常在一侧更密集),翻转之后这个统计特性就被破坏了。除非你能确认左右对称,否则不要开。

真正有效的增强不在通用库的列表里,而在缺陷合成上。Copy-Paste 的思路是:从已有缺陷图里抠出缺陷区域,贴到正常背景的不同位置上,生成新的训练样本。这个东西对稀有类别特别有用,一个只有 50 个样本的类别,通过合成能扩到 500 个以上。副作用是合成边界的融合痕迹可能被模型当成特征学到,所以贴的时候要用泊松融合或者羽化,不要硬贴。

5.2 损失函数和采样策略,先看数据长什么样

类别极度不平衡的情况下,交叉熵会倾向于把所有样本判成多数类。常见的对策有三类:重采样、类别加权、Focal Loss。

我的经验是:先看少数类的绝对数量够不够。如果稀有类别有 300 个以上的独立实例,用类别加权交叉熵(权重按类别频率的倒数开方,不要直接用倒数,太激进)就够了;如果只有几十个,那问题不是损失函数能解决的,得靠合成数据或者两阶段训练——先在平衡的子集上预训练,再在全量数据上微调。

Focal Loss 我一般只在检测模型里用,因为检测任务的正负样本比例更极端(一张图里可能有上万个候选框,只有几个是正的)。分类任务里用它,超参 α 和 γ 调起来太费劲,收益不明显。

还有一个细节:验证集必须按卷划分,不能按图片随机划分。同一卷钢上的缺陷高度相似(同一个轧辊造成的辊印会在整卷上重复),如果按图片随机划分,训练集和验证集里出现来自同一卷的相似样本,验证指标会虚高,你以为模型泛化得很好,上线之后才发现完全是另一回事。这个坑我在早期项目里踩得很实在,验证集准确率 96%,上线第一周误报率高得让操作工直接把系统关了。

5.3 阈值怎么定:用业务指标反推,不要用准确率

模型输出的是概率,概率到判定之间有一道阈值。这道阈值怎么选,是整个项目里最需要和现场对齐的地方。

准确率在这个场景下几乎没有指导意义。假设缺陷占比 1%,一个永远输出"正常"的模型准确率是 99%,但它完全没用。真正要盯的是三个数:

  • 漏检率(Recall):有多少真实缺陷没被检出。这个数直接对应质量风险,越低越好。
  • 误报率:单位长度或单位卷上的误报次数。这个数直接决定操作工愿不愿意用。
  • 每卷平均报警数:这是操作工最直观的感受指标。

这三者之间是此消彼长的关系。阈值调低,召回上去,误报也上去;阈值调高,误报下来,漏检上去。

我的做法是画一条 DET 曲线,然后在曲线上找一个"业务可接受点",而不是数学上的最优点。具体来说,先问清楚两个问题:现场每卷能容忍多少次误报?漏检的后果有多严重?

如果漏检会导致客户投诉甚至批量退货,那就要偏保守,宁可误报多一点;如果误报多了操作工会直接关掉系统,那就要偏激进。这个决策不是算法工程师能单方面定的,必须和质检主管一起定,而且定完之后要把这条曲线的数据留存下来,后面再有争议,拿数据说话。

提示:给操作工留一个"一键复核"的入口非常重要。模型报警之后,让人在两秒内能确认或否认,否认的结果自动回流成训练样本。这个闭环是系统能长期活下去的关键,没有它,模型只会随着时间推移越来越不准。

6. 从实验室到产线:部署链路上的硬约束

6.1 延迟预算是倒着算出来的

产线的速度决定了你的推理时间上限。这条约束是硬的,没有商量的余地。

假设带钢速度 15 m/s,单台相机横向视野 320mm,纵向按 0.5m 一段做检测(这个长度是留给后处理融合的),那么一段图像在相机视野中停留的时间是:

0.5m ÷ 15 m/s ≈ 33 ms

33 毫秒,这就是你从拿到完整一段图像到输出结果的极限。这里面还要扣掉图像传输、预处理、后处理、结果上报的时间,留给模型推理的预算大概只有 20ms 左右。

20ms 能做什么?在一张中端工业级显卡上,一个 ResNet-50 级别的分类网络跑单张 288×288 的图,大概 3 到 5ms;如果要做 20 个 ROI 的批量推理,可以用 batch 并行,摊到每个 ROI 上更便宜。但如果换成一个大分辨率的检测模型跑全图,20ms 就非常紧张了。

这就是为什么我前面说"粗筛加细判"的两阶段架构在工程上更划算:粗筛用的是小模型或者传统方法,成本极低;细判只对少数候选区做,批量推理。整体延迟可控。

6.2 加速手段的优先级

部署阶段的加速,我一般按这个顺序做:

  1. 先确认是不是模型的问题。很多时候瓶颈在数据拷贝、图像解码、颜色空间转换上,不在推理上。用 profiling 工具看一眼各阶段耗时,别一上来就想着量化。
  2. 转成推理引擎格式。ONNX 是中间态,再转成目标硬件对应的引擎,通常能拿到 1.5 到 2 倍的加速。
  3. 做 FP16 或 INT8 量化。FP16 基本无损,可以直接上;INT8 需要校准集,校准集必须来自真实产线图像,不能用随机噪声,否则精度掉得莫名其妙。我一般会保留两套引擎,量化版跑常规检测,原始精度版在离线复核时用。
  4. 批处理和流水线并行。相机采集、预处理、推理、后处理做成四个阶段,用队列串起来,各阶段并行跑,整体吞吐能提升不少。

裁剪模型的思路也要考虑。钢铁缺陷分类这个任务,其实不需要太深的网络——缺陷的判别特征主要是局部纹理和形状,感受野不需要太大。我试过把骨干换成轻量级的结构,参数量降了七成,精度只掉了一个多点,延迟降了一半多,这笔账很划算。

6.3 结果怎么呈现,比模型精度更影响使用体验

这一点很多人忽略。模型输出一个框和一个类别,这只是原始数据。操作工需要的是:这卷钢有没有问题、问题在哪、严重程度如何、要不要处理。

所以后处理层要做的融合工作包括:同一位置的多帧结果去重(线扫是连续采集的,同一处缺陷会在相邻几帧里重复出现)、按缺陷字典做严重度分级、按卷汇总生成报告、把缺陷位置映射回带钢的实际米数坐标(这样现场才能找到它)。

坐标映射这件事有个容易出错的地方:图像坐标到实际米数的换算依赖编码器计数,而编码器计数在换卷、停机、倒车的时候会跳变。必须有一套校验机制,用卷号和米数做双重索引,不能只信编码器。

7. 现场跑起来之后,真正的麻烦才开始

7.1 模型漂移是常态,不是意外

实验室里 95% 的准确率,上线三个月掉到 80%,这是常态。原因不是什么玄学,是很具体的物理变化:镜头积灰导致对比度下降、光源灯珠老化导致亮度分布改变、换了新轧辊导致表面纹理变化、换了钢种导致反光特性不同、季节变化导致车间温度湿度改变影响成像。

应对这个问题的核心不是让模型更强,而是建立监控。我一般会在系统里埋三类监控指标:

监控项采集方式异常判定处置动作
图像质量每千帧统计一次全局均值、方差、梯度能量偏离基线超过 3 个标准差触发镜头清洁或光源检查工单
报警分布按类别统计每小时报警数某类报警数突增 5 倍以上抽样人工复核,判断是真实缺陷还是误报
模型置信度分布统计预测概率的直方图高置信度样本占比明显下降说明输入分布漂移,考虑增量训练

这三类指标跑起来之后,很多问题能在爆发之前被发现。我印象比较深的一次,是图像质量的梯度能量指标连续两天缓慢下降,运维按提示去检查,发现是一路光源的驱动电流在漂,肉眼完全看不出来,但模型的误报已经在悄悄上升了。

7.2 误报的闭环处理,决定了系统能活多久

误报是必然会发生的,无法消除,只能管理。管理的关键是:让每一次误报都变成一次数据回流。

具体做法是给操作工一个极简的复核界面——报警弹出来,两个按钮,"确认"和"误报"。点了"误报"之后,这张图连同模型输出一起进到一个待处理队列。算法侧每周清一次队列,把确认的误报整理成负样本,加入训练集,重新训练一版。

这个循环跑起来之后,你会发现一个有意思的现象:误报率的下降不是线性的,前两个月降得特别快,因为模型在快速学习现场那些你在实验室里根本想不到的"假缺陷"——水渍、反光、标记笔迹、捆带压痕、甚至飞虫落在镜头上造成的阴影。这些东西没有任何一个公开数据集里有,只能靠现场喂。

我一般会把这个闭环的周期定成两周一次小版本更新,三个月一次大版本更新。小版本只做负样本补充,不动模型结构;大版本才考虑换骨干、加类别、改架构。这样风险可控。

7.3 几个用血换来的小经验

不要相信单一光照通道的稳定性。任何一路光源出问题,如果只有这一路在判,整个区域就瞎了。多路冗余不是为了提精度,是为了容错。

标注规范要版本化。缺陷字典改了,标注规范就得跟着改版本号,每张图的标注记录要带上版本号。否则半年后你根本分不清哪些标注是按老标准做的。

上线初期不要把阈值调得太激进。先用一个保守的配置跑两周,让操作工建立信任,再逐步收紧。一上来就追求高召回,满屏报警,人的第一反应是关掉它,后面再想让他们重新打开就难了。

留一个手动标注入口。让质检员能在系统里直接框出模型漏掉的缺陷,这些样本的价值比任何合成数据都高,因为它们是真实的漏检案例。

训练集和验证集的划分要按时间或者按卷,不要按图片随机。前面提过一次,这里再强调一遍,这是我在多个项目里验证过的最容易导致"验证集虚高"的错误。

记录每一次模型更新对应的数据版本和代码版本。出问题的时候能回滚,能复现。这个在项目后期模型迭代频繁的时候尤其重要,没有版本管理的模型迭代,最后一定是一团乱麻。

我自己在这个方向上做了几年,最大的体会是:这套系统的价值不在于模型有多准,而在于它能不能稳定地、可解释地、可持续地跑下去。一个 88% 准确率但每天稳定运行、误报可追溯、能自我迭代的系统,比一个实验室里 96% 准确率但上线两周就被关掉的系统有价值得多。技术选型的时候,把这句话放在心里,很多决策会变得清晰。

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

Git与GitHub零基础入门:版本控制、仓库推送与报错排查

第一次点开 GitHub 首页的人,十个里有八个会先愣上几秒:满屏英文、一排看不懂的按钮、右边还挂着一串像乱码的版本号。很多人就是在这一步退出去的,觉得自己"不是这块料"。其实 GitHub 新手阶段真正需要掌握的东西非常少&#xff0…

作者头像 李华
网站建设 2026/10/27 19:40:50

上下文模式(Context-Mode):让AI记住长对话与长任务的底层架构

“context-mode”这个词,最近高频出现在我的工作流里。说来有点奇怪,它并不是某个软件的固定功能键,也不是某项协议的标准名称,而是一类能力的统称——让工具在长对话、长文档、长任务里,始终记得“刚才发生了什么”。…

作者头像 李华
网站建设 2026/10/27 19:39:54

有机与无机的本质区别:从碳骨架、键合方式到生命系统

1. 从厨房灶台到显微镜下:为什么“有机”不等于“健康”,“无机”也不代表“危险”你有没有在超市买酱油时盯着配料表发过呆?看到“谷氨酸钠”就皱眉,看到“酵母提取物”却觉得天然;刷到短视频说“纯有机蔬菜不含农药”…

作者头像 李华
网站建设 2026/10/27 19:38:00

返利管理全链路解析:从政策设计到结算落地的配置与易错点

简介:这份PPT面向金蝶云星空V7.3的用户、实施顾问及电商分销业务人员,系统讲解返利管理模块的产品方案与操作逻辑,帮助解决返利政策制定繁琐、结算工作量大、多周期返利难以统一管理等实际问题。内容围绕需求背景、整体方案、基础数据设置与业…

作者头像 李华
网站建设 2026/10/27 19:36:10

地图瓦片与四叉树原理及Unity实现详解

1. 地图瓦片与四叉树原理深度解析第一次接触地图缩放功能时,我被那种丝滑的体验震撼到了——无论放大多少倍,地图都能瞬间加载出清晰细节。后来才知道,这背后是地图瓦片和四叉树算法的完美配合。今天我们就来拆解这套支撑着Google地图、百度地…

作者头像 李华
网站建设 2026/10/27 19:36:07

Intouch 2014 R2写SQL Server 2012与Excel日报实战

简介:这份文档面向使用 WonderWare Intouch 2014 R2 构建 SCADA 数据存储与报表的工程人员,聚焦 Intouch 连接 SQL Server 2012、写入数据并由 Excel 报表系统读取展示的实施流程,适合有一定 HMI 与数据库基础、需要配置对照和排错参考的读者…

作者头像 李华