当前位置:   article > 正文

YOLOv8训练自己的数据集(记录)_yolov8的标签文件放在那里

yolov8的标签文件放在那里

一、准备前的文件夹目录介绍

bag-images文件夹:用来存放原始数据集所有的.jpg图片

xml文件夹:用来存放原始数据集打过标签的所有xml文件

txt文件夹:用来存放原始数据集,由xml格式转换为txt格式的所有文件

bag文件夹:是我们目标制作的数据集,用于后期跑实验

bag文件夹下有imageslabels文件夹,每个文件夹下都有一个train和val文件夹
images文件夹:用来存放目标数据集的所有图片,分为train训练和val验证两部分

labels文件夹:用来存放目标数据集的所有对应的txt文件,分为train训练和val验证两部分

二、首先将自己标注完成的数据集进行格式转换


下面是将文件由xml格式转换为txt格式代码,建一个voc_label.py脚本,将下面代码复制进去,运行,生成(注意该文件路径地址):
  1. import xml.etree.ElementTree as ET
  2. import os
  3. classes = ["bag"] # 类别,改成自己的类别名称
  4. CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
  5. def convert(size, box):
  6. dw = 1. / size[0]
  7. dh = 1. / size[1]
  8. x = (box[0] + box[1]) / 2.0
  9. y = (box[2] + box[3]) / 2.0
  10. w = box[1] - box[0]
  11. h = box[3] - box[2]
  12. x = x * dw
  13. w = w * dw
  14. y = y * dh
  15. h = h * dh
  16. return (x, y, w, h)
  17. def convert_annotation(image_id):
  18. in_file = open(r'E:\人包物\bag\xml/%s.xml' % (image_id), encoding='UTF-8')#E:\人包物\bag\xml 为xml文件地址
  19. out_file = open(r'E:\人包物\bag\txt/%s.txt' % (image_id), 'w') # 生成txt格式文件 #'E:\人包物\bag\txt 为将要输出生成的txt文件地址
  20. tree = ET.parse(in_file)
  21. root = tree.getroot()
  22. size = root.find('size')
  23. w = int(size.find('width').text)
  24. h = int(size.find('height').text)
  25. for obj in root.iter('object'):
  26. cls = obj.find('name').text
  27. # print(cls)
  28. if cls not in classes:
  29. continue
  30. cls_id = classes.index(cls)
  31. xmlbox = obj.find('bndbox')
  32. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  33. float(xmlbox.find('ymax').text))
  34. bb = convert((w, h), b)
  35. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  36. xml_path = os.path.join(CURRENT_DIR, r'E:\人包物\bag\xml/') #E:\人包物\bag\xml 为xml文件地址
  37. # xml list
  38. img_xmls = os.listdir(xml_path)
  39. for img_xml in img_xmls:
  40. label_name = img_xml.split('.')[0]
  41. print(label_name)
  42. convert_annotation(label_name)

三、将处理好的图片和txt文本进行train和val数据集划分

  1. import os # 用于处理文件路径、创建目录等操作
  2. import random # 用于生成随机数种子、打乱列表等操作
  3. import shutil # 用于生成随机数种子、打乱列表等操作
  4. # 设置随机数种子
  5. random.seed(123)
  6. # 定义文件夹路径
  7. image_dir = r'E:\人包物\images' # 原始图像所在的子目录
  8. label_dir = r'E:\人包物\labels' # 原始标签所在的子目录
  9. output_dir = r'E:\人包物\bag' # 处理后的数据集输出目录
  10. # 定义训练集、验证集和测试集比例
  11. train_ratio = 0.8 # 训练集比例
  12. valid_ratio = 0.1 # 验证集比例
  13. test_ratio = 0.1 # 测试集比例
  14. # 获取所有图像文件和标签文件的文件名(不包括文件扩展名)
  15. image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)] # 提取所有图像文件的文件名列表
  16. label_filenames = [os.path.splitext(f)[0] for f in os.listdir(label_dir)] # 提取所有标签文件的文件名列表
  17. # 随机打乱文件名列表
  18. random.shuffle(image_filenames) # 打乱图像文件的文件名列表
  19. # 计算训练集、验证集和测试集的数量
  20. total_count = len(image_filenames) # 总文件数
  21. train_count = int(total_count * train_ratio) # 训练集文件数
  22. valid_count = int(total_count * valid_ratio) # 验证集文件数
  23. test_count = total_count - train_count - valid_count # 测试集文件数
  24. # 定义输出文件夹路径
  25. train_image_dir = os.path.join(output_dir, 'train', 'images') # 训练集图像输出目录
  26. train_label_dir = os.path.join(output_dir, 'train', 'labels') # 训练集标签输出目录
  27. valid_image_dir = os.path.join(output_dir, 'valid', 'images') # 验证集图像输出目录
  28. valid_label_dir = os.path.join(output_dir, 'valid', 'labels') # 验证集标签输出目录
  29. test_image_dir = os.path.join(output_dir, 'test', 'images') # 测试集图像输出目录
  30. test_label_dir = os.path.join(output_dir, 'test', 'labels') # 测试集标签输出目录
  31. # 创建输出文件夹
  32. os.makedirs(train_image_dir, exist_ok=True) # 创建训练集图像输出目录
  33. os.makedirs(train_label_dir, exist_ok=True) # 创建训练集标签输出目录
  34. os.makedirs(valid_image_dir, exist_ok=True) # 创建验证集图像输出目录
  35. os.makedirs(valid_label_dir, exist_ok=True) # 创建验证集标签输出目录
  36. os.makedirs(test_image_dir, exist_ok=True) # 创建测试集图像输出目录
  37. os.makedirs(test_label_dir, exist_ok=True) # 创建测试集标签输出目录
  38. # 将图像和标签文件划分到不同的数据集中
  39. for i, filename in enumerate(image_filenames):
  40. # 如果文件数量小于训练数据集大小,则将文件复制到训练数据集目录中
  41. if i < train_count:
  42. output_image_dir = train_image_dir
  43. output_label_dir = train_label_dir
  44. # 如果文件数量小于训练数据集大小+验证数据集大小,则将文件复制到验证数据集目录中
  45. elif i < train_count + valid_count:
  46. output_image_dir = valid_image_dir
  47. output_label_dir = valid_label_dir
  48. # 否则,将文件复制到测试数据集目录中
  49. else:
  50. output_image_dir = test_image_dir
  51. output_label_dir = test_label_dir
  52. # 复制图像文件
  53. src_image_path = os.path.join(image_dir, filename + '.jpg') # 获取图像文件的源路径
  54. dst_image_path = os.path.join(output_image_dir, filename + '.jpg') # 获取图像文件的目标路径
  55. shutil.copy(src_image_path, dst_image_path) # 复制图像文件到目标路径
  56. # 复制标签文件
  57. src_label_path = os.path.join(label_dir, filename + '.txt') # 获取标签文件的源路径
  58. dst_label_path = os.path.join(output_label_dir, filename + '.txt') # 获取标签文件的目标路径
  59. shutil.copy(src_label_path, dst_label_path) # 复制标签文件到目标路径

划分好之后就是下面这个样子:
 

将整个bag文件夹,复制移动到D:\cs\yolov8\ultralytics\datasets文件夹下,(一定要在此文件夹)

D:\cs\yolov8\ultralytics\datasets文件夹下新建一个bag.yaml文件

  1. # Ultralytics YOLO 声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
    推荐阅读
    相关标签