YOLOv10轮毂缺陷检测(上)——环境搭建与模型训练

YOLOv10 轮毂缺陷检测(上)------环境搭建与模型训练

系列导读 :本文是"YOLOv10 轮毂缺陷检测"系列的第一篇,主要介绍项目背景、环境搭建、数据集制作与模型训练全流程。第二篇将聚焦模型推理与 PyQt5 可视化检测应用的开发,两篇文章合为一个完整的工业缺陷检测小项目。

数据集在百度网盘:dataset_part.7z

链接: https://pan.baidu.com/s/1You0gylRxu41lb2BCz66pg?pwd=ibyk 提取码: ibyk

--来自百度网盘超级会员v3的分享


一、项目背景与整体架构

在汽车制造与维修行业中,轮毂作为连接车身与轮胎的核心零件,其质量直接关系到行车安全。传统的人工目检效率低、误检率高,难以满足现代化生产线的需求。

本项目基于 YOLOv10 ------目前业界最新的 YOLO 系列目标检测模型,构建一套轮毂缺陷自动检测系统,实现对以下三类状态的精准识别:

类别 ID 英文标签 中文含义
0 Pass 合格品
1 Outer broken 外密封圈破损
2 Fixed plate broken 密封圈固定板破损

整个项目由两大部分组成:

复制代码
YOLOv10_project/
├── yolov10/                    # YOLOv10 核心框架(GitHub 拉取)
│   ├── dataset_part/           # 数据集与训练相关
│   │   ├── dataset_part/       # 实际数据集目录
│   │   │   ├── images/         # 图像文件
│   │   │   │   ├── train/      # 训练集
│   │   │   │   ├── val/        # 验证集
│   │   │   │   └── test/       # 测试集
│   │   │   └── labels/         # YOLO 格式标注文件
│   │   ├── mydata.yaml         # 数据集配置
│   │   ├── yolov10n_my.yaml    # 模型结构配置
│   │   └── train.py            # 训练启动脚本
│   ├── weights/                # 预训练权重
│   │   └── yolov10n.pt         # YOLOv10n 预训练模型
│   └── runs/                   # 训练输出(自动生成)
│       └── train/my_first_exp/ # 本次训练结果
└── project/                    # 检测应用
    ├── best.pt                 # 训练得到的最优权重
    ├── UiMain.py               # PyQt5 UI 布局定义
    ├── 汽车零件缺陷检测系统.py  # 主程序逻辑
    └── pre.py                  # 命令行推理测试

二、YOLOv10 简介

YOLOv10 由清华大学团队于 2024 年提出,在保持高检测精度的同时大幅降低了推理延迟。其核心创新点包括:

1. NMS-Free 双标签分配策略

传统 YOLO 依赖非极大值抑制(NMS)来过滤重复检测框,YOLOv10 通过引入一对一(one-to-one)与一对多(one-to-many)的双标签分配机制,在训练时利用 one-to-many 提升特征学习,在推理时直接使用 one-to-one 输出唯一结果,彻底消除 NMS 后处理延迟。

2. 全面效率-精度驱动的模型设计

  • 轻量级分类头:降低分类部分的计算冗余
  • 空间-通道解耦下采样(SCDown):在保持感受野的同时减少参数量
  • 大核卷积(PSA):全局感受野增强,低成本融合全局信息
  • C2fCIB 模块:倒置瓶颈结构优化特征提取效率

模型家族对比(越小越适合边缘部署):

本项目选用 YOLOv10n(Nano 版本),参数量最小,适合快速实验和边缘部署。


三、环境搭建

3.1 拉取 YOLOv10 仓库

bash 复制代码
# 从 GitHub 克隆 YOLOv10 官方仓库
git clone https://github.com/THU-MIG/yolov10.git
cd yolov10

注:详细git操作可以参考这篇《每天一个小技能------GitHub入门》博客文章和《YOLOv5 实战:从 GitHub 拉取到自定义数据集训练》博客文章

3.2 使用 uv 管理 Python 环境

uv 是由 Astral 团队开发的新一代 Python 包管理器,速度比 pip 快 10-100 倍,并提供完整的环境隔离。推荐用它替代传统的 pip + virtualenv 工作流。

详细uv操作,可以参考《uv工具详解------Python包与项目管理器完全指南》博客文章。

