前言

ok现在是2025.2.21 23:25,来写一下训练和应用yolov11模型的学习过程和遇到的问题

参考

参考的原博客找不到了,真奇怪,我记得我收藏了哈,回头看就不见了,所以找的这一个

跳转

  1. 训练yolov11模型
  2. 应用yolov11模型

训练yolov11模型

下载yolov11

进入官方yolo网站点击下载压缩包

准备数据集

数据集的准备过程见博客的另一篇文章使用labelimg制作数据集
文件夹结构如下

1
2
3
4
5
6
7
8
-datasets
---train
-----images
-----labels
---val
-----images
-----labels
---datas.yaml

datas.yaml内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

train: D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\train\images # train images
val: D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\val # val images
test: D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\test # test images (可选)

# number of classes
nc: 4

# Classes,填写类别名
names:
0: Monitor
1: Keyboard
2: Mouse
3: Handle

训练yolov11

  1. 首先提醒一下,有许多包需要安装,所以建议使用conda虚拟环境,然后运行过程中缺少什么模块再进行安装,单独的训练时间大概3-4个小时

  2. 解压打开文件夹ultralytics-main

  3. 再ultralytics下创建train.py val.py detect.py

train.py代码如下:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from ultralytics import YOLO
from ultralytics import RTDETR



if __name__ == '__main__':
# 加载模型
model = YOLO(r'cfg/models/11/yolo11.yaml') # 不使用预训练权重训练
# model = YOLO(r'yolov8.yaml').load("yolov8n.pt") # 使用预训练权重训练
# 训练参数 ----------------------------------------------------------------------------------------------
model.train(
data=r'D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\datas.yaml',
epochs=300, # (int) 训练的周期数
patience=50, # (int) 等待无明显改善以进行早期停止的周tiao期数
batch=16, # (int) 每批次的图像数量(-1 为自动批处理)
imgsz=640, # (int) 输入图像的大小,整数或w,h
save=True, # (bool) 保存训练检查点和预测结果
save_period=-1, # (int) 每x周期保存检查点(如果小于1则禁用)
cache=False, # (bool) True/ram、磁盘或False。使用缓存加载数据
device='', # (int | str | list, optional) 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers=8, # (int) 数据加载的工作线程数(每个DDP进程)
project='runs/train', # (str, optional) 项目名称
name='exp', # (str, optional) 实验名称,结果保存在'project/name'目录下
exist_ok=False, # (bool) 是否覆盖现有实验
pretrained=True, # (bool | str) 是否使用预训练模型(bool),或从中加载权重的模型(str)
optimizer='SGD', # (str) 要使用的优化器,选择=[SGD,Adam,Adamax,AdamW,NAdam,RAdam,RMSProp,auto]
verbose=True, # (bool) 是否打印详细输出
seed=0, # (int) 用于可重复性的随机种子
deterministic=True, # (bool) 是否启用确定性模式
single_cls=False, # (bool) 将多类数据训练为单类
rect=False, # (bool) 如果mode='train',则进行矩形训练,如果mode='val',则进行矩形验证
cos_lr=False, # (bool) 使用余弦学习率调度器
close_mosaic=0, # (int) 在最后几个周期禁用马赛克增强
resume=False, # (bool) 从上一个检查点恢复训练
amp=True, # (bool) 自动混合精度(AMP)训练,选择=[True, False],True运行AMP检查
fraction=1.0, # (float) 要训练的数据集分数(默认为1.0,训练集中的所有图像)
profile=False, # (bool) 在训练期间为记录器启用ONNX和TensorRT速度
freeze=None, # (int | list, 可选) 在训练期间冻结前 n 层,或冻结层索引列表。
# 分割
overlap_mask=True, # (bool) 训练期间是否应重叠掩码(仅适用于分割训练)
mask_ratio=4, # (int) 掩码降采样比例(仅适用于分割训练)
# 分类
dropout=0.0, # (float) 使用丢弃正则化(仅适用于分类训练)
# 超参数 ----------------------------------------------------------------------------------------------
lr0=0.01, # (float) 初始学习率(例如,SGD=1E-2,Adam=1E-3)
lrf=0.01, # (float) 最终学习率(lr0 * lrf)
momentum=0.937, # (float) SGD动量/Adam beta1
weight_decay=0.0005, # (float) 优化器权重衰减 5e-4
warmup_epochs=3.0, # (float) 预热周期(分数可用)
warmup_momentum=0.8, # (float) 预热初始动量
warmup_bias_lr=0.1, # (float) 预热初始偏置学习率
box=7.5, # (float) 盒损失增益
cls=0.5, # (float) 类别损失增益(与像素比例)
dfl=1.5, # (float) dfl损失增益
pose=12.0, # (float) 姿势损失增益
kobj=1.0, # (float) 关键点对象损失增益
label_smoothing=0.0, # (float) 标签平滑(分数)
nbs=64, # (int) 名义批量大小
hsv_h=0.015, # (float) 图像HSV-Hue增强(分数)
hsv_s=0.7, # (float) 图像HSV-Saturation增强(分数)
hsv_v=0.4, # (float) 图像HSV-Value增强(分数)
degrees=0.0, # (float) 图像旋转(+/- deg)
translate=0.1, # (float) 图像平移(+/- 分数)
scale=0.5, # (float) 图像缩放(+/- 增益)
shear=0.0, # (float) 图像剪切(+/- deg)
perspective=0.0, # (float) 图像透视(+/- 分数),范围为0-0.001
flipud=0.0, # (float) 图像上下翻转(概率)
fliplr=0.5, # (float) 图像左右翻转(概率)
mosaic=1.0, # (float) 图像马赛克(概率)
mixup=0.0, # (float) 图像混合(概率)
copy_paste=0.0, # (float) 分割复制-粘贴(概率)
)

