OpenCV与AI深度学习 | 实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程)

0 导  读

    本文将手把手教你用YoloV8训练自己的数据集并实现手势识别。

1 安装环境

【1】安装torch, torchvision对应版本,这里先下载好,直接安装

pip install torch-1.13.1+cu116-cp38-cp38-win_amd64.whl
pip install torchvision-0.14.1+cu116-cp38-cp38-win_amd64.whl

安装好后可以查看是否安装成功,上面安装的gpu版本,查看指令与结果:

import torch
print(torch.__version__)
print(torch.cuda.is_available())

【2】安装ultralytics

pip install ultralytics

【3】下载YoloV8预训练模型:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

本文使用YOLOv8n,直接下载第一个即可

【4】运行demo测试安装是否成功:

from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model(['1.jpg', '2.jpg'])  # return a list of Results objects

# Process results list
for result in results:
    boxes = result.boxes  # Boxes object for bounding box outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    result.show()  # display to screen
    result.save(filename='result.jpg')  # save to disk

标注/制作数据集

【1】准备好待标注图片

    可以自己写一个从摄像头存图的脚本保存一下不同手势图到本地,这里提供一个供参考:

# -*- coding: utf-8 -*-
import cv2

cap = cv2.VideoCapture(0)
flag = 0

if(cap.isOpened()): #视频打开成功
  flag = 1
else:
  flag = 0
  print('open cam failed!')

if(flag==1):
  while(True):
    cv2.namedWindow("frame")
    ret,frame = cap.read()#读取一帧
    if ret==False: #读取帧失败
      break
    cv2.imshow("frame", frame)
    if cv2.waitKey(50)&0xFF ==27: #按下Esc键退出
      cv2.imwrite("1.jpg",frame)
      break

cap.release()
cv2.destroyAllWindows()

本文使用共3种手势1,2,5,三种手势各300张,大家可以根据实际情况增减样本数量。

【2】标注样本

    标注工具使用labelimg即可,直接pip安装:

pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,命令行直接输入labelimg,回车即可打开labelimg,数据集类型切换成YOLO,然后依次完成标注即可。

【3】标注划分

    标注好之后,使用下面的脚本划分训练集、验证集,注意设置正确的图片和txt路径:


# -*- coding: utf-8 -*-

import os
import random
import shutil

# 设置文件路径和划分比例
root_path = "./voc_yolo/"
image_dir = "./JPEGImages/"
label_dir = "./Annotations/"
train_ratio = 0.7
val_ratio = 0.2
test_ratio = 0.1

# 创建训练集、验证集和测试集目录
os.makedirs("images/train", exist_ok=True)
os.makedirs("images/val", exist_ok=True)
os.makedirs("images/test", exist_ok=True)
os.makedirs("labels/train", exist_ok=True)
os.makedirs("labels/val", exist_ok=True)
os.makedirs("labels/test", exist_ok=True)

# 获取所有图像文件名
image_files = os.listdir(image_dir)
total_images = len(image_files)
random.shuffle(image_files)

# 计算划分数量
train_count = int(total_images * train_ratio)
val_count = int(total_images * val_ratio)
test_count = total_images - train_count - val_count

# 划分训练集
train_images = image_files[:train_count]
for image_file in train_images:
    label_file = image_file[:image_file.rfind(".")] + ".txt"
    shutil.copy(os.path.join(image_dir, image_file), "images/train/")
    shutil.copy(os.path.join(label_dir, label_file), "labels/train/")

# 划分验证集
val_images = image_files[train_count:train_count+val_count]
for image_file in val_images:
    label_file = image_file[:image_file.rfind(".")] + ".txt"
    shutil.copy(os.path.join(image_dir, image_file), "images/val/")
    shutil.copy(os.path.join(label_dir, label_file), "labels/val/")

