代码来源:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀
参考笔记:YOLOv8 训练、验证、推理_yolov8推理代码-优快云博客
官方文档链接:Ultralytics YOLO11 模式 -Ultralytics YOLO 文档
目录
1.数据集准备
使用的数据集是 VOC2007 数据集,包含 9963 张图片,共 20 个类别,如下图:
数据集按 8:2 划分为训练集、测试集,训练集 7829 张图片,验证集 2134 张图片,每张图片对应一个标签 txt 文件,标签txt文件中每一行有 5 个值,分别是类别索引、中心x、中心y、宽、高(归一化之后的值)
接着创建与该数据集对应的 YAML 文件 VOC2007.yaml 存放于 ultralytics/cfg/datasets 目录下,其内容如下:
path: ../VOCdevkit #数据集根目录
train: images/train #训练集存放路径
val: images/val #验证集存放路径
test: images/val #测试集存放路径
# Classes 类别
names:
0: person #人
1: bird #鸟
2: cat #猫
3: cow #奶牛
4: dog #狗
5: horse #马
6: sheep #羊
7: aeroplane #飞机
8: bicycle #自行车
9: boat #船
10: bus #公共汽车
11: car #汽车
12: motorbike #摩托车
13: train #火车
14: bottle #瓶子
15: chair #椅子
16: diningtable #餐桌
17: pottedplant #花盆
18: sofa #沙发
19: tvmonitor #电视
由于没有多余的数据,所以这里我将验证集也作为测试集
2.default.yaml
YOLOv8 的命令行参数和超参数设置全部存放于 ultralytics/cfg/default.yaml ,其内容如下:
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Default training settings and hyperparameters for medium-augmentation COCO training
task: detect #YOLO任务,例如检测、分割、分类、姿态
mode: train # (str) YOLO模式,例如训练、验证、预测、导出、跟踪、基准测试(train, val, predict, export, track, benchmark)
# 1.Train settings(训练阶段命令参数设置) -------------------------------------------------------------------------------------------------------
model: #(str, 可选)模型文件存放路径,例如yolov8n.pt, yolov8n.yaml
data: #(str,可选)数据集对应的YAML文件存放路径
epochs: 100 #(int)训练轮数
time: # (float, optional) number of hours to train for, overrides epochs if supplied
patience: 100 #(int)早停机制
batch: 16 #(int)批量
imgsz: 640 #(int | list)将输入图像自适应缩放到imgsz尺寸大小
save: True #(bool)保存训练的模型和预测结果
save_period: -1 #(int)每x个epoch保存一次模型权重,保存路径是runs/detect/train/weights/epochx.pt,默认不开启,一般只保存last.pt和best.pt
cache: False #(bool)是否缓存数据集到RAM或磁盘
device: # (int | str | list, 可选) device to run on, i.e. cuda device=0 or device=0,1,2,3 or device=cpu
workers: 8 #(int)数据加载器的最大工作线程数
project: #(str,可选)训练结果存放的根目录,默认是runs/detect/
name: #(str,可选)训练结果存放的子目录,默认是runs/detect/trainx
exist_ok: False #(bool)是否用当前的训练结果目录覆盖以前的trainx训练结果目录,默认不开启
pretrained: True #(bool | str)是否使用预训练权重(bool)或加载权重模型(str)
optimizer: auto #(str)指定优化器,可选=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verbose: True #(bool)是否打印详细输出信息
seed: 0 #(int)随机种子
deterministic: True # (bool) whether to enable deterministic mode
single_cls: False #(bool)将多类别作为单类训练
rect: False #(bool)如果模型为'train'则矩形训练,模型为'val'则矩形验证
cos_lr: False #(bool)是否使用余弦函数更新学习率,默认是线性函数更新学习率
close_mosaic: 10 #(int)禁用最后x个epoch的mosaic数据增强
resume: False #(bool)断点续训
amp: True #(bool)自动混合精度(AMP)训练,可选项=[True,False]
fraction: 1.0 #(float) 训练数据集的分数(默认为1.0,训练集中的所有图像)
profile: False #(bool) 在寻训练期间为记录器分析ONNX和TensorRT速度
freeze: None #(int | list,可选)指定冻结不进行训练的层索引
multi_scale: False #(bool)多尺度训练
#Segmentation(分割任务)
overlap_mask: True #(bool)训练期间掩码是否重叠(仅限分割训练)
mask_ratio: 4 #(int)掩码下采样率 (仅限分割训练)
#Classification(分类任务)
dropout: 0.0 #(float)使用dropout正则化(仅限分类训练)
# 2.Val/Test settings(验证/测试阶段命令参数设置) ----------------------------------------------------------------------------------------------------
val: True #(bool)在训练期间进行验证/测试
split: val #(str)用于验证的数据集分割,例如:'val', 'test' or 'train'
save_json: False #(bool)是否将预测结果保存为json文件
save_hybrid: False # (bool) save hybrid version of labels (labels + additional predictions)
conf: #(float,可选)置信度阈值,用于nms中,小于该阈值的预测框会被去除(预测默认0.25,验证默认0.001)
iou: 0.7 #(float)IoU阈值,用于nms中,若两个框的IoU阈值大于该值,需要去除冗余的那个预测框
max_det: 300 #(int)每张图片nms处理之后最多的检测框数量,超出部分去除
half: False #(bool)使用半精度推理缩短推理时间
dnn: False #(bool)使用 OpenCV DNN 进行 ONNX 推理
plots: True #(bool)在训练/验证期间保存图表和图像
# 3.Predict settings(推理阶段命令参数设置) -----------------------------------------------------------------------------------------------------
source: #(str,可选)推理数据的存放路径
vid_stride: 1 #(int)视频帧率步幅
stream_buffer: False # (bool) buffer all streaming frames (True) or return the most recent frame (False)
visualize: False #(bool)是否保存热力图(没什么用)
augment: False #(bool)模型推理时是否启用数据增强
agnostic_nms: False #(bool)使用类别无关的NMS,通常不启用该功能(默认的NMS是作用在同个类别之间)
classes: #(int | list[int],可选)nms中是否是只保留某些特定的类,通常不启用该功能
retina_masks: False #(bool)使用高分率分割掩码
embed: # (list[int], 可选) 从给顶层返回特征向量/嵌入
# 4.Visualize settings(可视化设置) ---------------------------------------------------------------------------------------------------
show: False #(bool)是否在控制台可视化预测之后的图片或视频
save_frames: False # (bool) 保存预测的视频帧
save_txt: False #(bool)将预测的框坐标以txt文件格式保存,默认路径是runs/detect/predictn/labels
save_conf: False #(bool)将预测的框的置信度保存在txt文件中
save_crop: False #(bool)将预测到的目标从原图中扣出来,保存在runs/detect/predictn/crops下
show_labels: True #(bool)画出来的检测框是否显示类别
show_conf: True #(bool)画出来的检测框是否显示置信度
show_boxes: True #(bool)是否显示检测框
line_width: #(int,可选)画检测框时的线条宽度,默认为3
# 5.Export settings(导出设置) ------------------------------------------------------------------------------------------------------
format: torchscript # (str) format to export to, choices at https://docs.ultralytics.com/modes/export/#export-formats
keras: False # (bool) use Kera=s
optimize: False # (bool) TorchScript: optimize for mobile
int8: False # (bool) CoreML/TF INT8 quantization
dynamic: False # (bool) ONNX/TF/TensorRT: dynamic axes
simplify: True # (bool) ONNX: simplify model using `onnxslim`
opset: # (int, optional) ONNX: opset version
workspace: 4 # (int) TensorRT: workspace size (GB)
nms: False # (bool) CoreML: add NMS
# 6.Hyperparameters(训练的超参数设置) ------------------------------------------------------------------------------------------------------
####################6.1学习率、损失系数等#########################
lr0: 0.01 #初始学习率(通常,SGD=1E-2, Adam=1E-3)
lrf: 0.01 #最终的学习率=lr0*lrf,
momentum: 0.937 #学习率动量
weight_decay: 0.0005 #权重衰退系数
warmup_epochs: 3.0 #模型预热的轮数
warmup_momentum: 0.8 #模型预热时的学习率动量
warmup_bias_lr: 0.1 #模型预热时的学习率
box: 7.5 #定位损失的系数
cls: 0.5 #分类损失的系数
dfl: 1.5 #dfl损失的系数
pose: 12.0 # (float) pose loss gain
kobj: 1.0 # (float) keypoint obj loss gain
label_smoothing: 0.0 #标签平滑的比例
nbs: 64 #名义批次,名义批次,比如实际批次为16,那么6