bash 复制代码
# 安装 uv(Windows PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 验证安装
uv --version

3.3 安装依赖

bash 复制代码
# 进入项目目录
cd yolov10

# 安装 requirements.txt 中的所有依赖
uv pip install -r requirements.txt

# 以可编辑模式安装 yolov10 包本身(开发模式,支持代码修改后立即生效)
uv pip install -e .

说明-e . 表示以"可编辑(editable)"模式安装当前目录下的包,即将包直接链接到源码目录,修改源码后无需重新安装即可生效,非常适合开发调试。

3.4 核心依赖清单

依赖包 版本要求 作用
ultralytics ≥8.0 YOLOv10 核心框架
torch / torchvision ≥2.0 深度学习后端
opencv-python ≥4.8 图像读取与处理
PyQt5 ≥5.15 GUI 界面构建
numpy ≥1.24 数值计算
PyYAML ≥6.0 配置文件解析

3.5 验证安装

python 复制代码
# 快速验证 YOLOv10 环境
from ultralytics import YOLOv10
print("YOLOv10 环境配置成功!")

四、数据集制作

4.1 数据集概述

本项目使用轮毂图像数据集,包含轮毂零件在正常和缺陷状态下的图像,图像格式为 .bmp(位图)。数据集按 YOLO 标准格式组织,分为训练集、验证集和测试集三个子集。

检测目标类别:

  • Pass(合格品):轮毂外观完好,无明显缺陷
  • Outer broken(外密封圈破损):轮毂外侧密封圈出现裂纹、缺口或变形
  • Fixed plate broken(密封圈固定板破损):固定板出现裂纹或断裂

4.2 YOLO 标注格式

YOLO 使用 .txt 格式存储标注,每行对应一个检测目标:

复制代码
<class_id> <x_center> <y_center> <width> <height>

所有坐标值均已归一化到 [0, 1] 范围(相对于图像宽高的比例)。

示例标注文件c41.txt):

复制代码
0 0.512 0.498 0.324 0.412   # 类别0(Pass),中心坐标+宽高
1 0.231 0.712 0.187 0.156   # 类别1(Outer broken)

4.3 数据集目录结构

复制代码
dataset_part/
├── images/
│   ├── train/      # 训练图像(.bmp格式)
│   │   ├── c01.bmp
│   │   ├── c02.bmp
│   │   └── ...
│   ├── val/        # 验证图像
│   │   └── ...
│   └── test/       # 测试图像
│       └── ...
└── labels/
    ├── train/      # 训练标签(.txt格式,与图像一一对应)
    │   ├── c01.txt
    │   └── ...
    ├── val/
    └── test/

重要规则 :YOLO 通过将 images 替换为 labels 来自动寻找对应标注文件,因此目录结构必须严格对应。

4.4 数据集配置文件(mydata.yaml)

yaml 复制代码
# 数据集根路径
path: D:\YOLOv10_project\yolov10\dataset_part\dataset_part

# 各子集的图像路径(相对于 path)
train: D:\YOLOv10_project\yolov10\dataset_part\dataset_part\images\train
val:   D:\YOLOv10_project\yolov10\dataset_part\dataset_part\images\val
test:  D:\YOLOv10_project\yolov10\dataset_part\dataset_part\images\test

# 类别名称
names:
  0: Pass           # 合格
  1: Outer broken   # 外密封圈破损
  2: Fixed plate broken  # 密封圈固定板破损

# 类别数量
nc: 3

配置项说明:

  • path:数据集根目录的绝对路径
  • train / val / test:各子集的图像目录路径(支持相对路径或绝对路径)
  • names:类别 ID 到类别名称的映射字典
  • nc:类别总数(必须与 names 的条目数一致)

五、模型配置文件解析(yolov10n_my.yaml)

为了适配本项目的 3 类检测任务,我们基于官方 YOLOv10n 配置进行了修改:

yaml 复制代码
# 参数设置
nc: 3  # 检测类别数(修改为3类)

scales:  # 模型缩放系数(n = nano版本)
  n: [0.33, 0.25, 1024]  # [depth倍数, width倍数, 最大通道数]

