☰
Linux 上训练 YOLOv8 实战:从环境搭建到模型导出全流程
2026/9/29 15:37:07 网站建设 项目流程

简介:这是一份面向Linux服务器端YOLOv8自定义数据集训练的完整项目代码,聚焦环境配置、数据准备、单卡/多卡训练与模型验证的端到端流程,适合具备基础Python知识、希望减少踩坑的深度学习开发者和科研人员。资源共11个文件,核心为4个Python脚本与2个YAML配置,另有模型权重、示例图片和说明文档,压缩包仅5.71MB,结构紧凑,便于快速下载与本地查阅。代码覆盖数据预处理与示例数据生成,可将JPG图像与XML标注转换为YOLO所需的txt标签,并生成dataset.yaml供训练读取;train.py同时支持单卡和多卡训练,demo_yolov8.py配合示例图片可快速验证模型效果,附有detect运行输出便于对比推理结果。说明文档与配置文件汇总了常见CUDA报错排查思路,配合yolov8n.pt权重可离线复现基本流程。已有114人学习下载,适合在Linux服务器上稳定搭建YOLOv8训练流程的个人与团队参考。

1. 在 Linux 上训练 YOLOv8:这份项目代码能让你少走一个月弯路

很多人在 Windows 上能把 YOLOv8 跑通,一换到 Linux 服务器就各种报错:CUDA 版本对不上、显存溢出、训练到一半进程被杀、loss 变成 nan。这套 Linux 训练 YOLOv8 项目代码,不是简单给你一个仓库,而是把我平时训练模型的完整流程:从驱动检测、conda 环境搭建、数据集标注、data.yaml 编写到训练参数调优、断点续训、推理验证全部串起来了。适合两类人:一是刚接触 Linux 服务器、想在 GPU 机器上训练自己数据集的新手;二是已经在 Windows 上跑过 YOLOv8、想迁移到 Linux 做正式训练或部署的开发者。下面我按自己实际操作的顺序拆开讲,每一步都写清楚为什么这么做。

2. Linux 训练环境搭建:从驱动检测到 ultralytics 可用,全流程拆解

2.1 环境自检:先用三条命令看清你的 GPU 和 CUDA

拿到一台 Linux 服务器,第一件事不是装东西,而是先看这台机器有什么。盲装 CUDA 和 PyTorch 是后期各种玄学报错的最大来源。

# 查看 GPU 型号和显存 nvidia-smi # 查看显卡驱动版本 nvidia-smi --query-gpu=driver_version --format=csv # 查看系统架构(x86_64 还是 aarch64) uname -m

逻辑说明:nvidia-smi如果直接报 command not found,说明驱动没装;如果显示了 GPU 列表,右上角的 CUDA Version 是当前驱动支持的最高 CUDA 版本,不是说你已经装了 CUDA。uname -m是为了确认你在 x86 服务器上还是 ARM 开发板上,因为 PyTorch 的安装命令在两种架构上不一样。

参数说明:驱动版本和 CUDA 版本是联动关系,比如驱动 535.x 通常支持 CUDA 12.2,而 470.x 最高只能到 CUDA 11.4。后面装 PyTorch 时,要选一个小于等于驱动支持 CUDA 版本的 PyTorch 版本,否则 PyTorch 会提示找不到可用的 GPU。这也是新手最常见的翻车点。

2.2 conda 创建独立环境:python 版本不要直接用系统默认

我习惯用 Anaconda 或 Miniconda 管理环境,而不是直接在系统 Python 里 pip install,因为 YOLOv8 项目依赖 PyTorch、opencv-python、ultralytics 等一系列包,系统 Python 往往被其他项目占用,版本一冲突就是灾难现场。

# 创建 Python 3.10 环境,yolov8 是环境名 conda create -n yolov8 python=3.10 -y # 激活环境 conda activate yolov8 # 安装 PyTorch(以 CUDA 12.1 为例,具体版本按你 nvidia-smi 看到的来) pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121

逻辑说明:Python 3.10 是目前 YOLOv8 项目兼容性最好的版本,3.11 和 3.12 在某些依赖包上还有坑。PyTorch 的安装地址--index-url指定了 CUDA 版本对应的 wheel 包,这里不是随便装的,装错了后面训练时 GPU 完全用不上。

