news 2026/10/10 9:41:44

YOLO焊缝质量检测数据集实战:131张图从训练到部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLO焊缝质量检测数据集实战:131张图从训练到部署

简介:这份资源面向从事工业质检、焊接缺陷识别方向的算法工程师与深度学习学习者,提供一套可直接用于YOLO系列目标检测训练的焊缝质量检测数据集,帮助解决焊接不良与焊接良好两类样本的自动分类与定位问题。压缩包共394个文件,约7.12MB,包含131张jpg图像、131个txt标签、131个xml标签以及1个data.yaml配置文件,同时提供YOLO格式与VOC格式两套标注,便于在不同框架间灵活切换。YOLO标签采用类别索引与归一化中心点、宽高比例的标准写法,可直接适配yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流算法,数据集已划分完毕,开箱即可训练与验证测试。目前已有231人学习下载,适合作为焊缝缺陷检测的入门练手或模型对比基准,帮助读者快速搭建训练流程、验证检测效果并积累工业视觉项目经验。

1. 焊缝质检的 131 张图:这份 YOLO 数据集到底能扛住什么活

工厂里做焊缝质检的朋友跟我吐槽过一件事:产线上一天过几千条焊缝,老师傅拿放大镜一条条看,眼睛都快看瞎了,漏检还是免不了。想上视觉检测,第一步就卡在数据上——网上公开的焊缝缺陷数据集要么几百 G 下不动,要么标注格式对不上自己的训练脚本。这份 131 张图像带标签的焊缝质量检测数据集,就是冲着这个痛点来的:图像已经分好训练/验证集,标签同时给了 YOLO 的 txt 和 VOC 的 xml 两套,配置文件 data.yaml 也备好了,解压完改个路径就能直接喂给 yolov5 到 yolo11 这一串模型。它适合两类人:一是刚入门 yolo 目标检测、想拿真实工业场景练手的;二是手头有焊缝检测需求、想先跑个 baseline 验证可行性的。131 张不算多,但作为二分类(焊接良好/焊接不良)的起步数据,够你把整条训练链路走通一遍。

2. 拆开压缩包:目录结构、标签格式与 data.yaml 的对应关系

拿到一个数据集,我习惯先不急着训练,而是把目录结构和标签格式摸清楚。这一步花十分钟,能省掉后面几个小时的报错排查。焊缝数据集的结构不算复杂,但 YOLO 格式和 VOC 格式并存这件事,如果不搞明白谁对应谁,训练时很容易读错标签。

2.1 目录长什么样,两个标签文件夹怎么分工

解压后典型的目录布局是这样:

welding_dataset/ ├── images/ │ ├── train/ # 训练集图像 │ └── val/ # 验证集图像 ├── labels/ │ ├── train/ # YOLO 格式 txt 标签 │ └── val/ ├── annotations/ # VOC 格式 xml 标签 │ ├── train/ │ └── val/ └── data.yaml # 数据集配置文件

images 下面按 train/val 分好了,labels 里放的是 YOLO 格式的 txt,annotations 里放的是 VOC 格式的 xml。两套标签描述的是同一批图,只是格式不同。YOLO 训练时读 labels 下的 txt,如果你要用别的框架(比如某些基于 VOC 的检测代码),就去 annotations 里拿 xml。常见做法是训练前先确认 images/train 里的图片数量和 labels/train 里的 txt 数量一致,不一致就说明有图没标或者标了没图,这种脏数据丢进去训练,loss 会莫名其妙地抖。

2.2 YOLO 标签的五个数值到底怎么读

YOLO 格式的每一行代表一个目标框,长这样:

0 0.5234 0.4127 0.2310 0.1856

五个数值依次是:类别索引、框中心 x 坐标、框中心 y 坐标、框宽、框高。后四个都是归一化到 0~1 的比例值,不是像素。这一点新手最容易翻车——有人直接把像素坐标写进去,训练时框全跑到图像外面,mAP 一直是 0。归一化的意思是:x_center 除以图像宽度,y_center 除以图像高度,width 除以图像宽度,height 除以图像高度。所以同一张图换个分辨率,标签不用改,这是 YOLO 格式比 VOC 格式省事的地方。

类别索引从 0 开始。这份数据集是二分类,焊接良好和焊接不良,那类别就是 0 和 1。具体哪个是 0 哪个是 1,得看 data.yaml 里的 names 定义,别自己猜。

2.3 data.yaml 里三个字段决定训练能不能跑起来

data.yaml 是 YOLO 系列训练的入口配置,核心就三个字段:

path: ./welding_dataset train: images/train val: images/val nc: 2 names: 0: good_weld 1: bad_weld

