新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv8焊缝缺陷检测实战:从环境搭建到TensorRT部署

发布时间:2026/9/28 1:54:34来源:尧图网络
YOLOv8焊缝缺陷检测实战:从环境搭建到TensorRT部署
简介面向工业质检、计算机视觉初学者及有项目落地需求的开发者这套YOLOv8焊缝质量好坏检测方案提供训练好的模型、评估曲线与标注数据集。模型已训练完成附带精确率-召回率曲线、损失曲线等结果可直接用于焊缝缺陷识别也可作为迁移学习基线数据集使用标注工具对钢材缺陷图片进行标注图片为jpg格式标签分为xml与txt两种并分文件夹存放方便接入不同框架或二次标注。压缩包共2000个文件以txt标签、md说明文档、jpg图像、Python脚本及yaml配置为主另有少量C源码与前端演示页面整体约155.52MB结构清晰。目前已有224人学习。借助训练好的权重与配套脚本用户可快速复现检测流程进一步调参或扩展缺陷类别适合课程设计、毕业设计和工业质检项目预研。1. 焊接质量检测为什么值得用 YOLOv8 从头做一遍焊缝质量检测在工厂里通常靠两种老办法老师傅拿手电筒肉眼盯或者用传统图像处理写一堆阈值规则。肉眼盯的问题是人会疲劳焊缝纹理稍微反光或者飞溅多漏检率就上去了传统图像处理的问题更明显——光照一变、焊缝位置稍微偏移写死的参数立刻失效换个工件就要重新调。YOLOv8 在焊缝场景里真正解决的是「特征提取的鲁棒性」。它不像传统算法那样依赖你手工定义边缘、灰度、梯度特征而是把「什么算好焊缝、什么算坏焊缝」交给卷积网络自己去学。所谓坏焊缝常见的就是咬边、未熔合、气孔、裂纹、焊瘤和飞溅粘连这些缺陷在视觉上和正常鱼鳞纹的差异其实非常微妙靠灰度阈值根本分不开。用 ultralytics 框架做这件事好处是训练、验证、导出一条龙不用自己拼装推理代码数据到位之后三个小时就能看到第一版验证集指标。这套方案适合谁如果你是做质检设备集成、机器人焊接视觉引导或者只是毕业设计想做一个能演示的检测系统YOLOv8 都是目前性价比最高的落地路线。不需要自己有 GPU 集群一张消费级显卡就能训出可用的焊缝缺陷模型。整个链路就是四步准备带标注的数据、配置环境、训练出权重、导出部署。下面我把每一步拆开讲包括参数怎么给、数据怎么标、以及那些会让你训出废模型的坑。2. 搭好 ultralytics 运行环境CPU 和 GPU 两条路的取舍2.1 环境安装的版本雷区Python 和 CUDA 必须对齐我见过太多人卡在 YOLOv8 跑不通这一步最后发现不是代码问题是环境问题。ultralytics 对 Python 版本有硬性要求3.8 到 3.11 之间是官方测试过的范围Python 3.12 以上装包能装上但跑起来会出现莫名其妙的算子报错。CUDA 方面如果你用的是 NVIDIA 显卡建议直接装 CUDA 11.8 配套的 PyTorch不要用系统自带的 CUDA 12 去硬配老显卡。# 创建独立虚拟环境避免污染系统 Python conda create -n yolov8-weld python3.10 -y conda activate yolov8-weld # 安装 PyTorch注意这里的 cu118 对应 CUDA 11.8 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics 框架它会自动带 ultralytics-main 包结构和 yolo CLI pip install ultralytics这里有一个容易踩错的地方不要用pip install yolov8这个包名是第三方老仓库和 ultralytics 官方框架完全不同。正确做法是装ultralytics装完以后在 Python 里import ultralytics命令行里用yolo作为统一入口。我一般装完之后立刻跑一句yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg验证环境和权重下载链路是否通畅。第一次运行会下载预训练权重如果这一步卡住说明你的网络环境可能需要配置镜像源推荐把 pip 源换成清华或阿里云镜像再试。2.2 CPU 版本能跑但只能做验证别指望训练速度热词里很多人搜「ubuntu20.04搭建yolov8环境cpu版本」说明 CPU 跑 YOLOv8 是真实需求。结论是推理可以用 CPU 完成一张 640 分辨率的图片推理耗时大约 1-3 秒取决于你的处理器是几代 i5 还是 i7训练则不建议哪怕是最小的 yolov8n 模型用 CPU 训练 100 个 epoch 可能需要十几个小时。# CPU 推理示例对单张焊缝图片做缺陷检测 yolo predict modelruns/train/weld_det/weights/best.pt \ sourcetest_images/weld_001.jpg \ devicecpu \ conf0.35 \ saveTruedevicecpu是训练好的权重在无 GPU 机器上推理的关键参数。conf0.35表示置信度阈值焊缝缺陷检测里我建议不要设太高缺陷目标往往比人、车这种常见目标小网络输出的置信度天然偏低0.35 是个相对稳妥的起点。saveTrue会把标注了缺陷框的结果图保存到runs/detect/predict目录这个目录是 ultralytics 自动创建的不需要手动建。2.3 数据目录结构ultralytics-main 约定的布局ultralytics 的数据加载不是靠你写一堆数据读取代码而是靠目录结构和 YAML 文件配置。你的焊接缺陷数据集sts-hanfeng-data解压之后需要整理成下面的结构否则训练直接报错找不到图片datasets/ ├── weld_data/ │ ├── images/ │ │ ├── train/ # 训练集图片 │ │ └── val/ # 验证集图片 │ ├── labels/ │ │ ├── train/ # 训练集 YOLO 格式标签 │ │ └── val/ # 验证集 YOLO 格式标签 │ └── weld.yaml # 数据配置文件路径和类别都在这里weld.yaml文件是整个训练的「黑匣子钥匙」里面定义了图片路径和类别名称。我遇到过有人把 YAML 文件放在项目根目录而不是数据集目录下然后相对路径写错导致训练器找不到数据。最稳的写法是直接用绝对路径虽然可移植性差一些但第一次跑通比什么都重要。# weld.yaml 内容示例 path: /home/user/datasets/weld_data # 数据集根目录的绝对路径 train: images/train # 训练图片的相对路径 val: images/val # 验证图片的相对路径 nc: 4 # 类别数量假设检测 4 类缺陷 names: [under_cut, lack_fusion, porosity, spatter] # 类别名称3. 焊缝缺陷数据标注labelme 打标到 YOLO 格式的转换链路3.1 标什么四类常见缺陷的特征定义焊缝质量检测不是简单分「好」「坏」二分类就完了。实际生产里你需要知道坏在哪、是什么类型的坏这样返修人员才能对症下药。我建议默认标四类咬边under_cut焊趾处母材被熔化形成凹槽未熔合lack_fusion焊接熔深不足导致焊缝与母材之间有间隙气孔porosity表面或内部的气泡坑飞溅飞刺spatter焊渣乱溅形成的颗粒附着。这四类覆盖了焊接现场最常见的返修原因也是 YOLOv8 在焊缝数据上相对容易学出来的特征。标注工具我推荐用 labelme它输出的 JSON 格式便于检查和二次修正。labelme 安装简单命令行启动后界面就是直观的画框工具。pip install labelme labelme --labels welds.txt --nodata--labels welds.txt指定类别的文本文件每一行一个类别名优点是下拉菜单里直接选类别不会手打出错。--nodata表示不保存图片数据到 JSON 文件里能省不少磁盘空间。标注时有个技巧别把框画得太紧贴着缺陷边缘YOLO 训练时锚框计算需要一定的上下文背景框稍微留 2-3 像素的余量模型收敛更好。3.2 从 labelme 的 JSON 到 YOLO 的 TXT写一个转换脚本labelme 输出的是包含多边形坐标的 JSON而 YOLO 需要的是归一化的中心点加宽高格式。这一步必须写脚本批量转换手工算坐标能把人算疯掉。import json import os import glob from pathlib import Path # 类别映射表顺序必须和 weld.yaml 里的 names 对应 category_map {under_cut: 0, lack_fusion: 1, porosity: 2, spatter: 3} def convert_labelme_to_yolo(json_path, output_dir): with open(json_path, r, encodingutf-8) as f: data json.load(f) # labelme 保存的图片宽高信息 img_w data[imageWidth] img_h data[imageHeight] lines [] for shape in data[shapes]: label shape[label] if label not in category_map: continue class_id category_map[label] # labelme 框坐标是 [[x1,y1],[x2,y2]] 格式 points shape[points] x1 min(p[0] for p in points) y1 min(p[1] for p in points) x2 max(p[0] for p in points) y2 max(p[1] for p in points) # 计算中心点和宽高并归一化 cx (x1 x2) / 2 / img_w cy (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{class_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) # 输出文件按图片同名命名扩展名改 txt out_path Path(output_dir) / (Path(json_path).stem .txt) with open(out_path, w) as f: f.write(\n.join(lines)) # 批量转换某个目录下所有 JSON json_files glob.glob(labels_json/*.json) os.makedirs(labels_yolo, exist_okTrue) for jf in json_files: convert_labelme_to_yolo(jf, labels_yolo)这个脚本有几个关键细节。第一YOLO 格式的坐标值必须在 0 到 1 之间所以中心点和宽高全部除以图片宽高。第二如果你的标注框坐标有负数物体在图片边缘被截断需要做截断处理否则训练时报错坐标越界。第三category_map的类别顺序一旦定下来就不要改因为weld.yaml里nc和names的顺序必须和这里的类 ID 完全一致否则模型学出来的标签全错位。我见过有人改了类别顺序忘了改映射表训练出来检测结果张冠李戴这就是典型的黑匣子问题模型没毛病毛病出在标签错位。3.3 数据量多少够用从几十张到几百张的实战参考关于焊缝缺陷检测的数据量老实说没有一个绝对的数字。如果每个类别的样本数在 50 张以下YOLOv8 基本学不出稳定特征达到 100-200 张每类加上合理的数据增强训练出来的模型在固定工况下已经能实际使用了。焊缝检测的数据获取在工厂里其实是相对容易的因为焊接件可以重复焊接、重复拍照不像自动驾驶那种场景数据那么难采。数据增强是弥补样本不足的关键手段。ultralytics 内置了增强参数在训练命令里直接指定即可。对于焊缝检测我建议这样配hsv_h0.015做轻微色相偏移模拟不同焊材的反光差异fliplr0.5做水平翻转焊缝缺陷在左右方向上没有物理意义差异翻转不会产生错误标签scale0.3模拟远近拍摄距离变化。不要开mosaic到默认的 1.0焊缝图片拼接起来会生成很多不自然的边界纹理影响小缺陷的检测建议调到 0.5 左右。4. 训练参数详解从预训练权重到焊缝微调4.1 预训练权重怎么选n/s/m/l/x 的取舍YOLOv8 的预训练权重有 n、s、m、l、x 五个型号从 n 到 x 模型参数量递增检测精度递增推理速度递减。很多人一上来就选 x 号模型追求最高精度结果显存爆掉或者训练速度慢到怀疑人生。焊缝检测属于目标较小、背景相对固定的场景用 s 或者 m 是性价比最高的选择。# 使用 yolov8m 预训练权重开始微调 yolo train modelyolov8m.pt dataweld.yaml epochs150 imgsz640 batch8 device0modelyolov8m.pt会自动下载这个预训练权重文件然后加载到内存里开始训练。以它作为起点网络的前几层已经学会了轮廓、边缘、纹理等基础特征我们只需要微调后面的检测头让网络适应焊缝缺陷的语义。如果从零开始训练即不指定预训练权重在焊缝这种小众数据集上往往需要更多数据和更长训练时间才能收敛效果还不一定好。batch8是 8GB 显存显卡的配置如果你的显卡是 12GB 显存可以开到 16。4.2 训练过程怎么看损失曲线和验证集的坑训练开始后ultralytics 会在终端实时打印每个 epoch 的box_loss、cls_loss、dfl_loss和metrics/precision(B)、metrics/recall(B)、mAP50(B)、mAP50-95(B)。很多人只盯着 mAP 值看其实训练过程中的损失值更能说明问题。box_loss 表示预测框和真实框的坐标偏差cls_loss 表示分类错误的损失两个损失都在下降说明模型在学习如果 loss 降了但 mAP 不涨大概率是你的标签有错误或者类别不均衡。可视化损失曲线的做法常见的是从runs/detect/train/目录下的results.csv文件提取数据在训练结束后用 matplotlib 绘制。曲线图的观察要点是训练损失持续下降但验证损失在第 80 个 epoch 左右开始反弹说明过拟合已经开始可以提前终止训练并回滚到验证损失最低的那个 epoch 的权重。ultralytics 会自动保存best.pt和last.pt两个权重文件best.pt就是验证集上 mAP 最高的那个 checkpoint训练结束直接用best.pt做推理即可。4.3 焊缝检测必调的三个训练参数imgsz、conf、iou这三个参数是决定焊缝检测实际效果的命门。imgsz表示训练时网络的输入分辨率。焊缝缺陷中的气孔和咬边属于小目标1024 分辨率比 640 分辨率能多检测出大约 5-8% 的小缺陷但显存占用和训练时间会明显增加。如果你的显存是 8GB建议用 640加上数据增强弥补如果是 12GB 以上直接上 1024。conf是推理阶段的置信度阈值默认是 0.25。焊缝场景里我建议设到 0.35-0.4 之间太低会输出一堆飞溅误检太多框没法看太高则会漏掉一些真实缺陷因为网络对缺陷的置信度普遍不如对行人车辆高。iou是 NMS 的非极大值抑制阈值默认是 0.7。焊缝缺陷经常成片出现比如一串气孔紧密排布如果 IOU 阈值太高NMS 可能把相邻的几个框合并成一个导致漏检。遇到这种情况可以把iou降到 0.5保留更多重叠的检测框。# 更完整的训练命令示例 yolo train modelyolov8m.pt \ dataweld.yaml \ epochs200 \ imgsz1024 \ batch8 \ patience30 \ optimizerAdamW \ lr00.005 \ hsv_h0.015 \ hsv_s0.3 \ hsv_v0.3 \ fliplr0.5 \ scale0.3 \ mosaic0.5 \ device0patience30表示连续 30 个 epoch 验证指标没提升就自动停止训练这是对时间的节省也防止过拟合越来越严重。optimizerAdamW在小型数据集上比默认的 SGD 收敛更快更稳。lr0初始学习率设置为 0.005如果损失曲线震荡厉害优先把学习率降到 0.002 再试。5. 焊缝检测避坑指南5 个让你白白浪费训练时间的坑5.1 缺陷类别不平衡导致模型只学会飞溅检测现象训练跑完验证集精度看着还行但实际检测时飞溅的召回率很高而气孔几乎一个都检不出来。用 mAP 看整体数值像是在进步但分类别看指标气孔的 AP 几乎为零。原因你的数据集里飞溅图片占了 70% 以上气孔只有十几张。YOLO 训练时按图片采样模型见多了飞溅自然更擅长拟合这个类别的分布。这是分类任务里经典的样本不均衡问题。解决优先做数据扩充把气孔样本通过旋转、裁剪、亮度调整扩到和飞溅接近的数量。如果实在凑不齐就用 ultralytics 的class_weight参数调高样本少的类别的损失权重。注意修改完数据后重新整理训练集和验证集不能把同一张图片既放进训练集又放进验证集那属于数据泄漏会让指标虚高但实际应用翻车。5.2 标签和图片没有对齐txt 文件比图片多或者少现象训练日志报错assertion failed: labels.shape (n, 5)或者训练正常结束了但 mAP 一直是零。原因YOLO 要求每张图片对应一个同名 txt 标签文件标签文件名是图片名去掉扩展名加上.txt。我在实际项目中发现最常见的情况是 labelme 转换脚本输出时JSON 文件名里有中文或空格导致生成的 txt 文件名和图片文件名对不上。YOLO 加载数据时按图片名去找标签文件找不到就跳过这张图但类别统计里仍然可能出错。解决做一个脚本核对。遍历images/train下的每张图片检查同名 txt 是否存在。所有没有标签的图片要么删除要么补标。同样地labels/train下有多余的 txt 而对应图片不存在的直接删掉。这个核对脚本几十行就能写完但能省下你排查半天的时间。5.3 推理时把「好焊缝」也框出来二分类思维害人现象模型训练完在正常焊缝上检测出了大量缺陷框现场完全不可用。你把正常焊缝图片放进训练集了但这没用。原因你只标注了缺陷把无缺陷的图片当作背景但 YOLO 会在这些背景图上强行找目标。模型如果没有见过「好焊缝」作为负样本的概念就会把纹理正常的鱼鳞纹反光当作特征匹配。解决在标注阶段明确把正常焊缝定义为good类别并标注出来或者专门收集一批完全无缺陷的焊缝图片放进数据集的训练集和验证集图片没有对应 txt 标签时模型会将其视为背景样本参与训练。建议至少加入 20% 的正常焊缝图片比例太低模型学不好太高又稀释了缺陷样本的影响。5.4 显存不足就改小 batch结果训练不稳定现象训练时报错CUDA out of memory你把 batch 从 16 改成 4 之后能跑了但损失曲线震荡得像心电图验证集精度也上不去。原因过小的 batch 会导致梯度估计方差大模型参数更新方向不稳定。YOLOv8 的 BN 层对小 batch 尤其不友好batch size 小于 8 时归一化统计量失真导致收敛困难。解决最优先的调整是降低输入分辨率imgsz从 640 降到 512显存占用能减少三分之一左右其次是换更小的模型从 m 换到 s最后才考虑减 batch。如果 512 分辨率加 s 模型还爆显存就把梯度累积打开accumulate4每 4 个小 batch 累积一次梯度更新等效于 batch 做大了。5.5 部署时发现 mAP 高但实际检测速度慢到无法接受现象训练时 mAP0.5 到 0.95 看着不错但部署到产线工控机上YOLOv8m 模型推理一帧要 300 毫秒完全跟不上流水线节拍。原因精度的提升是有代价的模型越大推理越慢。工控机的 GPU 往往比训练机器弱一个档次或者根本没有 GPU 只能用 CPU。解决训练完yolo train后用yolo export把权重导出成 TensorRT 或 ONNX 格式推理速度通常能提升一倍以上。导出前试一下yolov8s对比yolov8m精度可能只降 2-3 个点但速度能快接近一倍。用导出的 ONNX 文件做一次推理验证确保检测框位置和 PyTorch 版本一致再上产线。6. 用 TensorRT 导出焊缝模型把推理速度压到实时的验证技巧项目做到这一步模型已经能用了接下来值得做的一件事是把权重文件从 PyTorch 格式导出成 TensorRT 引擎部署到 Jetson 或工控机上。热词里经常有人搜「rk3588部署yolov8」说明嵌入式部署是焊缝检测的真实需求方向。# 先用 ONNX 做中间格式 yolo export modelruns/train/weld_det/weights/best.pt formatonnx dynamicTrue # 再用 ONNX 转 TensorRT需要 Ubuntu 环境且已安装 TensorRT trtexec --onnxbest.onnx \ --saveEngineweld_engine.trt \ --fp16 \ --workspace2048dynamicTrue允许 ONNX 运行时动态输入图像尺寸这样部署到不同分辨率设备时不用重新导出。--fp16是半精度推理焊缝检测的缺陷框不涉及自动驾驶那种极端安全场景半精度带来的精度损失通常在 1% 以内速度收益接近翻倍值得开。--workspace2048限制 TensorRT 构建时最大使用 2GB 显存防止构建过程中显存溢出。TensorRT 引擎导出后的推理不能用yolo predict直接跑需要用tensorrt的 Python API 加载。验证方式是把同一张疑似缺陷图片分别用 PyTorch 权重和 TensorRT 引擎各跑一遍对比检测框坐标和置信度。我自己的习惯是设置一个容忍度坐标偏差不超过 5 个像素、置信度偏差不超过 0.05 就算通过。如果发现 TensorRT 的结果偏差过大先检查是不是开了--fp16导致精度损失关掉后重新导出再对比。最后想说的是焊缝质量检测这个方向真正的核心不在模型选型而在数据。YOLOv8 只是把「从数据到检测」的距离缩短了但如果你拿到的sts-hanfeng-data.zip里标注质量参差不齐花再多时间调参也是在垃圾上盖楼。我在第一次跑焊缝数据时就吃过这个亏——数据增强参数调了一整天最后发现是标签文件里有两张图片的类别 ID 标错了。以后拿到任何数据集第一件事永远是抽查标签第二件事才是训练。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