参数说明:如果你看到的 CUDA 是 11.8 就把cu121改成cu118;没有 GPU 的机器用 CPU 版 PyTorch,训练速度会慢到让人崩溃,但至少能跑通流程。装完之后建议执行python -c "import torch; print(torch.cuda.is_available())",输出 True 才代表 PyTorch 能正常调用 GPU。

2.3 安装 ultralytics 并验证环境是否闭环

PyTorch 装好后,核心的检测框架就是 ultralytics 这个包。它把训练、验证、推理、导出统一封装了,命令行直接可以调用,这也是 YOLOv8 相比手动写训练脚本的最大优势。

# 安装 ultralytics pip install ultralytics # 验证版本和依赖完整性 yolo version # 跑一个 5 步预训练 demo,确认训练流程能走通 yolo detect train data=coco8.yaml model=yolov8n.pt epochs=1 imgsz=640

逻辑说明:coco8.yaml是 ultralytics 自带的一个微型数据集,只有 8 张图,专门用来验证环境。yolov8n.pt是 nano 级别的预训练权重,模型小、训练快,第一次跑通用它最稳。这一步如果顺利走完,说明 GPU 调用、数据加载、训练循环、权重保存整个链路是通的,后面换自己的数据集只是改 yaml 的事。

参数说明:epochs=1表示只训练 1 轮,imgsz=640表示输入图像缩放到 640x640。如果你在这一步就爆显存,回到上一节检查 PyTorch 的 CUDA 版本是不是真的装对了,而不是先怀疑代码。

提示:Linux 服务器上如果执行yolo命令报找不到,检查当前 conda 环境是否是激活状态,或者用python -m ultralytics代替yolo。

3. 准备自己的数据集:标注格式、目录结构、data.yaml 一个都不能错

3.1 标注工具选型:为什么我推荐 labelImg 而不是在线工具

数据集是自己训练 YOLOv8 绕不开的一环。YOLOv8 的检测任务需要每张图对应一个同名 txt 文件,里面每行格式是:类别id x_center y_center width height,四个坐标都是相对图片宽高的归一化数值,用 labelImg 可以一键生成这种格式。

# 在本地或服务器安装 labelImg pip install labelImg # 启动标注工具 labelImg

逻辑说明:labelImg 启动后,在界面里选择 Open Dir 打开图片目录,选择 Change Save Dir 设置标签保存目录,然后用快捷键 W 画框,D 切下一张。标注完成后,每张图会生成一个与图片同名的 txt 文件。关键点是保存时格式选择 PascalVOC 还是 YOLO,一定要选 YOLO 格式,否则生成的是 XML 文件,还要二次转换。

参数说明:标注时类别编号从 0 开始,记住这个顺序,因为后面写 data.yaml 时,类别名称列表的索引就是你在标注时填的编号。如果一张图里同时有多个类别,都在同一个 txt 文件里逐行写入。标注这种事没有捷径,我一般是先标 500 张做第一批训练,看效果再补标。

3.2 数据集目录结构:训练集、验证集的划分方式

YOLOv8 不强制规定目录结构,但它要求你在配置里写明 train 和 val 的路径。我习惯用下面这种规范结构,因为后续换模型、换机器迁移都方便。

# 数据集根目录 datasets/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标签(txt) │ └── val/ # 验证标签(txt) └── data.yaml # 数据集配置文件

逻辑说明:images/train和labels/train下的文件名必须一一对应,比如图片叫0001.jpg,标签就叫0001.txt;images/val对应labels/val。YOLOv8 在训练时是根据图片路径去找同名 txt 的,文件名对不上直接报错,而且报错信息还不明显,这是很多人踩过的大坑。

参数说明:验证集一般取总量的 10% 到 20%,划分时要保证每个类别在验证集里都有出现,随机抽样容易漏类。我一般用一个小脚本按类别做分层抽样,而不是一句shuf随机分完就了事,后面会附上脚本。

3.3 写 data.yaml:三类参数决定训练数据加载

data.yaml 是数据集和训练命令之间的桥梁,很多人忽略这里,结果训练时类别数对不上、路径找不到,各种怪问题。

# data.yaml path: /home/user/datasets # 数据集根目录,建议写绝对路径 train: images/train # 训练图片目录(相对 path) val: images/val # 验证图片目录(相对 path) nc: 2 # 类别数 names: ['person', 'car'] # 类别名称,顺序必须和标注编号一致