保存训练完成的权重

训练完成后权重路径为ultralytics\runs\train\exp11\weights\best.pt注意备份

验证模型准确性

val.py代码如下:

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
from ultralytics import YOLO

if __name__ == '__main__':
# 加载模型
model = YOLO(r'D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\ultralytics-main\ultralytics\runs\train\exp11\weights\best.pt')
# 验证模型
metrics=model.val(
val=True, # (bool) 在训练期间进行验证/测试
data=r'D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\datas.yaml',
split='val', # (str) 用于验证的数据集拆分,例如'val'、'test'或'train'
batch=1, # (int) 每批的图像数量(-1 为自动批处理)
imgsz=640, # 输入图像的大小,可以是整数或w,h
device='', # 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers=8, # 数据加载的工作线程数(每个DDP进程)
save_json=False, # 保存结果到JSON文件
save_hybrid=False, # 保存标签的混合版本(标签 + 额外的预测)
conf=0.001, # 检测的目标置信度阈值(默认为0.25用于预测,0.001用于验证)
iou=0.6, # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
project='runs/val', # 项目名称(可选)
name='exp', # 实验名称,结果保存在'project/name'目录下(可选)
max_det=300, # 每张图像的最大检测数
half=False, # 使用半精度 (FP16)
dnn=False, # 使用OpenCV DNN进行ONNX推断
plots=True, # 在训练/验证期间保存图像
)

print(f"mAP50-95: {metrics.box.map}") # map50-95
print(f"mAP50: {metrics.box.map50}") # map50
print(f"mAP75: {metrics.box.map75}") # map75
speed_metrics = metrics.speed
total_time = sum(speed_metrics.values())
fps = 1000 / total_time
print(f"FPS: {fps}") # FPS

应用yolov11模型

detect.py代码如下:

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
from ultralytics import YOLO

if __name__ == '__main__':
# 加载模型
model = YOLO(r'D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\ultralytics-main\ultralytics\runs\train\exp11\weights\best.pt') # YOLOv8n模型
model.predict(
source=r"D:\a安建大\实验室\机器人创新实验室\三轮考核\c第三次任务__模式识别\datasets\test\cad_6.mp4",
save=True, # 保存预测结果
imgsz=640, # 输入图像的大小,可以是整数或w,h
conf=0.25, # 用于检测的目标置信度阈值(默认为0.25,用于预测,0.001用于验证)
iou=0.45, # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
show=False, # 如果可能的话,显示结果
project='runs/predict', # 项目名称(可选)
name='exp', # 实验名称,结果保存在'project/name'目录下(可选)
save_txt=False, # 保存结果为 .txt 文件
save_conf=True, # 保存结果和置信度分数
save_crop=False, # 保存裁剪后的图像和结果
show_labels=True, # 在图中显示目标标签
show_conf=True, # 在图中显示目标置信度分数
vid_stride=1, # 视频帧率步长
line_width=3, # 边界框线条粗细(像素)
visualize=False, # 可视化模型特征
augment=False, # 对预测源应用图像增强
agnostic_nms=False, # 类别无关的NMS
retina_masks=False, # 使用高分辨率的分割掩码
boxes=True, # 在分割预测中显示边界框
)

识别完成后会显示保存路径,打开即可查看识别结果


bug汇总

无法安装opencv-python

conda无法下载opencv-python,且或许是因为版本冲突,所以无法导入cv2,环境内无法找到cv2的文件夹,改用pip下载以后就可以了

当pip install opencv-python 失败,则使用 conda install -c conda-forge opencv

如何查找安装的包:
conda命令行下输入:conda list <pkgs>
输出保存的包位置,随后直接搜索包名得到包的保存位置:
G:\anaconda3_envs\envs\yolo\Lib\site-packages