YOLO v8n 踩的坑

容小狸 Lv3

准备魔改YOLO v8,实现一个基于YOLO v8的实时交通标识检测系统,这篇文章就是记录一下步骤。
那么问题来了,我甚至都没有做过视觉模型的项目,我该怎么做呢?

那么首先从YOLO v8开始,学习它的架构和实现。

准备工作

WSL 配置

Windows主力机就用的WSL2,可以直接按照
Microsoft的文档 安装WSL2。

使用添加程序和功能,找到Windows Subsystem for Linux,勾选它。

之后,这个:

1
2
3
wsl --update 
wsl --set-default-version 2
wsl --install --distribution debian

后来发觉自带的命令行不太舒服,就安装了Windows Terminal。
这个选装,不影响使用,如果不想看直接跳到初始化Git仓库。

安装Windows Terminal

可以参考Microsoft的文档 安装Windows Terminal。
我直接使用GitHub的版本,下载页看这里:
Windows Terminal GitHub页面

下载那个后缀为msix的文件,双击安装。安装完以后Win+R输入wt,就可以打开Windows Terminal。

初始化Git仓库

初始化Git仓库,将ultralytics的仓库作为子模块复制到本地,正好帮我补充Git子模块的知识,小巧思这块儿。
(这一步是因为我的服务器没有GPU,没法使用opencv,只能使用opencv-headless代替,
之后在其他机器上的部署都是直接使用的pip内的ultralytics库)

1
2
git submodule init
git submodule add https://github.com/ultralytics/ultralytics.git

pip安装ultralytics库之后,会有一个叫yolo的命令,这是ultralytics提供的一个命令行工具,用于训练和推理YOLO模型。

YOLO v8 复现

YOLO 识别复现

YOLO识别前

1
2
3
4
5
from ultralytics import YOLO

model = YOLO('yolov8n-oiv7.pt')
model.info()
model.predict(source='bus.jpg', save=True)

YOLO识别后

秒了。

YOLO 训练复现

1
2
3
4
5
from ultralytics import YOLO
# Start YOLO v8 training with yaml config file.
print("Start training with yaml config file.")
yolo_yaml = YOLO('./yolov8.yaml')
yolo_yaml.train(epochs=5, data='./TT100K.yaml', resume=True)

有结果了,结果出在ultralytics/runs/detect/下,根据名字不同,每个文件夹对应一个训练任务。
就不指望这个训练结果能有什么了,上面这段只是用来验证一下能否训练的。

自定义数据集

感谢@Tianli发布的TT100K-YOLO数据集,原本的TT100K是无法直接用于YOLO训练的。Tianli这个集经过清洗,可以直接用于YOLO的训练。

当然,ultralytics自己也提供了一个数据YAML,也可以直接训练。(位置在ultralytics/cfg/datasets/TT100K.yaml
我先是用的Tianli的数据集,然后再使用的ultralytics的YAML。

自定义数据集有点反应,但是效果比较差。试试看ultralytics的数据集。

一直被结果折磨。为啥效果还是差呢?

751.jpg

结果

参数如下:

1
2
3
4
5
yolo_coco.train(name='YOLOv8-COCO', epochs=300, data='./TT100K.yaml', 
save_period=5, patience=70, batch=16, workers=2,
close_mosaic=50, hsv_h=0.02, hsv_s=0.72, hsv_v=0.5, cutmix=0.2,
device=0,
amp=False)

DeepSeek给出了一份训练参数,如下:

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
41
42
43
44
45
46
# Training Settings
epochs: 300 # TT100K类别多(221类),需要更长训练;前两次300epoch仍未收敛
batch: 16 # 稳定批次大小,适应显存
imgsz: 640 # 若资源允许,建议1280以提升小目标检测;640为底线
patience: 50 # 验证mAP 50轮不升则早停,节省时间
seed: 0
deterministic: true
amp: true # 混合精度加速训练
cos_lr: true # 余弦退火调度,对长训练收敛至关重要
close_mosaic: 15 # 最后15轮关闭mosaic,进行细粒度微调
save_period: -1 # 仅保存最优和最后
fraction: 1
freeze: null # 从scratch训练不冻结;若用预训练可冻结backbone前10层
single_cls: false
rect: false
multi_scale: 0
resume: false
optimizer: auto # 自动选择优化器(AdamW或SGD)
lr0: 0.01 # 若从COCO预训练权重微调,0.01合适;若从scratch可略高
lrf: 0.01 # cos_lr下最终lr = lr0 * lrf = 0.0001
momentum: 0.937
weight_decay: 0.0005
warmup_epochs: 5 # 较长热身,帮助分类头平稳启动(比默认3更稳)
warmup_momentum: 0.8
warmup_bias_lr: 0.1
box: 7.5
cls: 0.5 # 分类损失权重;若类别不平衡严重可尝试0.7-1.0
dfl: 1.5
pose: 12
kobj: 1
label_smoothing: 0.1 # 标签平滑,缓解多类别过拟合和不平衡问题

# Image Augmentations
hsv_h: 0.015 # 交通标志颜色相对标准,轻微色调扰动即可
hsv_s: 0.5 # 饱和度扰动不宜过大,避免颜色失真
hsv_v: 0.3 # 明度扰动适中
degrees: 0 # 交通标志无旋转,保持0
translate: 0.1 # 小幅平移增强鲁棒性
scale: 0.5 # 多尺度缩放,帮助应对不同大小标志
shear: 0 # 无需错切
perspective: 0 # 无需透视变换
flipud: 0 # 交通标志不应上下翻转
fliplr: 0.5 # 水平翻转合理(左右对称的标志)
mosaic: 1.0 # mosaic对小目标检测帮助大,但需close_mosaic提前关
mixup: 0.2 # mixup缓解类别不平衡,提升泛化
copy_paste: 0.1 # 小目标复制粘贴增强,缓解样本不均

其中有这么一句话:

epochs: 300 # TT100K类别多(221类),需要更长训练;前两次300epoch仍未收敛

未收敛?加到700epochs试试。

秒了。附个结果以及两条曲线。

mAP50-95

recall

  • 标题: YOLO v8n 踩的坑
  • 作者: 容小狸
  • 创建于 : 2026-04-06 17:14:49
  • 更新于 : 2026-04-24 00:54:05
  • 链接: https://blog.rongxiaoli.top/2026/04/06/YOLO-v8/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论