逻辑说明:path写绝对路径,不要在训练命令里再去拼接,少一层出错空间。train和val是相对path的路径。nc是类别数量,names是类别名列表,索引 0 对应刚才标注里的编号 0。这里如果写错,训练不会报错,但验证曲线会完全混乱,属于那种很难排查的隐蔽错误。

参数说明:如果你的图片和标签放在同一个目录下,YOLOv8 也支持在 yaml 里用names自动识别,但我强烈建议分开,因为后面做增强、过滤、导出都要分别操作图片和标签。还有一点,Linux 下路径区分大小写,images和Images是两个不一样的东西。

4. 训练实操:命令行参数逐项拆解,打通从数据到权重

4.1 启动训练:核心参数含义与推荐取值

数据集准备好之后,训练这一步其实是最简单的,因为 ultralytics 把训练调度都封装好了。但命令行参数怎么填,直接决定你这一轮训练是有效还是白跑。

yolo detect train \ data=/home/user/datasets/data.yaml \ model=yolov8m.pt \ epochs=200 \ imgsz=640 \ batch=16 \ device=0 \ workers=8 \ lr0=0.01 \ patience=50

逻辑说明:model=yolov8m.pt表示用 YOLOv8m 的预训练权重作为初始权重,这叫迁移学习。相比从头训练,收敛速度更快、精度更高。epochs=200是总轮数,patience=50表示如果连续 50 轮验证集 mAP 没有提升,就提前停止训练,防止过拟合和无效等待。

参数说明:batch=16是单 GPU 的批大小,训练时显存占用和 batch 基本成正比。12G 显存跑 YOLOv8m 640 分辨率,batch 一般设置在 8 到 16 之间;如果你 OOM 了,先把 batch 减到 4 或者 2,不要一上来就改模型。device=0指定用第一块 GPU,多卡用device=0,1。workers=8是数据加载的进程数,Linux 下可以开到 CPU 核心数的一半,开太多容易内存吃满。lr0=0.01是初始学习率,默认值对大多数场景够用,除非你的数据集特别大或者特别小,否则先不动它。

4.2 理解训练输出:loss 曲线、mAP、P/R 曲线

训练开始后终端会刷出一行行指标,很多人只盯着 loss 看,其实 mAP50 和 mAP50-95 才是判断模型真实能力的核心。loss 下降但 mAP 不涨,说明模型可能过拟合了。

Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 1/200 7.2G 0.09123 0.01234 0.04567 120 640 2/200 7.2G 0.07512 0.00987 0.03821 132 640

逻辑说明:box_loss是边界框回归损失,cls_loss是分类损失,dfl_loss是分布焦点损失,三个 loss 稳步下降是正常现象。如果 loss 接近 0 但 mAP 很低,先检查 data.yaml 里names的顺序是不是和标注一致。

参数说明:训练结束后,在runs/detect/train/目录下会生成results.png、confusion_matrix.png、PR_curve.png等图表。我每次训练完第一件事是看results.png里面的验证集 mAP 曲线,而不是看训练集 loss。训练集 loss 再好看,验证集 mAP 不涨也是白搭,这个方向很多新手搞反了。

4.3 断点续训与模型选择:后悔药的两种吃法

训练中途断掉是 Linux 服务器上的常事。可能是有人占了 CPU、内存被 OOM killer 干掉、或者显卡驱动崩了。ultralytics 默认每轮都会保存last.pt,这就是你的后悔药。

# 从断点继续训练,resume 参数直接指向 last.pt yolo detect train \ resume=run/detect/train/weights/last.pt # 或者在原命令参数后加 resume=True yolo detect train data=... resume=True

逻辑说明:resume 不仅会恢复权重,还会恢复优化器状态、学习率调度和当前 epoch 数。如果你用model=last.pt而不是resume,虽然也是从权重继续,但学习率会重新从初始值开始,效果完全不同,别搞混。

参数说明:训练结束后,weights/目录下会有best.pt和last.pt。best.pt是验证集 mAP 最高的权重,推理部署用这个;last.pt是最后一轮权重,但最后一轮不一定是最优的。我自己的习惯是:训练完只保留best.pt,其余全部删掉。

5. Linux 训练 YOLOv8 常见问题与排查:五条血泪记录

5.1 显存与性能类问题

现象一:训练刚开始没几步,直接报CUDA out of memory,进程被杀。

原因:显存被其他进程占用,或者 batch 设置超出了显卡容量。很多服务器是多人共用的,nvidia-smi看到的显存占用不一定是你的。

