pycharm 中使用YOLOV8训练自己的数据集

YOLOV8训练自己的数据集

1.下载 yolov8 代码到本地

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

2.数据集准备

自己的数据集是VOC2007格式的,怕麻烦还是写了个代码转为yolo标签格式。
这是VOC格式数据集格式
在这里插入图片描述
首先是生成Main文件夹下的txt文件

import os
import random

# 随机数种子
random.seed(0)

#   指向VOC数据集所在的文件夹
VOCdevkit_path = './VOCdevkit'
VOCdevkit_sets = [('2007', 'train'), ('2007', 'val')]

#   trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
#   train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
trainval_percent = 0.9
train_percent = 0.9

print("Generate txt in ImageSets.")
xmlfilepath = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')
saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007/ImageSets/Main')
temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:
    if xml.endswith(".xml"):
        total_xml.append(xml)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

print("train and val size", tv)
print("train size", tr)
ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
print("Generate txt in ImageSets done.")

然后使用以下代码转换为在yolov8中跑的数据集格式

'''
将XML格式的数据集转换成YOLO TXT格式
'''

import os
import shutil
import xml.etree.ElementTree as ET

def convert_annotation(xml_paths, classes):

    for xml_path in xml_paths:
        txt_path = xml_path.replace("Annotations", "labels").replace(".xml", ".txt")
        txtfile = open(txt_path, 'w')

        in_file = open(xml_path, encoding="utf-8")
        tree = ET.parse(in_file)
        root = tree.getroot()
        size = root.find('size')
        width = int(size.find('width').text)
        height = int(size.find('height').text)

        for obj in root.iter("object"):
            classname = obj.find("name").text
            if classname not in classes:
                continue
            cls_id = classes.index(classname)

            xmin = (float(obj.find("bndbox").find("xmin").text))
            ymin = (float(obj.find("bndbox").find("ymin").text))
            xmax = (float(obj.find("bndbox").find("xmax").text))
            ymax = (float(obj.find("bndbox").find("ymax").text))

            x_center = (xmin + xmax) / 2.0
            y_center = (ymin + ymax) / 2.0
            x = x_center / width
            y = y_center / height
            w = (xmax - xmin) / width
            h = (ymax - ymin) / height
            datas = (x, y, w, h)
            txtfile.write(str(cls_id) + " " + " ".join([str(data) for data in datas]) + '\n')
        in_file.close()
        txtfile.close()

if __name__ == "__main__":
    # VOC数据集根目录
    vocDir = "./VOCdevkit"

    # 创建YOLO数据集标签文件夹
    yololabel = os.path.join(vocDir, "VOC2007", "labels")
    yoloimage = os.path.join(vocDir, "VOC2007", "images")
    if not os.path.exists(yololabel):
        os.mkdir(yololabel)
    if not os.path.exists(yoloimage):
        os.mkdir(yoloimage)

    # 数据集类别 我这里是单类别目标检测
    classes = ['wheat']

    # 按照训练集验证集测试集将标签分别转换成yolo txt格式
    VOCdevkit_sets = [('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
    for year, image_set in VOCdevkit_sets:
        image_ids = open(os.path.join(vocDir, 'VOC%s/ImageSets/Main/%s.txt' % (year, image_set)),
                         encoding='utf-8').read().strip().split()
        yolofile = open(os.path.join(vocDir, 'VOC%s/%s.txt' % (year, image_set)),"w", encoding='utf-8')
        xml_list = []
        for image_id in image_ids:
            xmlpath = os.path.join(vocDir, 'VOC%s/Annotations/%s.xml' % (year, image_id))
            xml_list.append(xmlpath)

            imagepath = os.path.join(vocDir, 'VOC%s/JPEGImages/%s.jpg' % (year, image_id))
            newimagepath = imagepath.replace("JPEGImages", "images")
            shutil.copy(imagepath, newimagepath)
            path = os.path.abspath(newimagepath)
            yolofile.write(path)
            yolofile.write("\n")
        yolofile.close()

        # 将xml标签转为txt
        convert_annotation(xml_list, classes)
        print("-------------------------------")
        print("process file number:", len(xml_list))

运行完会生成以下文件,组成了一个可以在yolov8里使用的数据集
在这里插入图片描述

训练

yolov8训练参数都集成到一个文件中
修改ultralytics/yolo/v8/detect/train.py文件,修改data路径
在这里插入图片描述
修改default.yaml文件参数,先修改模型文件和数据集文件
在这里插入图片描述
修改ultralytics/models/v8/yolov8.yaml 的模型文件nc为自己数据集的类别数
在这里插入图片描述
在ultralytics/datasets/mydataset.yaml,新建一个mydataset.yaml文件,参考coco.yaml文件,path填写数据集train.txt文件绝对路径,类别名称修改为自己的数据集
在这里插入图片描述
然后修改default.yaml的其他训练参数,自己看着想改啥改啥,我就修改了这几项
训练文件保存在ultralytics/yolo/v8/detect/rundetect/log文件夹下
在这里插入图片描述

验证

修改ultralytics/yolo/v8/detect/val.py文件下data路径
在这里插入图片描述

在default.yaml文件下修改mode为val,修改model为训练获得的best.pt路径,这里写绝对路径,然后修改下val的ion和conf参数
在这里插入图片描述
因为不是命令行运行代码要修改ultralytics/yolo/engine/validator.py文件,解析参数,然后直接运行val.py文件
在这里插入图片描述

推理

修改default.yaml文件mode为predict,修改model为训练的权重文件路径,修改iou和conf值,修改source路径,然后直接运行predict.py文件
在这里插入图片描述

错误处理

直接 pip uninstall wandb 卸载wandb库,不使用这个库,对我来说没什么用。
在这里插入图片描述

##结束
这里全部都是直接在pycharm中运行的,和命令行运行代码不一样,可以参考,但不一定完全适合。

### YOLOv8 自定义数据集训练配置 #### 环境准备 为了在 PyCharm 中顺利进行 YOLOv8 的开发工作,建议先安装 Anaconda 来管理 Python 虚拟环境以及依赖包。通过 Conda 创建一个新的虚拟环境并激活它[^1]。 ```bash conda create -n yolov8 python=3.9 conda activate yolov8 ``` 接着,在该环境中安装必要的库: ```bash pip install ultralytics # 安装官方支持的 Ultralytics 库来获取最新版 YOLOv8 ``` #### 数据集整理 按照 YOLO 格式的标注方式准备好自定义的数据集,并将其放置于 `datasets/custom_dataset` 文件夹下。创建相应的 `.yaml` 配置文件用于指定各类路径与参数设置,如类别数量、图像尺寸等信息。 #### PyCharm 设置 打开 PyCharm 并导入现有项目或新建一个项目指向上述创建好的 conda 环境位置。确保解释器已正确关联至刚才建立的 `yolov8` 环境中。 对于遇到 train.py 报错的情况,这可能是由于版本兼容性或其他原因引起的错误[^2]。可以尝试直接利用命令行工具来进行模型训练而非常规脚本入口函数的方式启动训练过程。 #### 训练流程 完成以上准备工作之后,可以在终端内执行如下指令开始训练: ```bash from ultralytics import YOLO model = YOLO('yolov8.yaml') # 加载预设配置 results = model.train(data='path/to/your/dataset.yaml', epochs=100, imgsz=640) ``` 注意调整好各项超参选项以适应硬件条件限制(比如 epoch 数量、batch size 和 image size),同时选择合适的 GPU 或 CPU 设备作为计算资源。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MySunshine456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值