gsd-core 安装器回滚快照范围修复:让 Codex 失败安装完整还原到安装前状态(PR 4760) 2026/9/28 2:42:36

gsd-core 安装器回滚快照范围修复:让 Codex 失败安装完整还原到安装前状态(PR 4760)

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 导读 本文围绕 gsd-core 仓库中编号为 #4760 的 changeset 修复展开:当 Codex 运行时执行 gsd-core 安装/升级失败时&…

阅读更多 →
RT-Thread NUCLEO32-L412(STM32L412RB)BSP 快速上手与外设驱动配置指南 2026/9/28 2:42:36

RT-Thread NUCLEO32-L412(STM32L412RB)BSP 快速上手与外设驱动配置指南

操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本文是 …

阅读更多 →
避开模板坑,怎样做教育视频网站及建站报价真相 2026/9/28 2:42:36

避开模板坑,怎样做教育视频网站及建站报价真相

避开模板坑,怎样做教育视频网站及建站报价真相 很多做教育的朋友跟我吐槽,找外包公司做教育视频网站,交出来的东西跟淘宝9.9包邮的模板一模一样。视频播放器卡得要死,后台管理乱成一锅粥,最要命的是,那UI设计得简直辣眼睛,完全撑不起品牌的调性。…

阅读更多 →
Execa Shell 选项完全指南:何时需要 shell、如何指定具体 shell 并安全处理引号与转义 2026/9/28 2:42:34

