前情提要:第一次玩yolov8,记录下踩坑过程,本篇指南主要参考YOLOv8训练自己的数据集,同时记录了自己在这个过程中遇到的其他问题以及解决的办法。
代码下载地址:ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)
解压后重命名文件夹,我把文件夹‘ultralytics-main'改成了'yolov8'的名字。
目录
一、搭建conda环境
1、创建新环境
按下'win'+'r',输入cmd,然后输入以下命令:
conda create -n yolov8 python=3.8
2、激活环境:conda activate yolov8
3、切换当前路径到文件夹下:cd yolov8
4、安装环境包:pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
(这个我看有的帖子还让安装requirements.txt,但本人没在下载的文件夹里找到,调研了原因是因为相关配置要求都集成到ultralytics里啦,所以只用安装ultralytics)
二、数据集准备
2.1 数据标注
1、准备好自己的图片数据
2、在当前环境中安装labelimg(图片标注工具)
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
我安装的是1.8.6版本
3、在cmd中打开labelimg
4、在labelimg界面中标注图片,我保存成了VOC格式,即标注文件以.xml为后缀
2.2 数据集划分
5、将数据集随机划分为 train\test\val 三个类别
在项目文件夹yolov8目录下新建一个文件夹mydata。 在mydata文件夹下分别建立dataset、images、labels、xml四个文件夹,其中将图像数据都放到images中,将标注好的xml文件放到xml文件夹中。
然后在mydata文件夹下新建一个名为split_train_val.py的文件,用于实现训练集/测试集/验证集的划分,具体代码如下:
# coding:utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='xml', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='dataset', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 0.9
train_percent = 0.7
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()
运行以上程序后,就将图片名划分到了不同的数据集中。