使用YOLOv8训练自己的目标检测数据集(VOC格式/COCO格式)

2024-04-17 15:52

本文主要是介绍使用YOLOv8训练自己的目标检测数据集(VOC格式/COCO格式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

yolov8训练自己的数据集

      • 1. 下载项目
      • 2. 搭建环境
      • 3. 数据集格式转换
        • 3.1 VOC格式转YOLO格式
        • 3.2 COCO格式转YOLO格式
      • 4. 训练数据
      • 5. 推理预测
      • 6. 模型导出

1. 下载项目

git clone https://github.com/ultralytics/ultralytics.git

2. 搭建环境

conda create --name ultralytics python==3.8
conda activate ultralytics
# 电脑是CUDA11.1的
pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.htmlpip install ultralytics

3. 数据集格式转换

3.1 VOC格式转YOLO格式
  • VOC格式
── VOCdevkit
└── VOC2007├── Annotations	# 存放图片对应的xml文件,与JPEGImages图片一一对应├── ImageSets│   └── Main	# 存放train.txt、val.txt└── JPEGImages	# 存放所有图片文件
  • YOLO格式
── VOCdevkit
├── images
│   ├── train	# 存放训练集图片
│   └── val	# 存放验证集图片
└── labels├── train	# 存放训练集标注文件└── val	# 存放验证集标注文件
  • 转换脚本
from tqdm import tqdm
import shutil
from pathlib import Path
import xml.etree.ElementTree as ETdef convert_label(path, lb_path, year, image_id, names):def convert_box(size, box):dw, dh = 1. / size[0], 1. / size[1]x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]return x * dw, y * dh, w * dw, h * dhin_file = open(path / f'VOC{year}/Annotations/{image_id}.xml')out_file = open(lb_path, 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):cls = obj.find('name').textif cls in names:xmlbox = obj.find('bndbox')bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])cls_id = names.index(cls)  # class idout_file.write(" ".join(str(a) for a in (cls_id, *bb)) + '\n')else:print("category error: ", cls)year = "2007"
image_sets = ["train", "val"]
path = Path("F:/vsCode/ultralytics/datasets/VOCdevkit/")
class_names = ["apple"]for image_set in image_sets:imgs_path = path / 'images' / f'{image_set}'lbs_path = path / 'labels' / f'{image_set}'imgs_path.mkdir(exist_ok=True, parents=True)lbs_path.mkdir(exist_ok=True, parents=True)with open(path / f'VOC{year}/ImageSets/Main/{image_set}.txt') as f:image_ids = f.read().strip().split()for id in tqdm(image_ids, desc=f'{image_set}'):f = path / f'VOC{year}/JPEGImages/{id}.jpg'  # old img pathlb_path = (lbs_path / f.name).with_suffix('.txt')  # new label path# f.rename(imgs_path / f.name)  # move imageshutil.copyfile(f, imgs_path / f.name) # copy imageconvert_label(path, lb_path, year, id, class_names)  # convert labels to YOLO format

数据集文件夹目录如下
在这里插入图片描述

3.2 COCO格式转YOLO格式
  • COCO格式
── Apple
├── train
│   ├── _annotations.coco.json	# 训练集标注文件
│   ├── 00001.jpg
│   ├── 00003.jpg
│   └── ...
└── valid├── _annotations.coco.json	# 验证集标注文件├── 00002.jpg├── 00004.jpg└── ...
  • 转换脚本
