焊缝焊接处裂纹气孔飞溅缺陷检测数据集VOC+YOLO格式1494张6类别
做工业视觉这几年,我越来越认同一件事:算法模型的上限,其实在数据集阶段就定死了。很多刚入行的朋友拿到一个检测项目,上来就调YOLO参数、换Backbone、试各种注意力机制,折腾半个月mAP纹丝不动,最后发现是标注框偏了半个身位,或者负样本压根没覆盖现场的真实工况。焊缝缺陷检测这类任务尤其典型——现场环境复杂、缺陷形态多变、打光方案各异,没有一套靠谱的数据集打底,后面全是白费力气。
这套焊缝焊接处裂纹气孔飞溅缺陷检测数据集,总共1494张图、6个类别,同时给了VOC和YOLO两种标注格式,就是冲着“拿到就能训练”这个目标来的。不管你是做质检方案验证、算法选型对比,还是刚接触工业缺陷检测的学生,这套数据都能帮你省掉最脏最累的采集标注环节,直接把精力放到模型迭代和工程落地上去。下面我就从数据集结构、标注细节、训练调参到落地避坑,一条线讲透。
1. 项目整体定位与数据集结构解构
1.1 这份数据集到底解决了什么问题
焊接质量检测在制造行业里是刚需中的刚需。压力容器、汽车结构件、管道工程,哪个环节焊缝出了问题都是大事。传统的检测方式靠老师傅肉眼加放大镜,效率低且标准不一;好一点的企业上射线探伤和超声检测,但设备贵、速度慢,很难嵌到产线节拍里。所以近几年大家都在推视觉检测方案——把工业相机架到机械臂上或者固定工位,拍焊缝表面图像,用深度学习模型实时判断有没有缺陷。
这个方案跑通的前提,就是得先有一批高质量的标注数据。焊缝缺陷本身就难搞:表面反光不均匀、飞溅形态千奇百怪、裂纹细得跟头发丝似的,标注稍有含糊,模型学出来的东西就是歪的。这套数据集的定位很明确,就是给这个环节打底,让你不需要从零开始攒图、清洗、标注,省掉至少两三周的脏活。
1494张图的规模,单看数字不算大,但对于焊缝缺陷检测这个细分场景来说,已经足以支撑模型选型和初步验证。配合合适的数据增强和迁移学习策略,这个量级能训练出一个在受控条件下稳定可用的检测模型。如果你是想验证“视觉方案能否替代人工质检”,这份数据足够让你在几天内拿到可信度挺高的结论。
1.2 六类缺陷的类别体系是怎么来的
标题说6个类别,但只点名了裂纹、气孔、飞溅这三类。有人可能疑惑,另外三类是什么?这其实对应着焊缝表面缺陷检测里最常用的几个类别。结合工业现场的常见质量问题,完整的类别体系大概率是这样组成的:裂纹、气孔、飞溅、未焊透、咬边、焊瘤。
这六个类别基本覆盖了焊接外观缺陷的绝大部分场景。裂纹是最危险的,因为它会直接降低结构强度,属于必须100%检出的致命缺陷;气孔是焊接过程中气体来不及逸出留下的空洞,形态上通常是圆形或椭圆形暗斑;飞溅是焊接时溅出的小颗粒熔融金属粘在母材表面,虽然不一定影响强度,但影响外观和后道工序,客户往往不允许;未焊透和咬边属于成形不良,跟焊接参数设置直接相关;焊瘤则是焊缝边缘多出来的一坨金属。
这里有一个很关键的点:不同缺陷在视觉特征上的差异非常大,这对标注和模型训练都提出了不同的要求。比如裂纹是细长的线状特征,需要高分辨率才能看清;气孔是区域型的暗色斑块,相对好检测;飞溅通常是成群出现的小亮斑,考验模型对小目标密集场景的召回能力。一个数据集能把这几类放在一起并做统一的标注规范,这本身就是有工程价值的事。
1.3 VOC和YOLO双标注格式到底有什么区别、该怎么选
标题里专门提到VOC和YOLO两种格式,这个细节值得展开说。VOC格式本质上是XML文件,每张图对应一个标注文件,里面记录图像尺寸、目标类别、以及目标的边界框坐标——而且是绝对像素坐标,记录的是左上角和右下角的x、y值。YOLO格式则是TXT文件,每一行对应一个目标,记录类别ID和归一化后的中心点坐标、宽高,也就是cx、cy、w、h,这四个值全部除以图像宽高做了归一化。
这两种格式各有各的使用场景。VOC格式因为可读性强,适合做数据可视化检查——你随手打开一个XML就能看到“这个框的xmin是234,ymin是189”,一眼看出标注是否合理。YOLO格式高效简洁,直接作为大多数检测框架的输入格式,每张图对应的TXT文件和图片同名,放到训练目录下就能开跑。
实操中我的建议是:做数据清洗和标注复核时用VOC格式,做模型训练时用YOLO格式。拿到一套双格式的数据集,相当于既方便你检查数据质量,又能直接灌进训练管道,省去了中间转换的麻烦。如果只有一种格式也不用慌,转换脚本写起来无非就是几行坐标运算的事。
2. 缺陷检测的技术难点与标注质量把控
2.1 六类缺陷的视觉特征与检测难点拆解
只有真正理解每类缺陷长什么样、难在哪,你才知道标注该注意什么、模型该怎么调。我用实际现场的经验逐个说。
裂纹是焊缝检测里最让人头疼的。它不是“一块黑斑”那么简单,而是沿着焊缝方向延伸的细线,有的还带分支,像树杈一样。这种缺陷对图像分辨率的要求极高,一根裂纹在图像里可能就几个像素宽,长度十几个像素,如果不放大看根本发现不了。更麻烦的是,裂纹的灰度特征和焊缝纹路、打磨痕迹都很接近,模型很容易把它跟背景混淆。训练时你会发现,裂纹类别的precision还行,但recall偏低——模型“宁可错杀也不放过”会误报一堆焊缝纹路,太保守又会漏检。
气孔相对好检测一些。它的形态比较固定,圆形或近圆形,颜色比周围母材暗,中心区域灰度值低。但如果气孔特别小,比如直径不到2毫米,在图像里就是一个暗点,跟小的飞溅凹坑、表面麻点很难区分。气孔检测的另一个难点是成群出现的场景——焊接参数不稳时,整条焊缝密密麻麻全是小气孔,这时标注工作量巨大,且密集小目标的检测对模型的密度感知能力要求很高。
飞溅的特点是小、亮、散。焊接时高温金属颗粒溅出后凝固在表面,反光能力强,在图像上是高亮的斑点。单个飞溅的面积往往只有几十个像素,而且经常密密麻麻分布一大片。这种缺陷考验的是模型对小目标的召回能力,尤其是目标相互靠近、有粘连的情况,NMS阈值稍微调不好就会吞掉一半的框。
未焊透和咬边属于成形缺陷,特征是沿着焊缝方向连续或断续分布的带状区域。它们的灰度变化不如裂纹剧烈,但胜在面积相对大,如果图像的对比度足够,检测起来比裂纹和气孔都要轻松。难点在于边界定义模糊——未焊透的边缘是渐变过渡的,标注的人不同,框的范围就差出一截,这种标注不一致会直接拉低模型的收敛上限。
焊瘤是焊缝表面凸起的金属堆积,形态上就是一大块高亮区域,与焊缝的正常轮廓明显不同。因为特征显著,焊瘤是六类里最好检测的,基本上模型训练几十个epoch就能学到个七七八八。但它容易跟正常的焊缝余高混淆——焊瘤本质上就是局部的余高异常增大,怎么界定“正常突起”和“焊瘤”的边界,是标注阶段最需要统一标准的地方。
2.2 标注框怎么打才合格:规范、边界案例与质量复核
很多人觉得标注就是画个框,没啥技术含量。但在焊缝这类目标边界模糊的场景里,标注质量的差距能直接拉开模型效果的差距。给你一套我验证过靠谱的标注执行标准。
第一个原则是“紧贴边界但不要切进目标”。正样本的框应该刚好包住缺陷的可见区域,对外扩和收缩都有限制。外扩太多会把大量背景收进来,模型学到的是“背景+缺陷”这个组合而不是缺陷本身,推理时遇到干净焊缝就乱框;收缩太狠则截断了缺陷的完整形态,尤其是裂纹这种细长目标,截掉一截就废了。
第二个原则是遮挡重叠目标要单独标。飞溅成堆出现时,很多人图省事,一个大框把一片飞溅全包进去。这看起来没什么问题,但你训练出来的模型对飞溅的理解会变成“一片亮区”,别说区分单个飞溅颗粒了,连颗粒数都数不出来。规范的标注方式是一个飞溅颗粒一个框,哪怕两个框高度重叠也没关系,模型在训练时会通过IoU逻辑自己学会区分实例。
第三个原则是难样本要以“多数标注人共识”为准。裂纹到底从哪开始算起、未焊透的渐变边缘框该画到哪个位置,不同人看法不一样。我的建议是至少找三个人对同一批图做标注,然后取框的并集作为正样本边界。这比你一个人反复纠结要靠谱得多——众包共识天然过滤了个人的标注偏差。
标注完成后,还要过一轮系统性的质量复核,而不能只看几眼就算完。我常用的复核手段是“标注分布看板”:统计每个类别框的宽高比分布、面积分布,画直方图,然后人眼抽查那些明显偏离主分布的数据。比如气孔框的面积直方图里突然出现一个超大面积的框,那八成是把两个相邻气孔框到一起了,这种歪框在训练里就是纯纯的噪声。
2.3 六类缺陷对应的数据增强策略
数据量只有1494张,不靠增强就想把模型训好,不太现实。但增强也不是无脑堆,不同缺陷对增强方式的敏感度差别很大。
先说过采样,这是最基础的一步。六个类别的样本数量必然不平衡,飞溅这种“一图一大堆”的类别天然数量多,裂纹这种“十张图里才有一两条”的就少得可怜。如果不做任何处理,模型训练完的检测偏好会严重偏向样本多的类别。我的做法是先统计每个类别的实例总数,然后对低样本类别做图级别的过采样——把包含该类别目标的图像复制几份,配合不同的增强参数各跑一遍,让模型在每个epoch里都能看到足够多的裂纹样本。
再说几何增强。焊缝图像有个特性:缺陷在图像里的朝向基本和焊缝走向一致。如果你用随机旋转90度这种暴力增强,反而会学出“横向的裂纹”这种现场根本不存在的形态。合理的做法是采用协调增强(pipeline augmentation),也就是图像和标注框一起做同样的几何变换——随机平移、小角度旋转、镜像翻转,但要控制旋转范围在±15度以内。
颜色类增强对焊缝图像也很关键。不同焊机、不同批次的工件,表面氧化程度和反光特性会有差异。HSV扰动、亮度对比度扰动、高斯噪声注入,都能帮模型适应这种光照变化。但要注意一点:颜色增强的参数不宜过大,不然会出现“把正常焊缝的纹理也增强成缺陷模样”的副作用。我一般把HSV的hue扰动控制在±10,saturation和value控制在±25,学习率衰减后可以适度放宽。
3. 标注格式转换与数据划分实操
3.1 VOC和YOLO的坐标转换到底怎么算
这套数据直接给了VOC和YOLO两种格式,大多数情况下你拿来就能用。但如果你后续要自己标新数据、或者想加深对数据格式的理解,转换计算就得门儿清。这里把公式完整写出来。
VOC里的边界框是四个绝对像素坐标:xmin、ymin(左上角)、xmax、ymax(右下角)。假设图像宽为W、高为H,那么转成YOLO需要的归一化中心坐标和宽高,公式如下:
center_x = ((xmin + xmax) / 2) / W center_y = ((ymin + ymax) / 2) / H box_w = (xmax - xmin) / W box_h = (ymax - ymin) / H反过来,从YOLO格式转回像素坐标也是对称的:
xmin = int((center_x - box_w / 2) * W) xmax = int((center_x + box_w / 2) * W) ymin = int((center_y - box_h / 2) * H) ymax = int((center_y + box_h / 2) * H)这里有个细节经常被忽略:YOLO格式里的坐标是相对于“原图尺寸”的归一化值,而不是相对于你训练时resize之后的尺寸。如果你的训练管道里有letterbox操作,模型输出的框坐标要经过解码才能映射回原图。很多人训练时发现预测框偏了,检查到最后都是因为坐标系没搞清楚——标注用的坐标系、训练输入的坐标系、输出解码的坐标系,三者必须完全对齐。
另外提醒一句:转换脚本写好之后,一定要做一次反向校验。也就是从VOC转YOLO再转回VOC,对比每个框的像素坐标是否一致,误差超过1个像素就要排查。别嫌麻烦,这种基础环节出错了,后面所有训练结果都不可信。
3.2 数据划分的策略:训练集、验证集、测试集怎么切
1494张图如何划分,直接影响你对模型性能的判断。我见过不少人随便按8:1:1切,结果验证集里恰好混进了跟训练集同批次的图像——缺陷形态高度相似,验证指标虚高,一到现场就露馅。
推荐的做法是按照“焊接工艺参数”或“采集批次”来划分,而不是单纯随机切。如果一个批次的数据来自同一条焊缝、同一个打光条件,那这批图整体应该放进同一个子集,避免信息泄漏。比如你有三个批次的采集数据,那就一个批次做测试集、一个批次做验证集、剩下一个批次做训练集。这样做出来的模型评估结果,才更接近真实场景的泛化能力。
具体比例上,1494张图的规模,我建议训练:验证:测试按8:1:1切,或者略微偏激进一点按7:1:2分。测试集的比例拉高,是为了让最终模型评估的置信度更高一些。当数据量本身就少的时候,测试集少个50张图,最后的mAP浮动就可能超过2个点。
再提一种更稳妥的做法:K-fold交叉验证。把数据集分成5份,每次用4份训练、1份验证,跑5轮取平均。虽然训练成本变成了5倍,但你能获得更稳定的性能估计,还能顺带观察模型在不同数据子集上的表现波动。对于1494张这种量级,5轮YOLO训练的时间成本完全可以接受,强烈建议在方案验证阶段用这个方式。
3.3 目录结构和训练前的数据准备清单
拿到数据集后,第一步不是急着开训练,而是把目录结构调整成你所用框架的标准格式。以YOLO系列框架为例,推荐的目录结构长这样:
dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── train.txt ├── val.txt └── test.txtimages目录放图片,labels目录放同名的TXT标注文件,三个txt文件记录对应子集的图片绝对路径。如果你的框架用的是数据配置YAML文件,那就需要指定train和val的路径,并声明类别名列表。类别ID的顺序极其重要:训练时模型输出的类别ID是0到5的整数,如果你的YOLO类别顺序和VOC标注里的类别名顺序不一致,模型根本不知道“0代表裂纹还是气孔”。我建议第一步就打印一遍所有标注文件的类别ID分布,确认没有超出类别总数的ID出现。
另一个训练前必须做的检查项是“图像与标注文件的配对完整性”——每张训练图片都必须有一个同名的标注文件,哪怕这张图没有任何目标,也要有一个全空内容的TXT。有些数据预处理脚本会自动跳过无标注的图片,但如果你没有做这个过滤,一张缺标注的图片进训练管道,轻则报错,重则整个batch被跳过,白白浪费一轮epoch。
还有图像格式和尺寸的统一问题。1494张图的尺寸如果参差不齐,有的1920x1080,有的1280x720,训练时框架一般会自动做letterbox缩放,但不同尺寸的图像反复缩放,既浪费算力,也可能让缺陷特征变形。建议先用脚本统计所有图像的尺寸分布,把数量最多的尺寸作为统一目标,必要时做一次批量裁剪或缩放预处理,让输入数据更规整。
4. 基于该数据集的模型选择与训练调参指南
4.1 模型怎么选:YOLO系列各版本的适配性分析
有了数据,下一步就是模型选型。这套数据集同时支持VOC和YOLO格式,意味着主流的检测框架都能直接用,但我还是把几个常用选的优劣说清楚,帮少走弯路。
YOLOv5是社区生态最成熟的选择,文档全、坑少、部署范例多。对于1494张的中小规模数据集,YOLOv5s或者YOLOv5m是合理的起点。s模型参数量小、训练快,适合快速验证数据质量和baseline效果;m模型精度更高,适合在baseline基础上做正式迭代。如果你机器配置一般,YOLOv5s一轮训练可能就十几分钟,效率非常友好。
YOLOv8在检测精度和训练稳定性上比v5有所提升,尤其是对小目标的召回能力改善明显,这对飞溅和细小裂纹这类缺陷很关键。代价是训练和推理速度略慢一些。如果你对推理帧率没有特别极端的要求,我建议直接上YOLOv8m做正式实验,它的默认增强策略也比较合理,省得自己调一堆参数。
YOLO系列的另外两个变体也可以备选。YOLOv7以推理速度快著称,适合部署在算力有限的边缘设备上;YOLOX的anchor-free设计对密集小目标有天然优势,飞溅这种成片出现的目标可以考虑。但这两个版本的生态成熟度不如v5和v8,遇到问题能查到的资料相对少,除非有明确需求,否则不推荐新手直接用。
选型还有一个思路:用detectron2或者其他框架里的Faster R-CNN做对照实验。虽然两阶段检测器速度慢,但精度上限通常更高,尤其是对裂纹这种细长小目标。用同一份数据集跑通YOLO和Faster R-CNN两个路线,能帮你判断“当前瓶颈到底在数据还是模型”——如果两套方案都到不了预期精度,问题大概率出在数据质量和标注一致性上。
4.2 YOLO训练的核心参数怎么定
以YOLOv5为例,我把训练时最重要的几个参数过一遍,并给出针对焊缝缺陷数据集的推荐值。
图片尺寸(img)是第一个要定的参数。太大的尺寸训练慢、显存爆,太小则细小的裂纹和飞溅直接模糊掉。我的建议是优先采用640x640起步,先跑通整个管道。如果验证集的mAP上不去,而且你确认是裂纹漏检为主,再把尺寸提升到1280,配合原始的letterbox逻辑做训练。1494张图、1280尺寸,YOLOv5m在单张消费级显卡上大约要训练四到六个小时,时间成本完全可接受。
批次大小(batch)在显存允许范围内越大越好,但也不是盲目的。个人经验是16起步,显存不够就降到8。要注意的是:batch太小时,BN层的统计量不稳定,模型收敛会更慢,所以如果只能用batch=4,建议配合更大的学习率warmup来补偿。
学习率(lr)这块,YOLOv5默认的0.01通常就能跑,但迁移学习场景我习惯调低一些,设成0.005,因为预训练权重已经让模型处于一个较好的初始状态,学习率太大会破坏掉已学到的底层特征。配合cosine学习率调度,能有效避免后期loss震荡。还有一个容易被忽略的参数是weight decay,一般设0.0005就行,太大容易欠拟合,太小则过拟合风险增加。
训练轮数(epochs)建议至少300轮。很多人看到100轮的loss曲线差不多平了就停了,但对于工业检测任务,缺陷样本少、目标小,再加上迁移学习的前几十轮其实只是在适应数据分布,真正把缺陷特征学透需要更长的迭代过程。300轮在1494张图上,YOLOv5s大概是一到两个小时,并不算长。
4.3 类别不平衡怎么处理:损失函数权重与采样策略
焊缝缺陷数据集里的类别分布几乎必然不均衡,飞溅可能占了总实例数的一半,裂纹可能只有十分之一。这个坑不处理,模型训练出来就是“飞溅检测器”。
最简单的方案是调整损失函数里的类别权重。YOLO系列支持为每个类别设置独立的loss权重,你可以把少数类别的权重调高。具体做法是:统计每个类别的实例总数,然后用最大类别的数量除以各类别的数量,得到权重比例。比如飞溅有2000个实例、裂纹只有200个,那裂纹的权重就设为10。这样模型误分类裂纹时的惩罚足够大,梯度更新就会更重视裂纹的学习。
第二个方案是前面提到的过采样,在图级别解决不平衡。第三个方案是Focal Loss——它在标准的交叉熵损失上增加了调制因子,让模型自动聚焦于“难分样本”而不是“高频样本”。对裂纹这种容易跟背景混淆的类别,Focal Loss通常能带来明显的recall提升。
但这里要特别提醒:类别不平衡不是靠某一招就能完全解决的。损失权重调太高会让模型对少数类过度敏感,在正常焊缝上疯狂误报。我的经验是权重调完先跑一轮,在验证集上分别统计每个类别的precision和recall——precision太低就降权重,recall太低就升权重,来回调两三轮,找到平衡点再固定下来,不要指望一步到位。
5. 模型评估与工业落地中的常见问题排查
5.1 评估指标怎么算才靠谱:mAP的局限性和补充指标
很多人训练完只盯着mAP@0.5看,这是不够的。mAP是一个综合指标,但它掩盖了类别间的巨大差异。焊缝检测场景里,我更关心的是“每个类别单独的precision和recall曲线”,以及“小目标的AP值”。
mAP@0.5的意思是IoU阈值取0.5时计算的平均精度。对飞溅这种面积小、框紧密的目标,0.5的阈值过于宽松——框偏了一大截IoU也可能超过0.5,导致指标虚高。所以实际评估时要用mAP@0.5:0.95,它会计算0.5到0.95之间多个IoU阈值下的平均精度,对框的位置精度更敏感。裂纹类别的框稍微偏一点,mAP@0.5:0.95就会明显下降,这个指标才是真正检验模型定位能力的那把尺子。
另一个补充指标是每种类别的F1-score,尤其在类别不平衡条件下,F1比mAP更能反映模型在该类别上的实用价值。我习惯训练完出一张表:类别、precision、recall、F1、AP@0.5、AP@0.5:0.95,六列全部打出来。表里一眼就能看出“裂纹recall只有60%但气孔precision有95%”——这种差异是优化方向的直接指引。
对于工业落地,你还得看“单张图推理耗时”和“模型参数量”。一条产线如果要求每秒处理10张图,那推理速度就得在100ms以内;边缘设备显存只有几百MB,模型参数量就得控制在几十MB级别。模型精度再高,部署不上线就是零。
5.2 裂纹漏检率高怎么排查和优化
裂纹漏检是焊缝检测里最典型的痛点。排查的思路要系统化,从数据端到模型端逐层过。
第一步检查标注。用可视化工具把所有标注了裂纹的图翻一遍,确认裂纹的框是不是都完整地包含线状区域。很多漏检的根源是标注框太紧,裂纹末端被切掉了,模型学到的模式是“残缺的裂纹”,推理时自然认不出完整裂纹。
第二步检查图像尺寸。640x640输入下,一根只有30像素长的裂纹,经过多次下采样后特征图上的响应可能就剩一两个像素,模型根本没法定位。这个情况直接把输入尺寸调到1280,或者把裂纹区域单独裁剪成patch做二次检测。
第三步是后处理优化。如果模型对裂纹的置信度普遍在0.3到0.5之间,而默认阈值是0.25,那就可以针对裂纹类别单独设置0.15的低阈值做推理,再用形态学后处理过滤噪声。这种“类别级阈值”的做法比全局阈值灵活得多,对少数类别尤其有用。我实测过一个项目,裂纹阈值从0.25降到0.15后,recall提升了12个点,代价仅仅是误报率增加了2%。
5.3 飞溅小目标检测效果差怎么办
飞溅这类小目标,属于检测模型的老大难问题。优化方向有三个层次。
第一个层次还是数据。检查飞溅的标注是否做到了“一个颗粒一个框”。如果现有的标注把成片飞溅画成大框,模型的回归目标就是错的,怎么调参都白搭。这块数据如果确实存在标注问题,宁可花一天时间重新标,也别指望模型自己学出来。
第二个层次是模型结构。Anchor-based的YOLO系列,对小目标的召回能力受限于下采样倍数。可以考虑在训练时增加P2特征层(也就是原图1/4分辨率的特征图)的参与,或者直接换用P3起步的检测头配置。YOLOv8里开启detect头的多尺度输出能显著改善小目标回归。
第三个层次是推理策略。把原始大图切成重叠的patch,每个patch独立推理,再用NMS合并结果。这个方法对小目标检测几乎有立竿见影的效果,代价是推理耗时成倍增加,适合对速度要求不高的离线检测或者抽检场景。
5.4 模型训练不收敛或指标忽高忽低怎么查
训练指标震荡,很多时候问题不在模型,而在数据管道。这类问题建议按下述清单逐一排查。
先看训练集和验证集的分布是否一致。如果你的训练集都是白天打光拍的,验证集却是晚上低照度的,指标震荡是必然的。焊缝图像的光照敏感性很强,尽量保证训练和验证数据在采集条件上同源。
再看标注文件里有没有异常的框坐标。有些数据经过裁剪或者resize之后,标注没有同步更新,框的坐标超出图像边界,会导致loss计算异常。用脚本过滤一遍所有框的坐标范围,发现越界的直接剔除。
然后看增强参数是不是过大。过强的颜色扰动会把正常焊缝变成各种奇奇怪怪的色调,模型一会儿学这个一会学那个,自然稳不下来。把增强参数回调到合理范围再试。
最后就是学习率和batch的匹配问题。如果batch从16换到8,学习率还保持原样,收敛速度会变慢且会有更明显的震荡。保险起见,学习率可以随batch大小线性缩放——batch减半,学习率就减半。工业场景的训练不追求极限精度,稳定复现比偶尔一次刷高mAP重要得多。
5.5 模型部署时现场效果不及预期怎么办
这是最扎心的一环:实验室验证mAP挺高,一上产线就现原形。排查方向得从“现场和实验室的差异”入手。
光照差异是最大的变量。实验室打光是恒定均匀的,现场的工件表面反光千变万化,同一个缺陷换个角度拍出来就是两回事。对策是在部署前收集一批现场真实图像,用半监督或者人工复核的方式补标注,微调模型。凡是做工业视觉落地的项目,这一步几乎无法跳过。
相机参数差异也不可忽视。现场相机如果换了焦距、光圈、曝光时间,拍出来的图像分辨率和亮度和训练集完全不同。模型对分辨率非常敏感,640x640训练出来的模型接到1920x1080的现场图上,推理需要对原图做缩放,缩放比例变了,小目标可能直接被抹掉。建议部署前确认相机的成像规格和训练数据尽可能一致,或者干脆用现场相机重新采集一批图做适配微调。
最后就是检测结果的输出策略。现场环境复杂,偶尔的误报不可避免,但一个框在屏幕上闪过五秒钟就会让操作员彻底失去信任。工业界通常的做法是加入“帧间稳定策略”——同一位置连续3帧出现检测框才报警,极大过滤掉随机误报,同时几乎不影响真实缺陷的检出。这算不上模型层面的优化,但在实际使用体验上,效果比提升两三个点mAP更明显。
6. 经验收尾:焊缝检测项目成功的三个底层前提
分享一些我个人在多个类似项目里踩出来的体会,供准备上手的朋友参考。
第一,数据质量永远是最优先的投入方向。在这类小数据集场景下,与其花三周时间调模型结构,不如把一周时间用来清洗标注、统一标准、补充难例。模型调参是“锦上添花”,数据质量才是“雪中送炭”,这个顺序别搞反。
第二,建立“训练-评估-可视化”的闭环习惯。每训完一轮,除了看指标表,一定要把检测结果画在图上人眼过一遍。画图这一步很多人觉得多余,但恰恰是它最能暴露“指标看着不错、实际框全歪了”的问题。哪怕是10张图的抽查,也比纯看数字靠谱得多。
第三,多准备一套现场验证方案。模型在数据集上的表现只是参考,真正决定项目成败的是现场数据的反馈。拿到这套数据集,我建议的路径是:先用它跑通全流程、确定基础方案,然后立刻到现场采集一小批真实图像做适配验证。早一点接触现场数据,就能早一点避免后面的大返工。
焊缝检测这事,说难也难,说简单也简单。缺陷就那几类、图像就那几种、模型就那几个,真正拉开差距的,都是在数据准备和调试细节里抠出来的功力。希望这篇分享能帮你把数据集的价值用到位,少走几段弯路。