path 是数据集根目录,train 和 val 是相对 path 的图像路径。nc 是类别数,names 是类别名和索引的映射。这里有个坑:names 的顺序必须和标签 txt 里的类别索引严格对应。如果 txt 里 0 代表焊接不良,而 yaml 里 0 写的是 good_weld,模型学出来的结果就是反的,推理时把好焊缝判成坏的,产线上直接误报一片。改 yaml 之前,先随便打开几个 txt 看看类别索引分布,再对照 names 确认一遍。

提示:path 建议用绝对路径或者相对于训练脚本的路径,用相对路径时容易因为工作目录不同而找不到数据,报 “No labels found” 之类的错。

3. 从零跑通训练:yolov8 与 yolo11 的命令行实操

目录和格式确认无误后,就可以动手训练了。这一章以 yolov8 和 yolo11 为例,把从环境准备到启动训练、再到看结果的全流程走一遍。命令都是可以直接抄的,参数我会逐个说明改哪里、为什么改。

3.1 环境准备与 ultralytics 安装

YOLOv8 和 YOLO11 现在统一走 ultralytics 这个库,安装很直接:

# 建议先建虚拟环境,避免和系统里的包打架 python -m venv yolo_env source yolo_env/bin/activate # Windows 用 yolo_env\Scripts\activate # 安装 ultralytics,会自动带上 torch 等依赖 pip install ultralytics

装完之后验证一下:

yolo checks

这条命令会打印出 torch 版本、CUDA 是否可用、GPU 型号等信息。如果 CUDA 显示不可用但你确实有 N 卡,多半是 torch 版本和驱动不匹配,去 pytorch 官网按你的 CUDA 版本重装 torch 就行。CPU 也能训,但 131 张图在 CPU 上跑 100 轮大概要几十分钟,有 GPU 的话几分钟就完事。

3.2 启动训练:一条命令里的关键参数

假设 data.yaml 放在 welding_dataset 目录下,训练命令:

yolo detect train \ data=welding_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ project=runs/weld \ name=exp1

逐个说参数。data 指向你的 yaml 文件,路径别写错。model 是预训练权重,yolov8n.pt 是最小的 nano 版本,131 张图用 nano 足够,想精度高一点可以换 yolov8s.pt 或 yolo11s.pt。epochs 是训练轮数,小数据集 100 到 200 轮比较常见,太少欠拟合,太多过拟合。imgsz 是输入分辨率,640 是默认值,焊缝缺陷如果很小,可以提到 1024,但显存占用会涨。batch 是批大小,16 在 8G 显存上一般没问题,爆显存就降到 8 或 4。project 和 name 决定结果保存路径,训练完的权重、曲线图、混淆矩阵都在 runs/weld/exp1 下面。

换成 yolo11 只需要改 model 参数:

yolo detect train \ data=welding_dataset/data.yaml \ model=yolo11n.pt \ epochs=100 \ imgsz=640 \ batch=16

yolo11 的 n/s/m/l/x 系列权重命名规则和 v8 一致,n 最小 x 最大。数据集本身对 v5 到 v11 都兼容,因为标签格式没变,变的只是模型结构和训练接口。

3.3 训练过程看什么:loss 曲线与 mAP 指标

训练启动后,终端会实时打印每一轮的 box_loss、cls_loss、mAP50、mAP50-95。box_loss 是边界框回归损失,cls_loss 是分类损失,两个都应该随着轮数下降并逐渐平稳。如果 loss 一直不降,先检查标签格式对不对;如果 loss 降了但 mAP 不涨,可能是类别不平衡或者学习率太大。

训练结束后,runs/weld/exp1 目录下有几个关键文件:

文件含义
weights/best.pt验证集上表现最好的权重
weights/last.pt最后一轮的权重
results.csv每轮的 loss 和 mAP 数值
confusion_matrix.png混淆矩阵,看两类有没有互相误判
val_batch0_pred.jpg验证集预测结果可视化

我一般先看 confusion_matrix.png,如果 good_weld 和 bad_weld 大量互相误判,说明两类特征区分度不够,要么加数据,要么检查标注是不是标反了。再看 val_batch0_pred.jpg,肉眼确认框的位置和类别对不对,这一步比看数字直观得多。

3.4 用训练好的权重做推理验证

训练完拿 best.pt 跑推理:

yolo detect predict \ model=runs/weld/exp1/weights/best.pt \ source=welding_dataset/images/val \ save=True \ conf=0.25

source 可以是单张图、文件夹或视频。conf 是置信度阈值,0.25 是默认值,调高会减少误报但可能漏检,调低反之。焊缝检测里,漏检一个不良焊缝的代价通常比误报大,所以 conf 可以适当调低到 0.15 到 0.2,宁可多报几个让复检确认。推理结果默认存在 runs/detect/predict 下面,带框的图直接能看。

注意:如果推理时发现框的位置整体偏移或者类别全错,八成是 data.yaml 里的 names 顺序和训练时不一致,或者推理用的权重和数据集不匹配。

