YoloV8-目标检测-训练自己的数据集

发布时间:

更新时间:

一、开发环境

推荐 Windows 10 以上
Nvidia 显卡(可选)
AnaConda 最新版本即可
Python 3.9 (PyTorch 当前只支持 3.7-3.9)
YoloV8 最新版本即可
PyTorch 2.0.0(CUDA11.8)官方安装要求
标记软件 labelimg 最新版本即可

YoloV8 更新得不慢,官方文档也在持续更新,很多地方比如参数需要结合实际情况调整,这些地方直接查看官方文档即可。

1.1 安装 AnaConda

使用 Anaconda 创建个干净专用的环境,避免和其他内容相互影响。

  1. 下载安装

安装过程中,个人建议勾选 Add to Path,要么后面还要自己添加环境变量,虽然它提示不建议勾选。

  1. 创建虚拟环境

可以使用图形界面或者终端创建新环境,后面其他的命令还是得用终端,所以从这里就调好终端为好。

1
2
3
4
5
6
# 新建虚拟环境:yolo,这个名字随意,目前建议python版本3.9,因为现在gpu相关依赖不支持大于这个版本的,也可以到时再查下是否支持高版本。
conda create -n yolo python=3.9.16 -y
# 查看已有虚拟环境
conda env list
# 激活环境
conda activate yolo

提示:如果命令行前面没有(base),或者无法激活 conda 环境,说明 conda 没有和终端关联,
运行 conda init powershell 这里的 powershell 要替换成当前用的终端类型。
后面的内容都保持终端在名为 yolo 环境下操作。

1.2 安装 yolo

设置清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
改写文件 C:/Users/用户名/.condarc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

继续在终端里运行,v8 的安装也进行了简化,一行命令即可。
pip install ultralytics
查看当前可更新的包
pip list --outdated
更新单个包
pip install --upgrade xxx

1.3 开启 GPU

要求

  • N 卡,官网检查显卡是否支持 CUDA 链接,提示 Your GPU Compute Capability 就是支持。
  • 使用终端查看两个 CUDA 版本,一个是驱动的 CUDA,一个是运行时 CUDA,驱动 CUDA 版本就是运行时支持的最高版本。
    • 查看驱动 CUDA:nvidia-smi
    • 查看运行时 CUDA:nvcc -V
  • 如果显卡规格比较高,但驱动 CUDA 版本比较低,更新显卡驱动或者单独安装指定 CUDA 版本的驱动

安装命令

根据实际情况,在官方文档勾选选项生成命令,比如这样:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

  • 注意选择的 CUDA 版本要和自己的运行时版本一致
  • 如果官网没有自己的版本,去以前的版本里找找:install previous versions of PyTorch
  • 现在的版本不需要像以前还需要单独安装一些内容,这一条命令就可以。

验证安装

1
2
3
4
5
6
7
# 打开新的终端窗口(记得切换环境)
# 进入python
python 回车
# 引入
import torch 回车
# 验证命令
torch.cuda.is_available() 回车

1.4 测试

yolo predict model=yolov8n.pt source="https://ultralytics.com/images/bus.jpg"
如果图片下载超时,创建一个工作目录,用浏览器下载到本地后再运行。
yolo predict model=yolov8n.pt source="./bus.jpg" device=0
预览:添加参数 show=True(大写)或者 show
如果是图片会一闪而过,此时可以添加 save=True 或者 save
yolo predict model=yolov8n.pt source="./bus.jpg" device=0 show save
更多参数

二、训练自己的数据集

2.1 准备待标记训练的图片

略略略

2.2 标记

1. 安装并打开标记软件

有两个标记程序,labelme 和 labelimg,各有优劣

  • labelme 自动保存,多种标记形状,需要将数据转换成 yolo 格式
  • labelimg 自动保存,方形标记,可以直接保存成 yolo 格式

安装 labelme pip install labelme
打开程序 labelme
安装 labelimg pip install labelimg
打开程序 labelimg
由于 labelimg 支持直接导出 yolo 格式,所以个人用这个标记,要么还得用程序转一下。

2. 基础设置

  • 打开自动保存:View-AutoSave
  • 保存类型选择 yolo
  • 更改保存目录到 train/labels

