
简介本资源是一套面向工业质检工程师、自动化专业学生及AI视觉开发者的一站式焊接缺陷检测解决方案聚焦裂纹、气孔等6类典型焊缝缺陷的实时识别与报警。系统基于YOLOv11架构融合HSV图像增强与数据负样本增强策略实测mAP≥92%、单帧推理≤50ms支持图片/视频/摄像头流输入≥15 FPS并集成网页端交互界面具备缺陷可视化标注、阈值可调报警及跨平台部署能力。压缩包共476个文件71.07MB含149个核心Python模块训练/推理/前端接口、87个配置yaml文件含模型结构与超参设置、7个预训练.pt权重、202个编译后pyc文件及HTML/JS前端页面目录结构清晰分层便于二次开发与工程落地。目前已有35人学习下载提供完整可运行代码、开箱即用权重、详细使用说明及典型焊缝图像样本显著降低工业场景下焊接质量智能检测的技术门槛。 做焊接质量检测这行最头疼的就是焊缝缺陷识别。项目赶工期的时候质检员对着密密麻麻的焊缝看一整天眼睛都花了裂纹、气孔这些缺陷稍不留神就漏过去。这几年基于深度学习的目标检测方案越来越多YOLO系列因为速度快、落地性强成了工业缺陷检测里用得最多的一类模型。今天要拆解的这个项目就是一个基于YOLOv11的焊接质量智能检测系统支持裂纹、气孔、未熔合、咬边、夹渣、焊瘤6类常见缺陷识别配套完整源代码、训练好的权重文件和使用说明拿过来就能跑也可以作为二次开发的基础。这个项目最适合几类人一是要做工业视觉检测落地的算法工程师可以参考整套工程化思路二是焊接工艺或者质量管理人员想了解AI检测到底怎么用三是刚入门目标检测的开发者拿它当从训练到部署的完整练手项目。下面我把整个项目的设计思路、数据准备、训练调优、部署落地和排坑经验一次说完。1. 项目整体设计与方案选型1.1 六大焊接缺陷的形态特征与检测难点焊接缺陷检测和普通目标检测有个很大区别缺陷目标的形态差异非常大这让模型的学习难度比想象中高不少。先说最常见的裂纹它在图像里通常是细长的线状区域宽度可能只有几个像素周围还连着热影响区的纹理非常容易和焊缝本身的沟槽混淆。气孔则是圆形或椭圆形的暗斑尺度小出现位置随机有的藏在焊缝表面下方用普通可见光相机拍出来对比度很低不仔细标注很容易漏掉。未熔合和咬边的形态比较接近都是沿着焊缝边缘出现的条状异常但一个发生在融合区内部一个发生在母材边缘需要非常熟悉焊接工艺才能准确区分。夹渣形态不规则焊瘤则是明显的凸起或溢流这两类相对容易识别但也同样面临尺度差异大的问题。把六类缺陷放到一个模型里统一识别麻烦的是特征重叠很多。比如细长的未熔合线和裂纹在视觉上几乎没有区别只有结合具体位置和走向才能判断。所以如果只是按普通目标检测的方式简单框选模型很容易学偏。这也是我在设计这套系统的时候决定把整个项目框架划分成“数据采集标注、模型训练调优、推理部署”三个模块同时推进的原因。三个模块环环相扣任何一个环节偷懒最终部署到现场都会反弹回来。1.2 为什么选YOLOv11而不是传统方案早几年做焊缝缺陷识别主流方案是传统机器视觉加图像处理。用灰度阈值分割、形态学运算、边缘提取这些手段对特定角度的规则缺陷还有点效果。一旦遇到反光、飞溅、纹理复杂的情况阈值怎么调都不稳定。换一个工件材质整个处理链路可能就要重写。深度学习目标检测最大的优势就是不用手工设计特征只要喂足够多的标注图像模型自己会学会找缺陷。YOLOv11是2024年下半年推出的YOLO系列新版本由ultralytics团队维护延续了YOLOv8以来的anchor-free设计同时在主干网络中引入了C3k2和C2PSA结构。C3k2把C3模块里冗余的卷积层精简掉在保持特征提取能力的同时降低了计算量C2PSA在C2f结构上引入了位置自注意力机制让模型更关注空间位置上真正重要的特征。这两种结构对细长目标和小目标的检测效果有明显提升而焊接裂纹、气孔恰恰就是这两种最难搞的目标形态。选YOLOv11而不是其他版本还有一层工程效率的考虑。这个项目交付物要求包含源代码、权重文件和使用说明意味着使用者不一定是算法工程师可能是产线工艺人员或者刚入行的同学。YOLOv11训练一个自定义数据集只需要一个yaml配置文件和几条命令推理也只需两行代码对非深度学习背景的人极其友好。如果选Detectron2这类框架功能虽然更强但配置复杂安装依赖多学习成本高不适合快速落地。1.3 交付物设计与代码结构规划拿到这个项目我第一步不是急着写代码而是先规划交付目录。一个可复现的项目目录应该让人一眼看出先看什么、后看什么welding_defect_yolov11/ ├── data/ │ ├── dataset.yaml # 数据集配置文件 │ ├── train/ │ │ ├── images/ │ │ └── labels/ │ └── val/ │ ├── images/ │ └── labels/ ├── weights/ │ ├── yolov11n.pt # 官方预训练权重 │ └── best.pt # 焊接缺陷训练权重 ├── scripts/ │ ├── train.py # 训练入口 │ ├── inference.py # 推理脚本 │ └── split_dataset.py # 数据集划分脚本 ├── requirements.txt └── README.md这里有个细节值得注意把官方预训练权重和训练后的权重分开存放因为两个文件混在一起非常容易误用。训练时加载的是yolov11n.pt推理时加载的是best.pt一旦搞反要么训练报错要么推理结果完全不对。README文档里包含了环境安装、目录说明、训练和推理命令、常见问题四个部分任何一个拿到源码的人只要按步骤走半小时内就能把系统跑起来。2. 环境配置与数据集准备2.1 环境搭建与版本选型这个项目我使用的是Python 3.9加PyTorch 2.x加CUDA 11.8的组合。GPU选择上哪怕只是入门级的RTX 3060 12G也能顺利训练yolov11n和yolov11s不需要多高端的卡。如果完全没有GPUCPU也能跑推理但速度会比较慢训练的话基本等不起。安装依赖时建议先创建一个独立的conda环境避免把系统Python环境搞混乱conda create -n weld python3.9 conda activate weld pip install ultralyticsultralytics包会连带安装好torch、torchvision、opencv-python、numpy等核心依赖。如果torch安装较慢可以先安装对应CUDA版本的torch再装ultralyticspip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics安装完之后强烈建议用下面这段代码验证环境是否可用这一步能帮你在开始训练前就排除掉一半的环境问题import torch import ultralytics print(torch.__version__) print(torch.cuda.is_available()) print(ultralytics.__version__)如果torch.cuda.is_available()返回False说明CUDA环境有问题需要检查显卡驱动版本和PyTorch的CUDA版本是否匹配。这个问题在后面常见问题里会展开讲。2.2 数据采集与标注规范数据是缺陷检测项目的命根子模型的性能上限由数据决定。采集时要尽量模拟实际产线的拍摄条件包括不同角度、不同光照、不同工件材质、不同焊接方式的焊缝图像。一部分图像可以用手机或工业相机拍摄另一部分可以从公开数据集中选取。GDXray这类公开数据集里有一些焊缝X光图像可用但X光图像和普通可见光图像的纹理差异很大建议优先使用与实际应用场景一致的可见光图像否则现场换相机之后效果会掉得很厉害。标注工具我推荐LabelImg操作简单支持YOLO格式导出。标注格式是每张图片对应一个同名txt文件每行内容为类别ID、中心点x坐标比例值、中心点y坐标比例值、宽度比例值、高度比例值。所有坐标都用0到1之间的比例值表示和图片实际像素尺寸无关。标注手法的好坏直接决定模型性能。裂纹这类细长目标不要为了省事给整条裂纹拉一个大框那会把大量背景区域包含进来模型学到的就是一堆噪声。正确做法是把长裂纹切成多段每段一个框框紧贴目标边缘。气孔这类小目标标注框一定要精准宁可留一点边距也不要框得太大。另外同一张图里出现的所有缺陷都要完整标注漏标一个就会给模型传递错误信号尤其是当漏标目标在图像里很显眼的时候模型会困惑这个特征到底算还是不算缺陷2.3 数据集划分与增强策略标注完成后把数据集按8比1比1划分成训练集、验证集、测试集。划分时有个容易忽略的坑不能简单随机打散因为同一个焊缝、同一批工件在不同帧里出现的图像内容上往往非常相似。如果这些相似图像同时出现在训练集和验证集里验证指标会虚高部署到现场时才暴露真实水平。按工件编号或拍摄批次分组划分更靠谱保证训练集和验证集的图像来自不同工件。ultralytics框架自带的数据增强非常完善默认开启了Mosaic、MixUp、HSV色域变换、随机平移缩放、翻转等操作。Mosaic增强通过把4张图拼成一张来训练让小目标在整图里的比例变大对小目标检测很友好。焊接气孔这类小目标比较多的时候Mosaic基本就是刚需。如果你的数据集里小目标过多可以在训练参数里保持mosaic默认开启调整hsv_h、hsv_s、hsv_v这些色域变换参数来增强鲁棒性因为焊缝在自然光下颜色会随环境变化。3. 训练配置与模型调优3.1 训练脚本与关键参数解读训练之前先准备一个数据集配置文件内容如下# data/dataset.yaml path: ../data train: train/images val: val/images test: test/images nc: 6 names: [crack, porosity, incomplete_fusion, undercut, slag_inclusion, overlap]注意类别顺序要和标注时保持一致第一类从0开始。训练命令很简单但参数含义要搞清楚yolo train \ modelyolov11n.pt \ datadata/dataset.yaml \ epochs300 \ imgsz640 \ batch16 \ lr00.01 \ patience50关键参数的作用我整理了一张表参数推荐值说明epochs200-300训练轮数工业数据集一般够用配合早停机制不用死等batch8-16受显存限制RTX 3060 12G跑yolov11n可以用16imgsz640-1280输入尺寸裂纹等细长缺陷建议调大lr00.01初始学习率迁移学习场景0.01比较稳optimizerauto默认自动选择也可指定AdamWpatience50早停耐心值连续50轮验证集指标不提升就自动停止这里重点说下imgsz。默认640对小目标检测已经不错但焊接裂纹宽度往往只有几个像素在640的输入尺寸下会被压缩得几乎看不见。如果原始图像分辨率较高建议用960或1280目标变大之后检测率提升非常明显。代价是训练时间和显存占用同步增加要自己权衡。3.2 训练过程监控与loss曲线诊断训练时最怕的几种情况loss不降、loss下降但mAP不涨、mAP涨了但推理时漏检严重。第一种大概率是数据标注问题去检查标签格式和类别ID有没有错第二种基本是训练集和验证集划分不当相似图像泄漏到了验证集里第三种往往是目标尺度问题需要调整输入尺寸或者做tiling分块推理。训练日志建议每5个epoch打印一次验证集的precision、recall、mAP50和mAP50-95。mAP50是IoU阈值为0.5时的平均精度反映基本检测能力mAP50-95对多个IoU阈值取了平均标准更严格对小目标的波动更敏感。焊接缺陷检测里mAP50一般要到达80%以上才具备现场实用价值mAP50-95作为更严格的参考指标尽量追高。训练结束后weights目录下会生成best.pt和last.pt两个权重文件。best.pt是验证集表现最好的权重last.pt是最后一轮的权重。正常使用一定要加载best.pt除非你打算继续训练才需要接last.pt。3.3 小样本场景下的迁移学习与调优工业场景经常面临样本不足的问题某个缺陷类型可能只有几十张图。这时候有几个实用经验第一用预训练权重做迁移学习不要从零训练。COCO预训练权重学到了丰富的通用图像特征是工业小样本场景的强力先验。第二对样本少的类别做针对性过采样在训练时重复采样这类图像。同时在增强阶段加大旋转、亮度、噪声的变化幅度让有限样本发挥更大价值。第三如果模型在个别类别上识别率明显偏低不要依赖调类别顺序这类取巧手段真正有效的是多收集该类别样本并针对该缺陷的形态特点调整增强策略。比如气孔样本少可以重点增加模糊和缩放增强。第四尝试前几层冻结训练。小数据集上直接微调全部参数容易把预训练学到的底层特征破坏掉。先用freeze10冻结主干前10层训练若干轮等模型收敛后再解冻全部参数微调往往能收获更稳定的精度。4. 推理部署与工程化落地4.1 推理脚本代码分析与保存结果训练完成之后推理就非常简单了。先看单张图像推理的完整脚本# scripts/inference.py from ultralytics import YOLO model YOLO(weights/best.pt) results model.predict( sourcepath/to/test_image.jpg, conf0.25, iou0.5, imgsz640, saveTrue, save_txtTrue, save_confTrue, projectruns/detect, nameinference_test )predict方法里有几个参数值得详细说。conf是置信度阈值低于该值的检测结果会被过滤。调高conf能减少误检但可能漏掉真实缺陷调低则相反。工业场景建议conf设在0.25到0.35之间具体看现场对漏检和误检的容忍度。iou是NMS的IoU阈值默认0.5就行如果同一个缺陷被重复框选可以适当调高到0.6或0.7。saveTrue会在project/name目录下生成带标注框的图片save_txtTrue生成YOLO格式的文本结果save_confTrue把置信度附在文本结果后面方便后续统计。推理结束后在项目目录下打开runs/detect/inference_test文件夹就能看到每张图的检侧结果。调参时可以反复修改conf参数对比效果直到找到当前场景下的最佳平衡点。4.2 批量检测与数据报表输出实际应用肯定不是一张一张跑需要批量检测并输出检测报告。项目里的推理脚本包含一个批量处理函数会把指定文件夹下所有图片都跑一遍并把结果汇总成CSVimport csv import glob from ultralytics import YOLO model YOLO(weights/best.pt) image_paths glob.glob(test_images/*.jpg) with open(detect_results.csv, w, newline) as f: writer csv.writer(f) writer.writerow([image, class, conf, bbox_x, bbox_y, bbox_w, bbox_h]) for img_path in image_paths: results model.predict(sourceimg_path, conf0.25, imgsz640) for r in results: for box in r.boxes: cls r.names[int(box.cls)] conf float(box.conf) cx, cy, w, h box.xywh[0].tolist() writer.writerow([img_path, cls, conf, cx, cy, w, h])这个CSV可以直接导入Excel也可以进一步统计各类缺陷的数量和占比作为质量日报的数据来源。很多工厂现场要的就是这种检测结果可追溯能力图像保存完整、缺陷框标注清楚、数据记录齐全方便后续质量复盘和工艺改进。4.3 部署优化从PyTorch到ONNX/TensorRT如果只是做实验或者离线检测PyTorch推理完全够用。但工业现场往往是实时在线检测比如输送带上的焊缝图像连续进入相机需要在几十毫秒内给出结果这时候必须做部署优化。第一步最常见的是导出ONNXyolo export modelweights/best.pt formatonnx opset12ONNX的好处是跨平台、无Python依赖可以用ONNX Runtime加速推理速度比PyTorch快不少。如果对速度还有更高要求可以进一步导出TensorRT引擎yolo export modelweights/best.pt formatengine halfTrueTensorRT的优化效果非常显著。同样的yolov11n模型在RTX 3060上PyTorch推理大约需要30毫秒一帧ONNX大概15毫秒TensorRT可以压缩到5毫秒左右完全满足实时检测需求。halfTrue开启FP16半精度推理速度更快但精度会有一点点损失工业场景完全可接受。注意TensorRT引擎文件绑定GPU型号和驱动版本换机器必须重新导出不要直接拷贝engine文件用。5. 常见问题与排查技巧实录5.1 环境安装类问题项目交付以后使用者在各自电脑上复现遇到最多的问题都集中环境安装环节。我把高频问题列成一张速查表问题现象可能原因解决办法pip安装ultralytics超时网络原因使用合适的镜像源安装torch.cuda.is_available()返回False安装了CPU版torch重新安装对应CUDA版本的PyTorch运行时报缺少某个模块依赖不完整执行pip install -r requirements.txt版本冲突反复报错环境混乱删除conda环境重建比一点一点修依赖快得多这里最值得说的是第二个问题。很多同学装环境时直接在官网下载PyTorch默认装成了CPU版本显卡根本用不上训练速度慢到怀疑人生。验证方法很简单打印torch.version.cuda看看有没有带CUDA版本号如果显示的是cpu就重新安装对应CUDA版本的torch。5.2 训练与数据类问题训练阶段的问题我遇到最多的是这四类loss不下降。先检查数据标注格式有没有类别ID越界、坐标值不是0到1之间。最快捷的方式是随机挑几张图把标注框可视化出来看和实际目标是否吻合。mAP偏低。逐类查看precision和recall定位到具体是哪一类拉低了整体指标。如果是少数类样本不足就做数据扩充不要盲目调参。显存溢出OOM。减小batch开启梯度累积或者降低输入尺寸。如果降低输入尺寸小目标检测效果可能会受影响要权衡。训练中断想接着训练。直接用下面的命令yolo train modelruns/detect/train/weights/last.pt datadata/dataset.yaml resumeTrue断点续训时数据集路径和相关参数必须与原训练完全一致否则容易出错。5.3 推理与精度问题推理阶段最常见的三个问题第一小目标漏检严重。提高imgsz比如从640提到1280或者把大图切成多个小块分别推理再合并结果这个策略叫tiling很适合裂纹这种细长目标。第二误检多。提高conf阈值检查是不是背景样本太少可以收集一批没有缺陷的正常焊缝图像作为负样本加入训练。第三光照不均匀导致识别不稳定。工业现场光照变化很大推理前先做一次直方图均衡化能缓解一部分问题但最可靠的办法是在采集端就用稳定的环形光源依赖算法去对抗光照问题不如从源头解决。5.4 独家避坑经验最后分享几个项目里非常隐蔽的坑都是常规文档里不会写的。第一个坑是类名映射问题。训练时data.yaml里的names顺序模型推理时会自动带出来但如果你自己写脚本读取检测结果时用了一个独立的类别列表而没有保持一致就会导致显示出来的类别和实际类别对不上。这种错误很隐蔽表面看一切正常直到有人发现气孔被标成了裂纹。所以推理脚本里的类别映射一定要从模型对象读取不要手写。第二个坑是图像格式问题。有的相机输出16位深度图像或BMP格式yolov11默认按8位读取会导致图像变成全黑或全白。如果发现误检严重先检查图像读取之后是不是正常的8位三通道BGR图。第三个坑是权重文件损坏。有些下载工具下载到一半提示成功但文件其实不完整加载best.pt时报错或者直接程序退出。验证权重文件是否完整看文件大小是否和正常文件一致或者直接跑一次推理看有没有输出。第四个坑是跨机器部署时ONNX的opset版本不同会导致部分算子不兼容。用TensorRT导出时要固定环境换机器后重新导出引擎文件不要跨机器拷贝.engine。这套系统从部署到稳定运行我个人最大的体会是缺陷检测项目的技术难点往往不在模型本身而在数据和工程细节。模型选型、参数调优都有成熟路径真正决定项目成败的是标注质量、环境稳定和边界情况覆盖。拿到源码的朋友我建议装完环境后先用自带的best.pt权重跑通推理流程再逐步替换成自己的数据训练。这样即使出问题也能快速定位是环境问题、数据问题还是模型问题不会一上来就被一堆报错淹没。祝你能顺利跑通自己的焊接缺陷检测系统。本文还有配套的精品资源点击获取