4. 避坑与排查:焊缝数据集训练中最容易翻车的五件事

小数据集训练,翻车点往往不在模型本身,而在数据和配置的细节上。下面这五条是我在实际项目里踩过或者见别人踩过的,按「现象 → 原因 → 解决」整理,照着排查能省不少时间。

4.1 现象:训练报 “No labels found”,一张图都读不到

原因通常是 data.yaml 里的路径写错了,或者 labels 目录名和 YOLO 默认期望的不一致。YOLO 默认会在 images 同级找 labels 目录,且文件名要对应(img_0237_77.jpg 对应 img_0237_77.txt)。如果 labels 放在别的地方,或者 txt 文件名和图片名对不上,就会报这个错。

解决:先确认 data.yaml 里 train/val 指向的是 images 目录,再检查 labels 目录是否和 images 同级、txt 文件名是否和图片名一一对应。不对应的话写个脚本批量重命名。

4.2 现象:loss 正常下降,但 mAP 始终接近 0

原因多半是标签里的坐标没有归一化,写成了像素值。像素值动辄几百,归一化后应该在 0 到 1 之间,模型看到几百的坐标直接懵了。

解决:写个脚本扫一遍所有 txt,检查后四个数值是否都在 0 到 1 之间。有超过 1 的,说明是像素坐标,需要除以图像宽高重新归一化。

import os from PIL import Image img_dir = "welding_dataset/images/train" lbl_dir = "welding_dataset/labels/train" for txt in os.listdir(lbl_dir): if not txt.endswith(".txt"): continue img_name = txt.replace(".txt", ".jpg") img_path = os.path.join(img_dir, img_name) if not os.path.exists(img_path): print(f"缺图: {img_name}") continue w, h = Image.open(img_path).size with open(os.path.join(lbl_dir, txt)) as f: for line in f: parts = line.strip().split() if len(parts) != 5: print(f"格式异常: {txt} -> {line}") continue vals = list(map(float, parts[1:])) if any(v > 1.0 for v in vals): print(f"未归一化: {txt} -> {vals}")

这段脚本遍历 labels/train 下的每个 txt,找到对应图片读取宽高,然后检查坐标值是否超过 1。超过就打印出来,方便定位问题文件。跑一遍就能把脏标签筛出来。

4.3 现象:混淆矩阵里两类几乎全混在一起

原因可能是标注时类别标反了,或者两类焊缝的视觉差异本身就不明显。131 张图里如果两类样本数量悬殊,模型也会偏向多数类。

解决:先统计两类标签数量,看是否严重不平衡。再随机抽十几张图肉眼确认标注类别对不对。如果确实标反了,批量把 txt 里的 0 和 1 互换。如果两类本身就难分,考虑加数据或者用更强的模型(比如 yolov8m 以上)。

4.4 现象:训练到一半显存爆了,进程被 kill

原因是 batch 或 imgsz 设太大,超出了显卡显存。131 张图虽然不多,但 imgsz 提到 1024 加 batch 16,8G 显存也可能扛不住。

解决:先把 batch 降到 8 或 4,或者把 imgsz 降回 640。ultralytics 支持自动批大小,加batch=-1让它自己找合适的值,但有时候找出来的值偏保守,训练会慢一些。

4.5 现象:推理结果框的位置对,但类别名显示成数字

原因是推理时没有加载 data.yaml 里的 names,模型只输出类别索引,不知道对应的名字。

解决:推理命令里加上 data 参数,或者在代码里手动指定 names。用命令行时:

yolo detect predict \ model=runs/weld/exp1/weights/best.pt \ source=welding_dataset/images/val \ data=welding_dataset/data.yaml

加上 data 之后,输出图上就会显示 good_weld 或 bad_weld,而不是 0 和 1。

5. 小数据集的进阶玩法:数据增强、交叉验证与导出部署

131 张图训一个二分类模型,跑通不难,难的是让它真正可用。这一章聊几个我常用的进阶技巧,都是在小数据集上验证过有效的,最后收在一个部署相关的习惯上。

5.1 用增强参数把 131 张图“撑”到更大

ultralytics 内置了数据增强,训练时加几个参数就能开:

yolo detect train \ data=welding_dataset/data.yaml \ model=yolov8n.pt \ epochs=200 \ imgsz=640 \ batch=16 \ hsv_h=0.015 \ hsv_s=0.7 \ hsv_v=0.4 \ degrees=10 \ translate=0.1 \ scale=0.5 \ fliplr=0.5 \ mosaic=1.0