# 划分测试集
test_images = image_files[train_count+val_count:]
for image_file in test_images:
    label_file = image_file[:image_file.rfind(".")] + ".txt"
    shutil.copy(os.path.join(image_dir, image_file), "images/test/")
    shutil.copy(os.path.join(label_dir, label_file), "labels/test/")

# 生成训练集图片路径txt文件
with open("train.txt", "w") as file:
    file.write("\n".join([root_path + "images/train/" + image_file for image_file in train_images]))

# 生成验证集图片路径txt文件
with open("val.txt", "w") as file:
    file.write("\n".join([root_path + "images/val/" + image_file for image_file in val_images]))

# 生成测试集图片路径txt文件
with open("test.txt", "w") as file:
    file.write("\n".join([root_path + "images/test/" + image_file for image_file in test_images]))

print("数据划分完成!")

接着会生成划分好的数据集如下:

图片

打开images文件夹:

图片

打开images下的train文件夹:

图片

打开labels下的train文件夹:

图片

训练与预测

【1】开始训练

    训练脚本如下:

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)

results = model.train(data='hand.yaml', epochs=30, imgsz=640, device=[0],
                      workers=0,lr0=0.001,batch=8,amp=False)

    hand.yaml内容如下,注意修改自己的数据集路径即可:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO8 dataset (first 8 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco8/
# Example usage: yolo train data=coco8.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco8  ← downloads here (1 MB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: E:/Practice/DeepLearning/Yolo_Test/dataset/hand # dataset root dir
train: E:/Practice/DeepLearning/Yolo_Test/dataset/hand/images/train # train images (relative to 'path') 4 images
val: E:/Practice/DeepLearning/Yolo_Test/dataset/hand/images/val # val images (relative to 'path') 4 images
test: # test images (optional)

# Classes
names:
  0: hand-1
  1: hand-2
  2: hand-5


# Download script/URL (optional)
# download: https://ultralytics.com/assets/coco8.zip

CPU训练将device=[0]改为device='cpu'即可

训练完成后再runs/detect/train文件夹下生成如下内容:

    在weights文件夹下生成两个模型文件,直接使用best.pt即可。

【2】预测推理

    预测脚本如下:

from ultralytics import YOLO
# Load a model
model = YOLO('best.pt')  # pretrained YOLOv8n model

# Run batched inference on a list of images
results = model(['1 (1).jpg', '1 (2).jpg', '1 (3).jpg'])  # return a list of Results objects

# Process results list
for result in results:
    boxes = result.boxes  # Boxes object for bounding box outputs
    masks = result.masks  # Masks object for segmentation masks outputs
    keypoints = result.keypoints  # Keypoints object for pose outputs
    probs = result.probs  # Probs object for classification outputs
    result.show()  # display to screen
    result.save(filename='result.jpg')  # save to disk

    预测结果:

—THE END—

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

  • 44
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用OpenCV训练YOLOv8模型,需要按照以下步骤进行操作: 1. 数据集准备: 首先,需要准备自己的数据集数据集应包含图像和相应的标签文件,标签文件中包含每个图像中目标物体的类别和坐标信息。确保数据集中的目标物体类别与预定义的YOLOv8模型类别一致。 2. 标注图像: 使用标注工具,如LabelImg,对数据集中的图像进行标注标注包括在图像中框出目标物体,并为每个框提供类别标签和坐标信息。标注完成后,会产生相应的标签文件。 3. 数据集划分: 将数据集划分为训练集和验证集。通常,将大部分数据用于训练,少部分用于验证。划分的比例可以根据需求进行调整。 4. 数据预处理: 对图像进行预处理,以满足YOLOv8模型的输入要求。例如,可以调整图像大小、归一化图像像素值等。 5. 配置文件: 创建YOLOv8的配置文件,其中包含模型的超参数设置、数据集路径、类别数目等信息。可参考Darknet框架提供的示例配置文件进行修改。 6. 网络模型训练: 使用OpenCV加载YOLOv8模型,并对其进行训练。在训练过程中,通过调整超参数、学习率等来优化模型的性能。训练过程中,模型会根据训练集的图像和标签进行梯度下降更新权重。 7. 模型评估和调优: 使用验证集对训练好的模型进行评估,通过计算精度、召回率等指标来评估模型的性能。若模型效果不佳,可尝试调整训练策略、数据增强等方法来改进模型。 8. 模型应用: 训练完成后,可以使用OpenCV中的YOLOv8模型进行目标检测。加载模型并输入待检测的图像,模型会输出检测到的目标物体的类别和坐标信息。 总结: 使用OpenCV训练YOLOv8模型的过程包括数据集准备、标注图像、数据预处理、配置文件创建、网络模型训练、模型评估和调优等步骤。这些步骤能够帮助我们基于自己的数据集训练出一个适用于目标检测的YOLOv8模型。 ### 回答2: YOLOv8是一种先进的目标检测算法,它可以通过训练自己的数据集实现目标检测任务。在使用YOLOv8之前,我们需要准备自己的数据集并进行标注。 准备训练数据集时,需要收集包含目标的图像,并对每个目标进行标注标注的方法一般有两种:边界框标注和像素标注。对于YOLOv8算法,我们一般使用边界框标注,即在图像中标注出目标的边界框。 在数据集准备完毕后,我们需要使用OpenCV库进行数据处理。首先,我们需要读取每张图像,并对其进行预处理,例如调整大小、归一化等。接下来,我们需要将标注的目标边界框转换为YOLOv8要求的格式。YOLOv8的目标标注格式是每个目标的类别编号和边界框的四个坐标值。 在进行训练之前,我们还需要准备一个包含所有类别名称的文件,该文件将用于指导YOLOv8识别和分类目标。 训练YOLOv8的过程中,我们需要定义网络结构,并设置一些超参数,如学习率、批次大小和训练轮数等。然后,我们可以使用准备好的数据集网络进行训练训练过程中,YOLOv8会不断调整模型参数,以提高目标检测的准确率。 在训练完成后,我们可以使用自己的数据集来测试训练好的YOLOv8模型。通过输入测试图像,YOLOv8将输出检测到的目标类别和位置信息。 总之,YOLOv8是一种强大的目标检测算法,通过使用OpenCV库和自己的数据集,我们可以训练出适用于特定任务的自定义目标检测模型。 ### 回答3: YOLOv8是一种目标检测算法,可以用于训练自己的数据集OpenCV是一个开源的计算机视觉库,它提供了一系列图像处理和计算机视觉算法的函数和工具。 要用YOLOv8训练自己的数据集,首先需要准备好以下几个步骤: 1. 数据集准备:收集图像数据并对其进行标注,将目标物体的边界框和类别信息标记出来。可以使用OpenCV的绘图功能来手动标注数据集,也可以使用一些标注工具来自动标注。 2. 数据集划分:将数据集划分为训练集、验证集和测试集。通常会将大部分样本用于训练,一小部分用于验证和测试。 3. 配置文件:YOLOv8通过配置文件定义了一些重要的参数,如网络结构、训练参数、数据集路径等。可以使用OpenCV读取和修改这些配置文件。 4. 模型训练:使用准备好的数据集和配置文件,将YOLOv8模型进行训练。可以使用OpenCV的图像读取和预处理功能来加载数据集,然后使用训练算法进行迭代优化,直到模型收敛或达到预定的训练轮次。 5. 模型评估:训练完成后,可以使用测试集对训练好的模型进行评估,计算准确率、召回率等指标,来判断模型的性能。 最后,要注意的是,这只是一个概要的流程。实际上,使用YOLOv8训练自己的数据集需要解决很多实际问题,如数据预处理、模型调参、训练策略等。使用OpenCV可以提供一些便利的功能和接口,但需要更深入的学习和实践才能掌握这些技术。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值