import json
import os
import shutil
from tqdm import tqdmcoco_path = "F:/datasets/Apple_Detection_Swift-YOLO_192"
output_path = "F:/vsCode/ultralytics/datasets/Apple"os.makedirs(os.path.join(output_path, "images", "train"), exist_ok=True)
os.makedirs(os.path.join(output_path, "images", "val"), exist_ok=True)
os.makedirs(os.path.join(output_path, "labels", "train"), exist_ok=True)
os.makedirs(os.path.join(output_path, "labels", "val"), exist_ok=True)with open(os.path.join(coco_path, "train", "_annotations.coco.json"), "r") as f:train_annotations = json.load(f)with open(os.path.join(coco_path, "valid", "_annotations.coco.json"), "r") as f:val_annotations = json.load(f)# Iterate over the training images
for image in tqdm(train_annotations["images"]):width, height = image["width"], image["height"]scale_x = 1.0 / widthscale_y = 1.0 / heightlabel = ""for annotation in train_annotations["annotations"]:if annotation["image_id"] == image["id"]:# Convert the annotation to YOLO formatx, y, w, h = annotation["bbox"]x_center = x + w / 2.0y_center = y + h / 2.0x_center *= scale_xy_center *= scale_yw *= scale_xh *= scale_yclass_id = annotation["category_id"]label += "{} {} {} {} {}\n".format(class_id, x_center, y_center, w, h)# Save the image and labelshutil.copy(os.path.join(coco_path, "train", image["file_name"]), os.path.join(output_path, "images", "train", image["file_name"]))with open(os.path.join(output_path, "labels", "train", image["file_name"].replace(".jpg", ".txt")), "w") as f:f.write(label)# Iterate over the validation images
for image in tqdm(val_annotations["images"]):width, height = image["width"], image["height"]scale_x = 1.0 / widthscale_y = 1.0 / heightlabel = ""for annotation in val_annotations["annotations"]:if annotation["image_id"] == image["id"]:# Convert the annotation to YOLO formatx, y, w, h = annotation["bbox"]x_center = x + w / 2.0y_center = y + h / 2.0x_center *= scale_xy_center *= scale_yw *= scale_xh *= scale_yclass_id = annotation["category_id"]label += "{} {} {} {} {}\n".format(class_id, x_center, y_center, w, h)# Save the image and labelshutil.copy(os.path.join(coco_path, "valid", image["file_name"]), os.path.join(output_path, "images", "val", image["file_name"]))with open(os.path.join(output_path, "labels", "val", image["file_name"].replace(".jpg", ".txt")), "w") as f:f.write(label)

4. 训练数据

找到ultralytics/cfg/datasets/VOC.yaml,复制一份命名为VOC_self.yaml

# 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: F:/vsCode/ultralytics/datasets/VOCdevkit
train: # train images (relative to 'path')  16551 images- images/train
val: # val images (relative to 'path')  4952 images- images/val
test: # test images (optional)- images/val# Classes
names:0: apple

根据README文件选择预训练模型,最好先手动下载放置在项目主目录下。

在这里插入图片描述

训练命令:

yolo task=detect mode=train model=yolov8x.pt data=f:/ultralytics/ultralytics/cfg/datasets/VOC_self.yaml epochs=100 batch=4 device=0
  • 如果想从头开始构建新模型,则model参数设置为yolov8x.yaml
  • 使用自己的数据集,则data参数最好使用绝对路径
  • 如果数据集进行了修改,比如标注文件调整了、图片增多了等等,那么在训练前一定要先把labels文件夹下面的train.cache和val.cache删掉再运行训练命令

在这里插入图片描述

训练得到的模型保存到runs/detect/train文件夹下

5. 推理预测

yolo task=detect mode=predict model=runs\detect\train\weights\best.pt source=datasets\VOCdevkit\images\val device=0

6. 模型导出

将训练好的pt模型文件导出为onnx格式的

yolo task=detect mode=export model=runs\detect\train\weights\best.pt format=onnx

  • 遇到的问题

由于没提前安装onnx,运行后会自动下载最新版本的onnx,接着就会报错max() arg is an empty sequence
在这里插入图片描述

在这里插入图片描述


  • 解决方法

1)按照输出可以知道Ultralytics要求的onnx>=1.12.0,最好就是直接安装1.12.0版本的,所以pip install onnx==1.12.0

2)直接使用上方的CLI命令导出onnx还是会报max() arg is an empty sequence,需要改用python脚本来导出,并指定onnx的opset设置为13;

在这里插入图片描述

from ultralytics import YOLOmodel = YOLO('F:/vsCode/ultralytics/runs/detect/train2/weights/best.pt')
model.export(format='onnx', opset=13)

3)运行该导出脚本即可导出成功
在这里插入图片描述

这篇关于使用YOLOv8训练自己的目标检测数据集(VOC格式/COCO格式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912226

相关文章

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图