# ===================== Backbone 骨干网络 =====================
backbone:
  # [来自层, 重复次数, 模块名, 参数]
  - [-1, 1, Conv,  [64, 3, 2]]    # P1/2   输入→32ch,步长2,特征图1/2
  - [-1, 1, Conv,  [128, 3, 2]]   # P2/4   →64ch,步长2,特征图1/4
  - [-1, 3, C2f,   [128, True]]   # C2f残差模块,shortcut=True
  - [-1, 1, Conv,  [256, 3, 2]]   # P3/8   →128ch,特征图1/8(小目标)
  - [-1, 6, C2f,   [256, True]]   # 6个C2f模块堆叠
  - [-1, 1, SCDown,[512, 3, 2]]   # P4/16  空间-通道解耦下采样,特征图1/16
  - [-1, 6, C2f,   [512, True]]
  - [-1, 1, SCDown,[1024, 3, 2]]  # P5/32  特征图1/32(大目标)
  - [-1, 3, C2f,   [1024, True]]
  - [-1, 1, SPPF,  [1024, 5]]     # 空间金字塔池化(5x5)
  - [-1, 1, PSA,   [1024]]        # 部分自注意力模块(全局感受野)

# ===================== Head 检测头 =====================
head:
  # FPN 特征金字塔(自顶向下)
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]  # 上采样×2
  - [[-1, 6], 1, Concat, [1]]   # 与backbone P4特征拼接
  - [-1, 3, C2f, [512]]         # P4特征融合

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]   # 与backbone P3特征拼接
  - [-1, 3, C2f, [256]]         # P3特征融合(小目标检测头)

  # PAN 路径聚合(自底向上)
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]]  # 与P4拼接
  - [-1, 3, C2f, [512]]         # P4检测头(中等目标)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]]  # 与P5拼接
  - [-1, 3, C2fCIB, [1024, True, True]]  # P5检测头(大目标),CIB倒置瓶颈

  # 检测输出(多尺度)
  - [[16, 19, 22], 1, v10Detect, [nc]]  # 输入P3、P4、P5,输出nc类检测结果

关键模块说明:

模块 全称 作用
Conv 标准卷积 基础特征提取
C2f Cross Stage Partial with 2 Fusions 高效残差特征提取
SCDown Spatial-Channel Decoupled Downsampling 高效下采样,减少信息损失
SPPF Spatial Pyramid Pooling Fast 多尺度感受野融合
PSA Partial Self-Attention 轻量全局注意力
C2fCIB C2f + Compact Inverted Block 最高层特征提取,倒置瓶颈优化
v10Detect YOLOv10检测头 NMS-free 一对一输出