3. 标记技巧

  • 每张图都有的标记,复制文件作为模板,批量改名
  • w 是创建矩形标记,a 是上一个,d 是下一个,手正好放在 wasd 键位上
  • 批量生成整张标记的文件,根据文件名批量生成同名 txt 到 labels 文件夹,其中 f.write 后面第一个数字是类别,后面数字的意思是整张图片。
1
2
3
4
5
path = "./datasets/tst"
for filename in os.listdir(path+"/images"):
txt = os.path.join(path+"/labels", filename).replace(".png",".txt")
with open(txt, "w") as f:
f.write('0 0.5 0.5 1 1')

4. 导出

打开 train/labels/classes,复制到 data.yaml 的#Classes names:[ 这里 ],需要加英文的双引号和逗号,表示字符串数组,而且要在一行,否则会被认为是另外一种 keyvalue 的格式(一行是一个分类 0:player)当然两种写法都行,看自己情况。

2.3 准备训练资源

1. 数据集目录结构

yolo 支持多种组织形式,以下只是其中一种。

  • 下方的结构
  • 复制 train 文件夹并命名为 val 和 test,也就是 3 个文件夹除了名字不同,其他可以都一样,也可以有针对性地设置
  • 用程序将所有文件写到 txt 文本里,再修改 data.yaml 里为文件路径
1
2
3
4
5
6
7
|-- dev
|-- datasets 默认名称,如果改其他的需要改 yaml 文件
|-- train
|-- images 这里存放待标记的截图
|-- labels 这里是标记后的 txt 文件
data.yaml 配置
v8n.yaml 训练自定义空模型

2. 修改文件内参数

以下俩文件都是改自 github
源文件 coco128.yaml,这 3 个路径都是相对 datasets 的路径,也可以设置根目录 path。

1
2
3
4
5
6
train: train/images
val: train/images
test: train/images

# Classes
names: ["player", "door", "monster", "goods"]

源文件 yolov8n.yaml,只修改 nc 后面的数字为 分类的个数,也就是上面文件 names 里的元素个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Ultralytics YOLO 🚀, GPL-3.0 license

# Parameters
nc: 4 # number of classes
depth_multiple: 0.33 # scales module repeats
width_multiple: 0.25 # scales convolution channels

# YOLOv8.0n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12

- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)

- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 18 (P4/16-medium)

- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 21 (P5/32-large)

- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

更大一点的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Ultralytics YOLO 🚀, GPL-3.0 license

# Parameters
nc: 4 # number of classes
depth_multiple: 0.33 # scales module repeats
width_multiple: 0.50 # scales convolution channels

# YOLOv8.0s backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0s head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C2f, [512]] # 12

- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C2f, [256]] # 15 (P3/8-small)

- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]] # cat head P4
- [-1, 3, C2f, [512]] # 18 (P4/16-medium)

- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]] # cat head P5
- [-1, 3, C2f, [1024]] # 21 (P5/32-large)

- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

2.4 开始训练

可以用 cli 或者 python 两种方式,用 cli 更方便些。
yolo task=detect mode=train model=v8n.yaml data=data.yaml epochs=100 device=0
主要入参说明:
task:任务类型。
mode: 训练、验证还是预测。
model: 模型配置文件,可选 yolov8n.yaml、yolov8s.yaml 等,源文件从 github 上下载即可,根据实际情况改写参数。
data: 要生成的数据集配置文件,根据实际情况改写。
epochs:训练迭代次数,影响训练效果和时间。
batch:每批图像数(自动批处理时-1),影响训练效果和时间。
官方完整参数

精简训练命令

先将 epochs 调小,测试一下流程是否可以
yolo detect train model=v8s.yaml data=data.yaml epochs=2
没问题后,100 以上
yolo detect train model=v8s.yaml data=data.yaml epochs=100
batch 默认是 16

三、目标检测

  • 简单检测

    yolo detect predict model="./datasets/runs/detect/train/weights/best.pt" source="./a17.jpg" show save

  • source 里可以是各种内容,比如视频流等,完整参数看文档

  • 后面就都是应用层面的内容了。

请吃小笼包
支付宝 | Alipay
微信 | Wechat