yolov8官方代码训练模型(coco数据集和voc数据集训练)+onnx模型预测

目录

目录

一、环境安装

1. 运行环境windows

二、coco数据集格式及训练步骤

2.1 前期准备

2.2 数据集格式

2.3 yaml文件

2.4 开始训练

2.4.1 修改参数

2.4.2 开始训练

2.5 模型预测

三、voc数据集格式及训练步骤

3.1 前期准备

3.2 数据集划分

3.3 生成训练用的txt文件

3.4 开始训练

3.4.1 yaml文件参数修改

3.4.2 default.yaml参数修改

3.4.3 开始训练

3.5 模型预测

四、pt模型转onnx模型预测

4.1 pt转onnx

4.2 预测

参考:


这是新版的yolov8目标检测训练步骤,如果用的最新的代码,可以参考这个训练

一、环境安装

1. 运行环境
windows

首先切换到自己建立的虚拟环境安装 pytorch


pytorch


参照官网,直接使用以下语句即可导入项目所需要的库

pip install ultralytics

根据官方的解释,pip 的 ultralytics 库包含了 requirements.txt中的所有库

训练代码:

链接:https://pan.baidu.com/s/164sApCkqjGgUrittLh1xQg?pwd=hujv 
提取码:hujv

onnx预测代码:

链接: https://pan.baidu.com/s/1vkfL_p_TDG65FlW53CiX3g?pwd=ix43

提取码: ix43 

二、coco数据集格式及训练步骤

2.1 前期准备

在对应的目录下新建文件

yolov8模型仓库

2.2 数据集格式

coco数据集放在datasets文件夹下,格式如下

images 下包含 train、val 文件夹,这两个文件夹下包含此次需要的 图片信息
labels 下包含 train、val 文件夹,这两个文件夹下包含此次需要的 对应图片的标注信息

2.3 yaml文件

在之前创建的yaml里面,将以下内容复制进去,

如果按照我的步骤以及文件地址一样的话,就不用修改train和val的路径了

train: images/train
val: images/val
# number of classes
nc: 3
# class names
names: ['Paaper', 'Rock','Scissors']

nc:类名数量

names:类名

2.4 开始训练

2.4.1 修改参数

2.4.2 开始训练

出现以下画面,则代表成功

训练完后根据上面的提示到runs里面detect里面找到对应的train文件夹,比如上面就保存在train2里面

模型位置如下图:

2.5 模型预测

使用以下命令

yolo detect predict model=weights/best.pt source=data/test_images save=True

model参数:修改为你的best模型地址

source参数:修改为要测试的图片文件夹(没有的可以新建)        

三、voc数据集格式及训练步骤

3.1 前期准备

数据集文件结构如下

VOCdevkit
 ————VOC2007
    ————Annotations  # 存放图片对应的xml文件,与JPEGImages图片名称一一对应
    ————ImageSets
      ————Main        # 存放trainval.txt、train.txt、val.txt、test.txt,开始为空
    ————JPEGImages    # 存放所有图片文件

新建文件

3.2 数据集划分

将以下代码放入split_train_val.py里面

代码来自参考博客(【YOLOv5、YOLOv7、YOLOv8训练】——VOC数据集划分和YOLO格式转换_yolov7和yolov8训练集一样吗_下雨天不下雨的博客-CSDN博客

# -*- coding: utf-8 -*-
"""
Author:smile
Date:2022/09/11 10:00
顺序:脚本A1
简介:分训练集、验证集和测试集,按照 8:1:1 的比例来分,训练集9,验证集1

"""
import os
import random
import argparse

parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='datasets/VOC2007/Annotations', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='datasets/VOC2007/ImageSets/Main/', type=str, help='output txt label path')
opt = parser.parse_args()

train_percent = 0.9  # 训练集所占比例
val_percent = 0.1  # 验证集所占比例


xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)

if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list = list(range(num))

t_train = int(num * train_percent)
t_val = int(num * val_percent)

train = random.sample(list, t_train)
num1 = len(train)
for i in range(num1):
    list.remove(train[i])

val_test = [i for i in list if not i in train]
val = random.sample(val_test, t_val)
num2 = len(val)
for i in range(num2):
    list.remove(val[i])

file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')


for i in train:
    name = total_xml[i][:-4] + '\n'
    file_train.write(name)

for i in val:
    name = total_xml[i][:-4] + '\n'
    file_val.write(name)

file_train.close()
file_val.close()

需要修改的地方

修改完后运行

3.3 生成训练用的txt文件

将以下代码放入voc_label.py

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os

sets = ['train', 'val']  # 如果你的Main文件夹没有test.txt,就删掉'test'
# classes = ["a", "b"]   # 改成自己的类别,VOC数据集有以下20类别
classes = ['Paaper', 'Rock','Scissors']  # class names
abs_path = os.getcwd()


def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h


def convert_annotation(image_id):
    in_file = open(abs_path + '/datasets/VOC2007/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open(abs_path + '/datasets/VOC2007/labels/%s.txt' % (image_id), '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'):
        difficult = obj.find('difficult').text
        # difficult = obj.find('Difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


for image_set in sets:
    if not os.path.exists(abs_path + '/datasets/VOC2007/labels/'):
        os.makedirs(abs_path + '/datasets/VOC2007/labels/')

    image_ids = open(abs_path + '/datasets/VOC2007/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open(abs_path + '/datasets/VOC2007/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/datasets/VOC2007/JPEGImages/%s.jpg\n' % (image_id))  # 要么自己补全路径,只写一半可能会报错
        convert_annotation(image_id)
    list_file.close()

需要修改的地方

修改完后运行

至此,数据集的样式是这样的

3.4 开始训练

3.4.1 yaml文件参数修改

将以下内容复制到最开始创建的yaml文件里面,注意修改nc 和 names

train: VOC2007/train.txt
val: VOC2007/val.txt
# number of classes
nc: 3
# class names
names: ['Paaper', 'Rock','Scissors']

train和val的路径看情况修改

3.4.2 default.yaml参数修改

3.4.3 utils.py修改参数

3.4.3 开始训练

出现以下画面则成功

3.5 模型预测

使用以下命令

yolo detect predict model=weights/best.pt source=data/test_images save=True

model参数:修改为你的best模型地址

source参数:修改为要测试的图片文件夹(没有的可以新建)

四、pt模型转onnx模型预测

4.1 pt转onnx

运行即可

4.2 预测

代码的目录结构如下:

图片检测只需要进入image_onnx文件夹里

代码中需要修改的地方:

参考:

【YOLO】YOLOv8训练自定义数据集(4种方式)-CSDN博客

【YOLOv5、YOLOv7、YOLOv8训练】——VOC数据集划分和YOLO格式转换_yolov7和yolov8训练集一样吗_下雨天不下雨的博客-CSDN博客

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值