六、模型训练(train.py

6.1 完整训练脚本

python 复制代码
from ultralytics import YOLOv10
import os

# 强制使用系统自带的 Arial 字体,避免训练时字体下载报错
os.environ['YOLO_FONT'] = r'C:\Windows\Fonts\Arial.ttf'

def main():
    # Step 1:加载模型结构配置(从 yaml 初始化网络权重为随机值)
    #根据自己的实际路径来选择,后面路径问题同理。
    model = YOLOv10(r"D:\YOLOv10_project\yolov10\dataset_part\yolov10n_my.yaml")

    # Step 2:加载预训练权重(迁移学习,从 COCO 预训练权重开始微调)
    model.load(r"D:\YOLOv10_project\yolov10\weights\yolov10n.pt")

    # Step 3:开始训练
    model.train(
        data=r"D:\YOLOv10_project\yolov10\dataset_part\mydata.yaml",  # 数据集配置
        epochs=3,        # 训练轮数(演示用,实际建议100+轮)
        batch=4,         # 每批次图片数(显存不足时减小)
        imgsz=640,       # 输入图像尺寸(640×640)
        device=0,        # 使用 GPU 0 训练(改成'cpu'使用CPU)
        workers=2,       # 数据加载线程数
        project="runs/train",      # 输出根目录
        name="my_first_exp"        # 本次训练实验名称
    )

if __name__ == "__main__":
    main()

6.2 训练参数详解

参数 说明
epochs 3 完整遍历训练集的次数(示例用3轮,生产建议100~300轮)
batch 4 批大小,影响显存占用,4GB显存建议 batch=4~8
imgsz 640 模型输入分辨率,固定为640×640(支持320/416/640/1280)
device 0 指定训练设备,0 为第一块GPU,'cpu' 为CPU训练
workers 2 数据预处理的并行进程数,Windows上建议≤4
project runs/train 训练结果保存的根目录
name my_first_exp 实验名称,结果保存在 project/name/

6.3 迁移学习的优势

本项目采用"先加载 yaml 结构,再加载预训练权重"的迁移学习策略:

python 复制代码
model = YOLOv10("yolov10n_my.yaml")  # 用自定义 yaml 初始化结构(nc=3)
model.load("yolov10n.pt")             # 加载 COCO 预训练权重(nc=80),自动适配层

优势

  • 骨干网络(Backbone)继承了在 COCO 数据集上训练的特征提取能力
  • 针对小数据集(本项目数据量有限)效果显著优于从头训练(from scratch)
  • 收敛速度更快,通常只需 30~50 个 epoch 即可达到较好效果

6.4 训练输出结构

训练完成后,结果保存在 runs/train/my_first_exp/ 目录下:

复制代码
runs/train/my_first_exp/
├── weights/
│   ├── best.pt     # 验证集 mAP 最高时的权重(推理时使用这个)
│   └── last.pt     # 最后一个 epoch 的权重
├── results.csv     # 训练过程中的各项指标记录
├── confusion_matrix.png  # 混淆矩阵(类别预测准确率可视化)
├── PR_curve.png    # 精确率-召回率曲线
├── F1_curve.png    # F1 分数曲线
└── train_batch*.jpg  # 训练批次样本可视化

关键文件weights/best.pt 是后续推理和部署的核心文件,本项目将其复制到 project/best.pt 使用。

6.5 训练过程监控

训练过程中会实时在终端打印如下指标:

复制代码
Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
  1/3      1.23G      1.423      1.892      1.234        156        640
  2/3      1.24G      1.156      1.543      1.098        148        640
  3/3      1.21G      0.987      1.312      0.956        162        640

指标含义

指标 说明
box_loss 边界框回归损失(越小越好)
cls_loss 类别分类损失(越小越好)
dfl_loss Distribution Focal Loss(边界框分布损失)
GPU_mem 当前 GPU 显存占用

七、小结与预告

本文完整介绍了 YOLOv10 轮毂缺陷检测项目的前半部分:

项目背景 :工业检测需求与三类缺陷定义

YOLOv10 原理 :NMS-Free 设计与模型家族对比

环境搭建 :uv 包管理器的使用与依赖安装

数据集制作 :YOLO 格式标注与 mydata.yaml 配置

模型配置 :yolov10n_my.yaml 结构逐层解析

模型训练train.py 完整脚本与参数说明

下一篇(第二篇) 将介绍:

  • 使用 pre.py 进行命令行快速推理测试
  • 基于 PyQt5 开发可视化检测应用界面
  • DetectionThread 多线程架构设计
  • 图片、视频、摄像头实时检测功能实现

📌 源码地址 :YOLOv10 官方仓库 https://github.com/THU-MIG/yolov10

📌 系列文章 :[下一篇 → YOLOv10 轮毂缺陷检测(下)------模型推理与可视化应用界面](#下一篇 → YOLOv10 轮毂缺陷检测(下)——模型推理与可视化应用界面)

相关推荐
machunlin~10 小时前
Android(Termux)部署 NCNN + YOLOv8 完整教程
yolo·termux
子午10 小时前
基于YOLO的车牌识别检测~Python+YOLOV8算法+车牌定位+车牌检测+深度学习
python·算法·yolo
輕華11 小时前
YOLOv10轮毂缺陷检测(下)——模型推理与PyQt5可视化应用
开发语言·qt·yolo
迪菲赫尔曼11 小时前
UltraConsole:一个工业级 YOLO 推理可视化控制台,从前端到后端的完整实践
前端·yolo
jay神1 天前
基于YOLOv8的交通标志识别Web系统
前端·人工智能·深度学习·yolo·机器学习·毕业设计
我材不敲代码1 天前
目标检测:YOLOv12环境配置,全文详细教程
人工智能·yolo·目标检测
深度学习lover1 天前
<数据集>yolo 易拉罐识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·易拉罐识别
hans汉斯1 天前
【人工智能与机器人研究】基于改进YOLOv11的野外中草药目标检测
人工智能·yolo·目标检测·目标跟踪·机器人