03手把手学会yolov8模型之使用Labelimg标注数据集

0 阅读7分钟

概述

上节讲解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模型训练,将训练结果用于识别斯诺克台球比赛。