【YOLO V5】目标检测 WSL2 AutoDL VScode SSH
- 前言
- 整体思路
- 理解向
- YOLO 目标检测完整流程
- 环境配置
- Anaconda
- 获取 YOLO 代码与预训练模型
- 下载 YOLOv5 代码和预训练模型
- 配置 YOLOV5 工程环境
- 解压 YOLOv5 源代码 并 添加预训练模型
- 调整依赖版本
- 选择对应的 Python 解释器
- 数据集准备
- 下载 COCO 动物数据集
- 存放数据集
- 执行 Python 脚本,转换标签格式
- 正确的数据集格式
- 训练 YOLO 模型
- 参数配置
- 路径管理注意事项
- 本地训练
- AutoDL 服务器训练
- JupyterLab 连接
- VScode SSH 远程连接
- 训练结果
- YOLO 推理
前言
对于初学者来说,学习YOLO和实现目标检测时,其实不需要了解底层原理,比如CNN神经网络。虽然这些知识有助于深入理解,但如果只是想快速上手YOLO,不必从这些复杂的原理开始。本篇内容正是基于这个思路,重点讲解如何快速上手YOLO,如何在服务器上训练自己的模型,并实现目标检测。
本文以 YOLOv5 在 COCO 数据集上的训练为例,阐述 YOLOv5 目标检测任务的完整实现流程。
我的环境:
WSL2 Ubuntu 20.04 YOLOv5 PyTorch 1.7.0 VSCode SSH连接autoDL服务器
参考资料:
【干货】两小时带你训练和使用yolov5,yolov5详细教学,yolov5环境配置,2024年
【手把手带你实战YOLOv5-拓展篇】使用AutoDL服务器进行模型训练
【手把手带你实战YOLOv5-拓展篇】Vscode基本使用与AutoDL服务器连接
【基于Ubuntu下Yolov5的目标识别】保姆级教程 | 虚拟机安装 - Ubuntu安装 - 环境配置(Anaconda/Pytorch/Vscode/Yolov5) |全过程图文by.Akaxi
【Anaconda】Linux系统下Anaconda详细安装过程
整体思路
理解向
我们可以将 YOLO 理解为一个 学生 :
训练集 = 有标准答案的习题集(帮助学生根据答案总结规律,提升能力)
验证集 = 单元检测卷(让学生训练完后做题并根据表现进行这一轮训练的评分)
测试集 = 期末考试(学期结束时,测试学生的最终学习的成果)
训练YOLO模型的过程: 就是给这个学生提供一套标准答案的习题集(有标注的训练集),让学生据答案总结规律并逐渐提升。随着训练的进行,模型(学生)会不断变强,最终变成一个更“厉害”的学生——这就是训练后的 YOLO 模型(也叫权重)。
验证YOLO模型的过程: 当学生完成一套有标准答案的习题集后,能力有所提升,成为更“厉害”的学生。接着,我们给更“厉害”的学生一套单元检测卷,检查他在这一轮学习后的掌握情况。
测试YOLO模型的过程: 经过多轮习题集的学习和单元检测卷的验证后,我们让最优秀的学生(最优权重 best weights):参加期末考试,以此测试他在所有学习轮次后的最终能力。
举个栗子:
如果我们希望 YOLO 识别水果,就需要提供大量带标签的水果图片(相当于给学生提供带标准答案的习题)。YOLO 通过学习这些图片,掌握规律,最终训练出一个能够识别水果的模型(擅长检测水果的“学生”)。
在训练过程中,YOLO 每训练一轮就会“升级”一次,就像学生每做完一轮习题,能力都会有所提升。每次升级后,我们需要验证它的表现,于是给它一套没有标准答案的题目(验证集),再对比标准答案,评估它这一轮的学习效果。
经过多轮训练和验证,最终会使用测试集进行“终极考核”,类似于学生的期末考试。测试集能衡量模型的最终表现,确保它在实际应用中足够可靠。
训练完成后,我们会选择表现最好的模型(最佳权重)用于后续的水果的目标检测任务,就像学生经过专项训练后,能在相关的专项习题中有更好的表现。
YOLO 目标检测完整流程
环境配置–获取YOLO代码与预训练模型–数据集准备–训练YOLO模型–评估与测试–模型部署与应用
- 环境配置 – 安装 Anaconda,并配置 PyTorch 与 CUDA(如果使用本地 GPU 训练)
- 获取 YOLO 代码与预训练模型 – 下载 YOLOv5 官方代码库,并准备预训练的权重文件
- 数据集准备 – 下载并转换数据集,使其符合 YOLO 格式;若使用自定义数据集,则需收集图片并进行标注。
- 训练 YOLO 模型 – 在本地或服务器上进行模型训练,调整超参数并优化权重,提高检测效果。
- 模型评估与测试 – 选择训练过程中表现最优的模型,并在测试集上进行评估
- 模型部署与应用 – 将训练好的 YOLO 模型部署到实际场景
环境配置
Anaconda
该部分内容可以参考:【Anaconda】Linux系统下Anaconda详细安装过程
安装Anaconda:
在 Windows 下,前往 Anaconda清华镜像站 下载适合的 Anaconda 安装包。本次示例下载的是 Anaconda3-2021.05-Linux-x86_64.sh
下载完成后,将安装包复制到 WSL,并进入其所在目录执行安装:
cd ~
bash Anaconda3-2021.05-Linux-x86_64.sh
环境变量配置:
安装完成后,需要将 Anaconda 添加到环境变量,使其能够在终端中直接使用
- 打开
.bashrc
文件:nano ~/.bashrc
- 在文件末尾添加 Anaconda 路径(请替换
XXX
为你的实际安装路径):export PATH="XXX/anaconda3/bin:$PATH"
- 使环境变量生效:
source ~/.bashrc
最后,关闭并重新打开终端,如果命令行前面显示 (base),就说明 Anaconda 已成功配置并生效
创建虚拟环境:
-
创建虚拟环境:(指定 Python 版本 3.8,兼容性较好)
conda create yolo_v5 python=3.8
-
激活虚拟环境:
conda activate yolo_v5
-
更换 pip 源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
- 更换 conda 源
sudo nano ~/.condarc
在打开的文件中,复制并粘贴以下内容,然后保存:
channels:- defaults
show_channel_urls: true
default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmsys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudbioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmenpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudsimpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
后续所有操作均需在(yolo_v5)环境中进行
获取 YOLO 代码与预训练模型
下载 YOLOv5 代码和预训练模型
下载 YOLOv5 源代码
- 访问 YOLOv5 官方仓库
- 在 Tags 选项中查看所有历史版本,并选择 v6.0(该版本兼容性较好,较新版本在 Jetson Nano 部署时可能存在依赖兼容性问题)
- 在 YOLOv5-6.0 中点击 Source code (zip) 下载 YOLOv5 6.0 版本的源代码压缩包
下载预训练模型
- 在 YOLOv5-6.0 页面中,可以看到官方提供的多种预训练模型,并附带性能参数供选择
- 根据需求选择适合的模型,这里推荐 YOLOv5s(轻量化,速度快,适用于大多数场景)。
- 点击 yolov5s.pt 下载 YOLOv5s 预训练权重文件。
预训练模型的性能参数:
yolov5s.pt 预训练的权重文件:
配置 YOLOV5 工程环境
解压 YOLOv5 源代码 并 添加预训练模型
-
将下载的 yolov5-6.0.zip 复制到 WSL 的 YOLO 项目目录中 解压文件
tar -xvf yolov5-6.0.zip
-
进入项目目录,打开该文件夹
cd yolov5-6.0 code .
-
将 yolov5s.pt 预训练权重文件复制到
weights
目录(如果没有该目录,则手动创建):mkdir -p weights # 创建 weights 目录(若不存在) mv yolov5s.pt weights/ # 移动权重文件
调整依赖版本
打开 requirements.txt,将所有 >= 替换为 =,确保依赖版本固定,避免因版本过新导致兼容性问题
注释 PyTorch 相关依赖:由于训练将在服务器上进行,本地无需安装 PyTorch,因此需在 requirements.txt 中注释掉 torch 和 torchvision。但请记住 PyTorch 版本要求,确保在服务器上选择符合要求的 PyTorch 版本
关于 PyTorch 的安装及 requirements.txt
依赖安装过程中可能遇到的报错,可以参考 【干货】两小时带你训练和使用 YOLOv5,YOLOv5 详细教学,YOLOv5 环境配置(2024) 视频的 21 分钟 部分
选择对应的 Python 解释器
在 VSCode 中,按下 Shift + Ctrl + P
调出命令面板,在搜索栏输入 “Python: Select Interpreter”,然后选择 yolo_v5
虚拟环境下的 Python 3.8 解释器,如下图所示
数据集准备
本次示例使用 COCO 动物数据集,但由于 COCO 数据集的标签格式与 YOLO 格式不兼容,因此需要进行格式转换。
下载 COCO 动物数据集
在 Files 目录中,找到 dataset.tar.gz 文件并下载
存放数据集
- 下载完成后,将 dataset.tar.gz 解压,并将其复制到 YOLOv5-6.0 项目目录下的 data/dataset 文件夹。
- 此外,还需将数据集复制一份至 data/data_org 目录,该目录用于格式转换。
- 由于 COCO 数据集的标签格式不同于 YOLO(COCO 仅提供一个标签文件,而 YOLO 需要为每张图片生成一个对应的 .txt 标签文件),因此需编写脚本进行转换。
执行 Python 脚本,转换标签格式
import os
import cv2 as cv
import json# 定义项目根目录
ROOT = os.path.dirname(os.path.abspath(__file__)) # 获取当前脚本所在目录# 使用 Path 进行路径拼接
img_folder = ROOT / 'data/dataset/val/images'
label_path = ROOT / 'data/data_org/val/_annotations.coco.json'# test 测试集图片文件名列表
img_path_lst = os.listdir(img_folder)# 为每一张图片创建一个空白的 .txt 标签
for img_name in img_path_lst:with open(os.path.join(img_folder.replace("images","labels"),img_name.replace(".jpg",".txt")),'w') as f:# 读取文件
with open(label_path, 'r') as f:content = json.load(f)
pass# 创建一个id到图片名的映射,以字典形式存储
dict_id2img = dict()
for img_info in content['images']:dict_id2img[img_info['id']] = img_info['file_name']
pass# 开始读取标注信息,处理后写入txt文件
for label_info in content['annotations']:img_name = dict_id2img[label_info['image_id']]class_name = label_info['category_id']x_center = (label_info['bbox'][0] + label_info['bbox'][2]) / 2 / 640y_center = (label_info['bbox'][1] + label_info['bbox'][3]) / 2 / 640w = label_info['bbox'][2] / 640h = label_info['bbox'][3] / 640with open(os.path.join(img_folder.replace("images", "labels"), img_name.replace(".jpg", ".txt")), 'a') as f:f.write("{} {} {} {} {}\n".format(class_name, x_center, y_center, w, h))
注意事项
-
单次转换单个数据集:
该脚本 每次只能转换一个数据集(训练集train
、验证集val
或测试集test
)。
如需转换多个数据集,请分别修改img_folder
和label_path
的路径,并 单独运行 脚本。 -
数据转换完成后,数据集应符合 YOLO 格式:
转换后,
dataset
目录下应包含:images/
文件夹(存放图像文件)。labels/
文件夹(存放与图像一一对应的.txt
标签文件)。
-
确保 COCO 格式 JSON 文件路径正确:
label_path
需要正确指向 COCO 数据集的 JSON 标签文件,否则转换时会找不到数据,导致错误。- 建议 将 COCO 的 JSON 标签文件 单独存放在
labels/
目录,确保images/
目录下 仅存放图片,避免混淆和潜在错误。
正确的数据集格式
your_project/
│── yolov5-6.0/ # YOLOv5 项目主目录
│ ├── data/ # 数据集相关文件
│ │ ├── dataset/ # 存放实际的图片和标签
│ │ │ ├── train/ # 训练集
│ │ │ │ ├── images/ # 训练集图片
│ │ │ │ │ ├── img_1.jpg
│ │ │ │ │ ├── img_2.jpg
│ │ │ │ │ ├── ...
│ │ │ │ ├── labels/ # 训练集标签(YOLO 格式,一一对应)
│ │ │ │ │ ├── img_1.txt
│ │ │ │ │ ├── img_2.txt
│ │ │ │ │ ├── ...
│ │ │ ├── val/ # 验证集
│ │ │ │ ├── images/
│ │ │ │ ├── labels/
│ │ │ ├── test/ # 测试集
│ │ │ │ ├── images/
│ │ │ │ ├── labels/
│ │ ├── data_org/ # 存放原始数据(COCO 格式)
│ │ │ ├── train/
│ │ │ │ ├── images/
│ │ │ │ ├── labels/ # 存放单个 COCO 的 JSON 文件
│ │ │ │ │ ├── _annotations.coco.json
│ │ │ ├── val/
│ │ │ │ ├── images/
│ │ │ │ ├── labels/
│ │ │ │ │ ├── _annotations.coco.json
│ │ │ ├── test/
│ │ │ │ ├── images/
│ │ │ │ ├── labels/
│ │ │ │ │ ├── _annotations.coco.json
训练 YOLO 模型
参数配置
YOLO的训练主要通过 train.py
函数进行,因此我们只需关注这个文件。以下是一些关键的传入参数,它们用于配置训练过程:
- weights (权重文件)
这是预训练模型的文件,可以选择进行微调,使用官方模型(如 yolov5s),或者从零开始训练(不推荐)。
填写权重文件的路径时,ROOT
表示从项目根目录开始的相对路径。
-
cfg (结构文件)
该文件用于描述 YOLO 模型的架构和结构。根据所使用的模型选择对应的 YAML 配置文件。
例如,若选择 yolov5s 模型,则应选择 yolov5s.yaml 配置文件。每个模型都有对应的 YAML 文件,其中定义了网络层、输入输出参数等结构信息。 -
data (数据集文件)
该文件定义了数据集(训练集、验证集、测试集)的路径、类别数量
例如,以下文件包含了这些信息,用于告知模型如何加载和处理数据。
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../yolov5-6.0/data/dataset # dataset root dir
train: train/images # train images (relative to 'path') 118287 images
val: val/images # train images (relative to 'path') 5000 images
test: test/images # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
nc: 11 # number of classes
names: ['animals', 'cat', 'chicken', 'cow', 'dog', 'fox', 'goat', 'horse', 'person', 'racoon', 'skunk'] # class names
-
epochs (训练轮数)
训练的轮次,轮数越高,模型训练得越充分,但训练时间也越长。YOLO 在训练到认为是最佳模型时会自动停止,因此不必担心过度训练。 -
batchsize (批次大小)
这是每次训练时投入的数据量,直接影响到 GPU 显存的使用。显存越大,可以设置更大的批次大小。
PS:GPU显存的占用情况可以在训练过程中看到,每轮训练时会显示 GPU 显存的实时使用情况。如果使用租赁服务器,记得充分利用显卡的性能,以确保训练效率最大化。 -
imgsz (图片尺寸)
图像尺寸,通常默认设置为640x640
。 -
device (训练设备)
指定用于训练的设备。如果使用 CPU,则填写cpu
;如果使用 GPU 训练,则填写指定 GPU 的编号(默认通常为0
)。如果使用多个 GPU,可以填写0,1,...
。
路径管理注意事项
- 在 Python 中,建议使用
ROOT
变量表示项目的根目录,例如:
from pathlib import Path
import osFILE = Path(__file__).resolve() # 获取当前脚本的绝对路径
ROOT = FILE.parents[0] # 获取项目根目录(即当前文件所在目录的父目录)
if str(ROOT) not in sys.path: # 如果 ROOT 目录不在 sys.path 中,将其添加到 sys.pathsys.path.append(str(ROOT)) # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # 使用相对路径获取 ROOT 目录相对于当前工作目录的路径data_path = ROOT / 'data/dataset.yaml' # 数据集路径
weights_path = ROOT / 'weights/yolov5s.pt' # 预训练模型路径
- 在 YAML 文件中,使用
..
表示回退上一级目录,例如:
train: ../yolov5-6.0/data/dataset/train/images
val: ../yolov5-6.0/data/dataset/val/images
在 YAML 文件中,使用 ../yolov5-6.0
来表示当前项目目录的上层文件夹。..
表示回退到当前文件夹的上层文件夹,例如,若文件结构是 a/b/c
,在 c
文件夹中,..
就代表 a
文件夹。相对路径有时容易混淆,导致出错。如果无法区分清楚,使用绝对路径也是可行的,尽管修改时会更麻烦一些。
本地训练
1. 直接运行
python train.py
该命令会使用 train.py
中预设的默认参数进行训练
2. 运行时指定参数
python train.py --weights yolov5s.pt --epochs 100 --batch-size 16
这样可以 临时修改参数,不会影响 train.py
文件中的默认配置,方便灵活调整训练设置
AutoDL 服务器训练
该部分建议参考:
【手把手带你实战YOLOv5-拓展篇】使用AutoDL服务器进行模型训练
【手把手带你实战YOLOv5-拓展篇】Vscode基本使用与AutoDL服务器连接
首先,我们需要创建服务器实例:
进入 AutoDL AI算力云 的算力市场选择所需的GPU
然后选择适合YOLO环境的镜像版本。注意镜像要满足YOLO依赖的框架(PyTorch)、Python版本以及CUDA版本。
如果你不清楚具体版本要求,可以查看YOLO项目中的依赖说明(一般在requirements.txt中)
确认镜像选择无误后,点击下方“立即创建”按钮创建实例。
JupyterLab 连接
服务器创建完成后,直接点击控制台中的JupyterLab按钮进行连接:
进入JupyterLab后,上传你的YOLO项目文件。接下来,参照前文说明修改相关参数(如weights路径等),即可在服务器上快速开始训练。其他的训练操作步骤与本地训练流程一致。
VScode SSH 远程连接
该部分内容建议参考:【手把手带你实战YOLOv5-拓展篇】Vscode基本使用与AutoDL服务器连接 9分钟 后的内容
步骤如下:
-
在VSCode中点击左下角打开远程资源管理器,点击+添加SSH连接:
-
将生成的SSH配置文件保存到默认位置即可,无需额外修改:
-
输入AutoDL中的登录指令与对应的密码进行连接
-
连接成功后,即可在VSCode远程环境中操作
后续具体流程和本地训练以及 JupyterLab 方式一致。
训练结果
每次训练会生成一个 runs/train
文件夹,其中的 exp
目录代表实验编号(即训练的轮次)。我们主要关注 runs/train/exp/weights
文件夹中的**权重文件**,该文件夹包含:
- 最新的权重文件:通常是
last.pt
,代表当前训练过程中的最新模型权重。 - 最佳权重文件:通常是
best.pt
,代表在训练过程中性能最好的模型
通常我们重点关注 best.pt 作为最优模型
此外,在训练完成后,runs/train/exp 目录下会生成基于 best.pt 模型运行验证集的结果(即 best.pt 在验证集上的目标检测表现)。同时,还会包含损失、精度、mAP 等评估指标,用于衡量和优化模型的性能。在初学阶段,可以将这些细节放在一边,专注于模型的最终表现。
YOLO 推理
在训练出合适的模型后,我们可以使用最优模型进行推理。YOLO 推理主要通过 detect.py
脚本实现,和训练过程类似,我们需要修改一些参数来配置推理。
参数配置
-
weights (权重文件)
选择训练好的模型进行推理。如果任务简单,也可以使用预训练模型(例如yolov5s.pt
)进行推理。 -
source(输入数据源)
指定推理的输入数据源,可以是图片集、URL或者使用摄像头作为输入源(0
表示使用摄像头)。 -
imgsz (图片尺寸)
设置输入图像的尺寸,默认通常为640x640
。 -
conf-thres (置信度阈值)
用于过滤低置信度的检测框。默认设置为0.25
,意味着只有置信度高于 25% 的目标才会被保留。根据实际情况调整,如果阈值设置得过低,可能会出现很多错误的检测框。 -
device (设备)
指定推理时使用的设备。如果使用 CPU,则填写cpu
;如果使用 GPU,则填写指定 GPU 的编号(通常默认为0
)。如果使用多个 GPU,则可以指定多个设备(如0,1
)。
注意:只需修改 source
参数,即可指定推理本地图片、视频文件或摄像头输入。
推理完成后,检测结果(标注后的图片和视频)默认保存在 runs/detect/exp/
目录下。