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 轮毂缺陷检测(下)——模型推理与可视化应用界面)