Execa Shell 选项完全指南:何时需要 shell、如何指定具体 shell 并安全处理引号与转义

开发工具 【免费下载链接】execa Process execution for humans 项目地址: https://gitcode.com/gh_mirrors/ex/execa 点击查看 免费下载 在 Node.js 生态中,execa 的 shell 选项允许在子进程中调用系统 shell(Unix 的 sh、Windows 的 cmd.e…

阅读更多 →
在 stable-diffusion.cpp 中运行 Anima 图像生成模型:权重获取、CLI 实战与源码架构解析 2026/9/28 2:42:33

在 stable-diffusion.cpp 中运行 Anima 图像生成模型:权重获取、CLI 实战与源码架构解析

人工智能大模型本地部署推理引擎媒体生成 【免费下载链接】stable-diffusion.cpp Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp 点击查看 免费下载 Anima …

阅读更多 →
Ravel 基准测试(js-framework-benchmark)预编译产物与 Rust/WASM 源码重建指南 2026/9/28 2:42:26

Ravel 基准测试(js-framework-benchmark)预编译产物与 Rust/WASM 源码重建指南

性能测试开发者工具 【免费下载链接】js-framework-benchmark A comparison of the performance of a few popular javascript frameworks 项目地址: https://gitcode.com/gh_mirrors/js/js-framework-benchmark 点击查看 免费下载 本篇技术指南围绕 js-framework-…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