概述
上节讲解yolov8环境安装,编译yolov8源码,以及训练模型与常用参数介绍,详细介绍通过demo源码开发识别一张图片内容。
模型训练核心参数
- model 指定模型配置文件。可以是官方的预训练权重(如 yolov8n.pt),也可以是自己定义的 yaml 结构文件。使用预训练权重进行迁移学习,能显著加快训练速度并提高精度。 - - yolov8n/s/m/l/x.pt (n为最小最快,x为最大最准)。
- data 指定数据集配置文件。这是一个 yaml 文件的路径,文件里定义了训练集、验证集的图片路径、类别数和类别名称。 例如 data/coco128.yaml 或自定义数据集配置。
- epochs 训练轮数。指整个数据集将被模型遍历学习的次数。轮数太少会导致欠拟合,太多则可能过拟合。 通常从 100 或 300 开始尝试。
- batch 批处理大小。指一次性喂入神经网络进行计算的样本数量。越大越稳定,但消耗显存也越多。 默认 16。如果显存不够(报CUDA Out of Memory),则调小(如 8, 4);如果显存充裕,可以调大(如 32, 64)。
- imgsz 输入图像尺寸。会将所有输入图像统一缩放到此尺寸后再送入网络。分辨率越高,对小目标检测越有利,但计算量也随之增加。 默认 640。小目标检测场景可尝试 896 或更高。
- lr0 初始学习率。控制模型权重更新的步长。过高可能导致训练不收敛,过低会导致训练缓慢。 默认 0.01。如果训练初期Loss震荡厉害,可以适当降低,如 0.001。
- device 训练设备。指定使用CPU还是GPU进行训练。 单个GPU填 0,CPU填 cpu,多卡填 0,1。
- optimizer 优化器。用于更新网络权重的算法。 默认 auto(自动选择),通常是 AdamW 或 SGD(随机梯度下降)。
- patience 早停耐心值。如果验证集上的精度在这么多轮内没有提升,训练将自动停止,防止过拟合和浪费时间。 默认 50 或 100
模型预测/推理参数
- source 输入源。指定要进行检测的对象,可以是单张图片路径、文件夹路径、视频文件、摄像头ID或网络图片URL等。 例如 image.jpg, videos, 0 (电脑自带摄像头),screen桌面。
- conf 置信度阈值。只有模型预测得分高于此值的检测框才会被保留。 默认 0.25。如果误检较多,可以调高,如 0.5;如果需要尽可能检出物体(宁错勿漏),可以调低,如 0.1。
- iou 交并比阈值。用于非极大值抑制(NMS),决定两个重叠的框是否属于同一个物体。重叠度超过此阈值的框,只保留得分最高的一个。 默认 0.7。如果同一物体周围有很多重复框,可以适当调低,如 0.5。
- save 保存检测结果图。将画好检测框和标签的结果图片保存到本地。 True 或 False。
- save_txt 保存标签文件。将检测结果(类别id、中心点坐标、宽高)以YOLO格式保存为 .txt 文件。 True 或 False。
- max_det 最大检测数量。限制每张图片中最多检测出多少个目标。 默认 300。
- half 半精度推理。使用FP16浮点数进行计算,可以加快速度并减少显存占用,精度损失极小。 默认 False。推荐在支持FP16的GPU上设置为 True。
- classes 类别过滤。只检测你指定的某些类别。例如模型中包含人和车,只想检测人,可设置此参数。 例如 0 或 [0,2,3]
demo
from ultralytics import YOLO
yolo=YOLO("yolov8n.pt","detect")
# 目标检测source="./5.mp4"视频文件,source="screen"电脑桌面,source=0,摄像头
result=yolo( source="./ultralytics/assets/bus.jpg",save=True)
print(result)
运行结果如下:
训练数据集准备
YOLOv8数据准备的目的是将原始杂乱无章的图像数据,转化为算法能够理解、学习并具备泛化能力的标准化格式。经过充分的训练后,它能够精准在摄像头或者视频中,识别我们指定的事物,如猫、狗、鱼等。 yolov8不具备所有事物的识别,这就要求我们自身提供数据给yolov8。如我们想要识别斯诺克,需要把球的图片提供给yolov8训练,并标注球的具体位置、尺寸大小。 需要把数据,分成三类:
- 训练集图片,用于训练
- 验证集图片,用于调参
- 测试集图片,评估精度
截取视频中画面
准备一段视频,视频内容是斯诺克比赛视频,将视频中帧截取,并保存图片到本地。将图片的帧截取保存图片,方法很多。使用python cv2库可以很轻松的做到。 在yolo8源码中
- 新建demo2.py,
- 新建data文件夹,将视频文件1.mp4放入
- 在data文件夹中新建img文件夹,用于保存生成的图片
import cv2
video=cv2.VideoCapture("./data/1.mp4")
num=0
sava_step=100
while True:
ret ,frame=video.read()
if not ret:
break
num+=1
if num%sava_step==0:
cv2.imwrite("./data/img/"+str(num)+".jpg",frame)
其中sava_step是每间隔多少帧保存一张图片。点击按钮运行,在img文件夹内生成图片,如下图:
将生成的图片,手动筛序将没有用的,不含斯诺克的删除。
图片标注
图片内有很多不同颜色的斯诺克,将不同颜色建立标签,一一标注位置大小。使用的标注工具是labelimg。首先安装labelimg工具,
- 进入yolov8虚拟环境,conda activate yolov8
- 安装labelimg工具,pip install labelimg
如下图:
若下载不成功,大部分是网络原因。安装完成后,在命令行中输入labelimg,如下图
labelimg工具的使用
打开labelimg,设置两个参数
- 开启自动保存
- 更改数据训练模型yolo
基本设置
开启自动保存,点击菜单View,如下图:
更改数据训练模型yolo,单击工具栏
更改为
导入训练图片
- 选择open dir,选择img文件夹,图片将全部导入软件
- 选择change sava dir,选择img文件夹中dst文件夹
如下图:
标注数据
给斯诺克标注数据,需要给球起标签名称,如红色球red标签,绿色球green标签。然后给标签画框,也就是标签所在位置。
- 点击左侧工具栏,单击Create Rect
- 选择红色球,将其画在框中心
- 画完弹出标签框,若有则选择, 没有则创建
如下操作:
选择红、绿、黄三个球,点击工具栏Save保存,后台在dst目录生成两个文本文件如下图:
classes.txt内容
red
bule
yellow
1500.txt
0 0.415625 0.530556 0.021875 0.036111
1 0.501172 0.400000 0.027344 0.038889
2 0.428906 0.204167 0.018750 0.030556
classes.txt里red、bule、yellow是创建的标签名称,对于的排序序号0、1、2。而1500.txt是1500.jpg图片所标注的矩形框。第一列0、1、2序号对于的标签是red、bule、yellow。
- 0对应red
- 1对应bule
- 2对于yellow
第一行中后四位数字,是代表所画框的中心位置坐标(x,y)与长l、宽w。
第一行表示红色球的位置与 大小。再继续多画几个球,
按住快捷键w,画框如下图:
又多画了四个红球,保存数据,文件变化如下: classes.txt
red
bule
yellow
1500.txt
0 0.415625 0.530556 0.021875 0.036111
1 0.501172 0.400000 0.027344 0.038889
2 0.428906 0.204167 0.018750 0.030556
0 0.628125 0.173611 0.015625 0.025000
0 0.555859 0.609028 0.016406 0.031944
0 0.528125 0.604167 0.017188 0.033333
0 0.500781 0.681944 0.018750 0.036111
将所有图片内的球都通过这种方式标注。
如下图:
从文件内容看到已经完成标注了哪些文件
- 1500.txt对于是1500jpg文件
- 25500.txt对于是25500jpg文件
- 26500.txt对于是26500jpg文件
- 27000.txt对于是27000jpg文件
- 27500.txt对于是27500jpg文件 classes具体标签内容
red
bule
yellow
green
white
pink
black
brown
8类标签,对应斯诺克八种秋色。 查看1500图片的标注数据
0 0.415625 0.530556 0.021875 0.036111
1 0.501172 0.400000 0.027344 0.038889
2 0.428906 0.204167 0.018750 0.030556
7 0.628125 0.173611 0.015625 0.025000
0 0.555859 0.609028 0.016406 0.031944
0 0.528125 0.604167 0.017188 0.033333
0 0.500781 0.681944 0.018750 0.036111
3 0.573047 0.206250 0.013281 0.023611
4 0.578906 0.195833 0.012500 0.025000
5 0.498047 0.582639 0.016406 0.023611
6 0.489063 0.729861 0.017188 0.034722
0 0.467578 0.719444 0.016406 0.027778
0 0.476172 0.639583 0.014844 0.026389
0 0.514844 0.649306 0.015625 0.029167
0 0.492969 0.638889 0.014063 0.030556
0 0.508594 0.636806 0.012500 0.026389
0 0.500000 0.625000 0.012500 0.022222
0 0.483984 0.627083 0.013281 0.026389
0 0.492188 0.615972 0.017188 0.023611
0 0.496484 0.600000 0.014844 0.022222
至此数据标注已经完成,下节讲解如何整理标注的数据,给yolo8模型训练,将训练结果用于识别斯诺克台球比赛。