hsv_h/s/v 是色调、饱和度、亮度扰动,焊缝图像光照条件多变,这三个参数能提升模型对光照的鲁棒性。degrees 是旋转角度,translate 是平移比例,scale 是缩放比例,fliplr 是水平翻转概率。mosaic 是马赛克增强,把四张图拼成一张,对小数据集特别有用,能显著增加样本多样性。但要注意,焊缝缺陷如果是有方向性的(比如某种裂纹只在特定角度出现),旋转和翻转可能会破坏这种特征,这时候 degrees 和 fliplr 要调小甚至关掉。

5.2 交叉验证:小数据集评估模型稳定性的靠谱做法

131 张图分一次 train/val,验证集可能只有二三十张,mAP 波动会很大,这次 0.85 下次 0.72,很难判断模型到底行不行。交叉验证能缓解这个问题。ultralytics 支持 K 折交叉验证:

yolo detect train \ data=welding_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ kfold=5

kfold=5 表示把数据分成 5 折,轮流拿一折做验证,其余做训练,最后报告 5 次的平均指标。这样得到的 mAP 比单次划分可信得多。代价是训练时间变成 5 倍,但小数据集本来训得快,多花点时间换个靠谱的评估值,值。

5.3 导出 ONNX 与部署前的最后一步验证

训练完的 .pt 权重适合研究和验证,真要部署到产线,通常导出成 ONNX 或其他推理格式:

yolo export \ model=runs/weld/exp1/weights/best.pt \ format=onnx \ imgsz=640 \ simplify=True

format 指定导出格式,onnx 通用性最好。imgsz 要和训练时一致,否则推理结果会偏。simplify=True 会对计算图做简化,减小模型体积、提升推理速度。导出后在同目录下会生成 best.onnx。

导出完别急着上线,拿几张验证集图片用 ONNX 推理跑一遍,和 .pt 的结果对比。我一般会写个小脚本,用 onnxruntime 加载 onnx 模型,对同一批图做推理,把框的坐标和 .pt 的输出比对,偏差在几个像素以内才算过关。这一步是部署前的后悔药,跳过它直接上线,出了问题在产线上排查的成本高得多。

从那以后我每次导出模型,不管多急,都会拿至少十张图做一次 .pt 和导出格式的对比验证,确认框的位置和类别一致才往下走。焊缝检测这种场景,一个错判可能就是一批产品返工,多花这十分钟不亏。希望帮到你。

本文还有配套的精品资源,点击获取

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

上机40天:用栈实现带负号的四则运算表达式求值

今天打开编辑器的时候,时间是晚上九点四十。屏幕上还留着昨天没调完的测试用例,光标一闪一闪地停在那个报错的括号前面。我忽然意识到,这是连续第40天坐在电脑前做上机练习了。第40天是个很微妙的时间节点。热情早就退了,肌肉记忆…

作者头像 李华
网站建设 2026/10/10 9:40:15

时间复杂度和空间复杂度实战指南:从大O记号到优化决策

我刚开始学数据结构那阵子,第一道把我卡死的题目不是链表反转,也不是二叉树遍历,而是一道看起来“平平无奇”的数组求和:给一个长度为 n 的数组,输出所有连续子数组的和。我用了三层 for 循环,自己测试 n10…

作者头像 李华
网站建设 2026/10/10 9:39:41

Hadoop MapReduce实现KNN鸢尾花分类:三种距离度量与调优指南

简介:这份资源面向计算机、人工智能、大数据等专业的学生与开发者,提供KNN分类算法在Hadoop平台上的MapReduce实现方案,解决传统单机KNN难以处理大规模数据的问题。项目以经典鸢尾花数据集为实验对象,通过花萼长度、宽度与花瓣长度…

作者头像 李华
网站建设 2026/10/10 9:38:51

Qwen-Image-2.1 云端部署实战:A10+Triton+vLLM高并发推理方案

1. 项目概述:为什么现在必须认真对待 Qwen-Image-2.1 的云端部署最近两周,我连续接到五位不同背景的朋友咨询:一位做电商视觉设计的自由职业者想自动批量生成商品主图,一位高校实验室的研究生需要处理大量显微图像标注&#xff0c…

作者头像 李华
网站建设 2026/10/10 9:34:16

列车进站模型验证器:用栈和队列判断出站序列是否可行

简介:一份关于列车进站调度问题的数据结构实验资源,面向学习栈和队列的本科生或编程初学者。该问题模拟丁字形铁路调度系统,要求编程实现车厢以编号1到n的顺序出站,是理解栈和队列典型应用场景的良好案例。资源包共含9个文件&…

作者头像 李华
网站建设 2026/10/10 9:33:10

SpringBoot+Vue+MyBatis+MySQL企业级图书大厦管理系统全栈实战

做图书管理系统的源码很多,但大部分都是“能跑通的demo”:后端打个CRUD接口,前端画几个表格,录一本加一本,顶多再加个模糊搜索,然后就在简历上写“完成图书管理系统开发”。但真要放到图书大厦这种场景里&a…

作者头像 李华