使用YOLOv8训练自己的数据集

本文详细介绍了如何使用Ultralytics的YOLO框架进行水果图像识别项目的数据集准备,包括从GitHub克隆项目、安装依赖、数据集划分与转换为VOC格式,以及配置和训练过程,最终实现了98.7%的准确率和99.7%的召回率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拉取项目

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

安装依赖

cd ultralytics
pip install -r requirement.txt
pip install -e .

准备数据集

下载数据集zip包,并解压,数据集的地址在原作者博客中有。

unzip archive (3).zip
mv archive (3) fruit_data

制作数据集

以下操作全部在fruit_data目录下

cd fruit_data

生成图片列表,划分数据集

使用脚本split_train_val.py,从标注xml文件中抽取出图像的列表和标签信息,并保存到相应的文件中。

#!/usr/bin/env python
# coding: utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--xml_path', default='annotations', type=str, help='input xml label path')
parser.add_argument('--txt_path', default='imageSets/Main', type=str, help='output txt label path')

opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 0.9

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_index = range(num)

tv = int(num * trainval_percent)
tr = int(tv * train_percent)

trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

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

for i in list_index:
    name = total_xml[i][:-4] + '\n'

    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)


file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

python split_train_val.py

生成VOC格式的数据文件

因为YOLO框架使用的是VOC格式的数据集,因此需要生成一个VOC格式的数据文件
使用脚本voc_label.py

#!/usr/bin/env python
# coding: utf-8

import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']

classes = ['banana', 'snake fruit', 'pineapple', 'dragon fruit']

abs_path = os.getcwd()
print(abs_path)

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('./annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('./labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()

    filename = root.find('filename').text
    filenameFormat = filename.split('.')[1]

    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
        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')

    return filenameFormat

wd = getcwd()

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

    image_ids = open('./imageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('./%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        filenameFormat = convert_annotation(image_id)
        list_file.write(abs_path + '/images/%s.%s\n' % (image_id, filenameFormat))

    list_file.close()
python voc_label.py

编写数据集配置文件

在项目根目录下创建一个文件data.yaml

cd ..
vim data.yaml

配置文件内容如下

train: ./data/train.txt
val: ./data/val.txt

# number of classes 
nc: 4

# 类别名
names: ['banana', 'snake fruit', 'pineapple', 'dragon fruit']

开始训练

yolo task=detect mode=train model=yolov8s.yaml data=/root/autodl_tmp/ultralytics/data.yaml epochs=100 batch=4

训练过程如下:
训练过程1
训练过程2
训练过程3
训练结束

训练结果

通过上面训练结束可以看出,总体上达到了98.7%的准确率,99.7%的召回率,效果还是非常不错的。
训练过程如图
训练过程

训练结果如图
训练结果图示

YOLOv8(You Only Look Once Version 8)是一个实时物体检测算法,它在YOLO系列中是最新的版本之一。要在Python中使用YOLOv8训练自己的数据集并进行测试,你需要遵循以下步骤: 1. 准备环境: - 安装必要的库:首先确保已经安装了PyTorch和`torchvision`,以及`yolov8`库。如果还没有,可以使用`pip install torch torchvision yolov8`命令安装。 2. 数据预处理: - 导入数据:将你的数据集划分为训练集、验证集和测试集。使用`pandas`或`cv2`读取图像,并将它们转换为YOLOv8模型所需的格式,通常需要调整尺寸并添加标签。 3. 训练模型: - 加载预训练权重:YOLOv8提供了预训练的权重文件,你可以选择加载这些权重作为起点进行微调。 - 实例化`yolov8`模型:通过`Yolov8()`函数创建一个模型实例。 - 定义损失函数和优化器:YOLOv8训练通常使用预定义的损失函数和优化器。 - 训练循环:遍历训练集,执行前向传播、计算损失、反向传播和更新权重。 ```python from yolov8 import YOLOv8, create_model, optim model = create_model("yolov8s") optimizer = optim(model.parameters(), lr=0.001) for epoch in range(num_epochs): for images, targets in train_dataloader: # ... [训练步骤] ``` 4. 保存训练好的模型: - 定期保存训练过程中的最优模型,以便于后续使用。 5. 测试模型: - 对测试集应用训练好的模型,计算精度和召回率等指标。你可以使用`model.evaluate`方法。 ```python model.eval() for images, _ in test_dataloader: predictions = model(images) # ... [评估步骤,比如非极大抑制(NMS)和指标计算] ``` 6. 检测实时应用: - 如果是实时检测,你可以将模型集成到一个视频流或者摄像头捕获的帧中,展示检测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值