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

news2024/11/16 10:26:22

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.html

pip 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 ET

def 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 * dh

    in_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').text
        if 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 id
            out_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 path
        lb_path = (lbs_path / f.name).with_suffix('.txt')  # new label path
        # f.rename(imgs_path / f.name)  # move image
        shutil.copyfile(f, imgs_path / f.name) # copy image
        convert_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 tqdm

coco_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 / width
    scale_y = 1.0 / height
    
    label = ""
    for annotation in train_annotations["annotations"]:
        if annotation["image_id"] == image["id"]:
            # Convert the annotation to YOLO format
            x, y, w, h = annotation["bbox"]
            x_center = x + w / 2.0
            y_center = y + h / 2.0
            x_center *= scale_x
            y_center *= scale_y
            w *= scale_x
            h *= scale_y
            class_id = annotation["category_id"]
            label += "{} {} {} {} {}\n".format(class_id, x_center, y_center, w, h)
            
    # Save the image and label
    shutil.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 / width
    scale_y = 1.0 / height
    
    label = ""
    for annotation in val_annotations["annotations"]:
        if annotation["image_id"] == image["id"]:
            # Convert the annotation to YOLO format
            x, y, w, h = annotation["bbox"]
            x_center = x + w / 2.0
            y_center = y + h / 2.0
            x_center *= scale_x
            y_center *= scale_y
            w *= scale_x
            h *= scale_y
            class_id = annotation["category_id"]
            label += "{} {} {} {} {}\n".format(class_id, x_center, y_center, w, h)
            
    # Save the image and label
    shutil.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 YOLO

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js微博发布案例

思路: 需求1:检测用户输入的字数 注册input事件 将输入文本长度赋值给对应的数值 需求2:输入不能为空 点击按钮之后判断 如果输入为空,则提示不能输入为空,并直接return 为了防止无意义的一些输入,利用字符…

NLP预训练模型-GPT-3

ChatGPT GPT-3是OpenAI开发的一个自然语言处理(NLP)预训练模型。GPT代表“生成式预训练变换器”(Generative Pretrained Transformer)。GPT-3是GPT系列的第三代模型,是一种采用了深度学习技术的强大语言模型&#xff…

C++:类与对象完结篇

hello,各位小伙伴,本篇文章跟大家一起学习《C:运算符重载》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 重新认识构造函数1.初始化列表2.explicit关键字 static成员1.sta…

通信原理(1)--信息的度量,通信系统的性能指标

通信原理(1)–信息的度量,通信系统的性能指标 1.1通信的基本概念 消息、信息与信号通信系统的组成模型数字通信的特点通信系统的分类通信的方式 1.1.1通信的发展 1.1.2消息、信息与信号 消息的定义 消息是通信系统要传输的对象,包含连续消息和离散…

车控操作系统

车控操作系统 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看…

从 Android 恢复已删除文件的 3 种简单方法

如何从 Android 恢复已删除的文件?毫不犹豫,有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是,如果删除的文件未同步到您的帐户或未备份怎么办?您错误的恢复可能会永久删除您想要的数据。因此,我们发布…

seatable部署之后network error【seatable】

这里写自定义目录标题 问题汇总 问题汇总 seatable服务部署后,组件显示正常运行,创建表单,显示Network error 点击错误信息,查看其跳转至另一个页面

数据结构----顺序表

在学习顺序表之前,我们先来了解一下数据结构。 数据是什么呢? 我们在生活中常见的名字,数字,性别等都属于数据。 结构又是什么呢? 在计算机中,结构就是用来保存数据的方式。 总的来说,数据…

【抽代复习笔记】13-群(七):变换群引理

引理:考虑等边三角形123—— 这个等边三角形的对称性可用(1),(12),(13),(23),(123),(132)表示,其中: (1)表示这个等边三角形绕着其中心点旋转360/720/.../360n,得到的图形与原图形完全重合的旋转对称变换; (12)表示这…

selenium_使用XPATH定位

selenium_使用XPATH定位 """需求:1. 使用绝对路径定位 用户名 输入 admin2. 暂停2秒钟3. 使用相对路径定位 密码框 输入 123方法:driver.find_element_by_xpath() """# 导包 from selenium import webdriver from time im…

Elasticsearch常用查询语法及RestClient操作

DSL Query基本语法 1,查询所有数据matchall(当然并不是会显示所有数据) #查询所有数据 GET /索引名/_search {"query": {"查询类型": {"查询条件":"条件值"}} }2,全文搜索检索-分词搜索…

第07-4章 网络层详解

7.1 网络层协议 IP协议ARP(地址解析协议)RARP(反向地址解析协议)ICMP(互联网控制消息协议) 7.2 IP协议详解 7.2.1 IP协议功能 寻址和路由传递服务(不可靠,尽最大努力&#xff0c…

牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解

Bingbong的回文路径: 题目描述: 思路解析: 现在有一棵树,树上每个结点上都有一个小写字母,那么如果唯一确定了x和y两个结点,那么就唯一确定了一个字符串路径(最短路径)。 -现在给出…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核,以完成OS该有的功能,例如,文件系统,网络,内存管理,进程调度,驱动等 ,向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

Vue3+TS版本Uniapp:封装uni.request请求配置

作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例(在create方法中写入请求…

ChatGPT基础(三) 让ChatGPT回答质量提高十倍的提示词模版

上篇文章介绍了ChatGPT使用提示词的一些方法策略和如何优化我们的提示词。这里呢,我介绍一下参照大佬的方法总结的一个提示词的一个用法的模板。使用这个模板之后,我们的提问和获得答案的效率和收集素材的完整度能提高很多。 首先我介绍一下这个模板&am…

实战|哈尔滨等保2.0 Linux主机测评过程之身份鉴别

一、身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换。 输入 more /etc/shadow,得知系统所有用户,此语句字段格式有九段。 第一字段:用户名(也被称为登录名…

Nature Communications 构筑了具备优异形状记忆功能的聚合物材料

2024年2月29日,华东理工大学化学与分子工程学院、费林加诺贝尔奖科学家联合研究中心曲大辉教授团队在形状记忆功能聚合物材料研究中取得新进展,相关研究成果发表于《自然通讯》,这项研究取得了在形状记忆功能聚合物材料领域的新进展。研究团队…

国内ai人工智能软件大全

很多人一直在寻找一个稳定且可靠的全球AI大模型测试平台,希望它不仅真实可信,而且能提供稳定、快速的服务,不会频繁出现故障或响应缓慢。迄今为止,我已经尝试了国内外至少10个不同的服务站点。不幸的是,这些站点总是存…

【UE 材质】雨滴效果

在上一篇博客(【UE 材质】表面湿润效果)的基础上继续实现物体表面附加雨滴的效果 效果 步骤 1. 下载所需纹理 2. 创建一个材质并打开,添加如下节点,我们将纹理的RG通道输出的值和1组成一个三维向量,作为基本的法线效…