解决:先用nvidia-smi看实际显存占用,然后按显存从大到小依次检查:batch降到 8 以下或改成batch=4,imgsz从 640 降到 544 或 416,workers降到 4,最后还有cache=True(这个参数会在内存里缓存图片,很吃内存但能明显加快训练,前提是你机器内存够大)。

现象二:训练时 GPU 利用率忽高忽低,显卡跑不满。

原因:数据加载成了瓶颈。workers=0时数据是主进程逐个加载的,GPU 只能等 CPU。

解决:把workers设为 CPU 核心数的一半,比如 16 核机器用workers=8。另外,ultralytics默认启用 dataloader 的缓存机制,Linux 下如果你的数据集在机械硬盘上,把数据集放到 SSD 上也会立竿见影,这个细节经常被忽略。

5.2 数据与版本类问题

现象三:训练不报错,但mAP永远很低的某个值,或者类别数对不上。

原因:data.yaml 里nc和names的索引与实际标注不一致。比如标注时类别 id 写在了 1,但 data.yaml 里 names 第一个是背景类,模型就会学错。

解决:打开任意一个训练标签 txt 文件,看第一列的最大值加一是否等于nc。如果不等于,说明标注文件有问题。这时候唯一的办法是重新标注,或者写脚本批量修正 txt 文件里的类别 id。

现象四:ImportError: cannot import name 'YOLO' from 'ultralytics',或者版本之间 API 对不上。

原因:ultralytics 的版本迭代很快,网上教程对应的版本和你本地安装的不一样。

解决:先pip show ultralytics查版本号,如果代码和教程版本差异过大,就用pip install ultralytics==8.0.0指定版本。我个人的习惯是固定一个用着顺手的版本,不追新,训练这种事稳定比新功能重要。

6. 推理验证与模型导出:从 best.pt 到 ONNX 与 TensorRT

6.1 用训练好的权重做批量推理与可视化验证

训练完best.pt,先不要直接拿去部署,先跑一批验证集图片,用肉眼确认检测效果是否正常,框是不是乱画、类别对不对。

from ultralytics import YOLO # 加载最佳权重 model = YOLO("/home/user/runs/detect/train/weights/best.pt") # 对验证集图片做批量推理并保存结果 results = model.predict( source="/home/user/datasets/images/val", save=True, conf=0.25, iou=0.5, imgsz=640 )

逻辑说明:conf=0.25是置信度阈值,只有置信度高于 0.25 的框才会被保留,太低会输出一堆冗余框;iou=0.5是 NMS 的 IoU 阈值,两个重叠度超过 0.5 的框会被合并掉。这两个参数直接影响视觉效果的干净程度。

参数说明:save=True会把标注好结果的图片存到runs/detect/predict/目录下。最后一定要通过浏览器或者scp把图拉到本地看,服务器上只能看到 loss 数字,图片上的错误才是真错误。

6.2 导出 ONNX 与 TensorRT:为 RK3588 等边缘设备做准备

Linux 上训练的目的经常是为了部署到边缘设备,比如 RK3588 这类 ARM 平台,或者是 NVIDIA Jetson。先把 PyTorch 权重导出为 ONNX,再做后续量化,是最常见的一条路。

yolo export model=best.pt format=onnx imgsz=640 # 导出 TensorRT 引擎(NVIDIA GPU 专用) yolo export model=best.pt format=engine imgsz=640 device=0

逻辑说明:导出 ONNX 时,模型结构和参数会被固化下来,不再依赖 PyTorch 环境,这是跨平台部署的第一步。TensorRT 导出会在你的 GPU 上做一个自动调优,生成的 engine 文件是针对特定 GPU 型号的,换一台显卡就得重新导出,这点要注意。

参数说明:format=onnx会生成best.onnx,format=engine会生成best.engine。如果你要部署到 RK3588,通常 ONNX 是更安全的起点,因为 RKNN 工具链对 ONNX 的支持最成熟,而 TensorRT 是 NVIDIA 的闭门方案,换平台直接失效。

我把这套流程在至少三台不同配置的 Linux 服务器上跑过,每台机器的坑都不一样,但查到最后基本都是版本匹配和数据路径这两类问题。从那以后我每次开始一个新项目,都强制自己先跑一遍本章 2.3 节的 5 步 demo,再决定要不要碰自己的数据集。希望帮到你,祝你的模型一次跑通、mAP 涨得飞快。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询