当前位置:   article > 正文

YOLOV8数据集运行:用coco128数据集格式跑VOC数据集(V8运行各类数据集万能模板)_yolov8co'c

yolov8co'c
 模仿coco128.yaml是因为它内部文件最简单,下面代码是万能的,只要你有数据集与对应的标签文件就可以划分成功并运行;如果标签文件不用转换把对应转换代码删除即可;为了方便可以模仿VOC数据集文件,将图片存放在JPEGImages中,标签文件存放在Annotations中,那下面代码就只需修改源文件地址与目标文件地址以及class_to_idx--数据集的num-classes种类。

下面图片是模仿coco128.yaml文件改写的mydata.yaml;

以下代码将voc数据集变成yolo格式,将voc数据集的图片存放到images文件中,并且按比例划分为训练集,验证集和测试集,比例为8:1:1。而将voc数据集标注文件原本的xml格式转换为txt格式并存放在labels文件夹中,里面的标签文件对于images文件夹中的训练集,验证集和测试集的标签文件;

注意:需在文件夹中提前准备好images文件夹和labels文件夹,并在其中创建train,val,test文件夹。如果不需要test文件,将代码中test删除,把对应的比例划分给train或者val。

  1. #voc转yolo
  2. import os
  3. import random
  4. import shutil
  5. import xml.etree.ElementTree as ET
  6. # 设置VOC数据集文件夹路径
  7. voc_dir = './cfg/datasets/VOC2012' #源文件名
  8. output_dir = './cfg/datasets/VOC' #目标文件名
  9. # 创建YOLO格式的文件夹结构
  10. yolo_subdirs = ['images', 'labels']
  11. for subdir in yolo_subdirs:
  12. os.makedirs(os.path.join(output_dir, subdir), exist_ok=True)
  13. # 获取所有图片文件的文件名(不包括文件扩展名)
  14. image_files = [os.path.splitext(file)[0] for file in os.listdir(os.path.join(voc_dir, 'JPEGImages'))]
  15. # 随机打乱图片文件顺序
  16. random.shuffle(image_files)
  17. # 划分数据集比例(8:1:1)
  18. total_images = len(image_files)
  19. train_ratio = 0.8
  20. val_ratio = 0.1
  21. train_split = int(total_images * train_ratio)
  22. val_split = int(total_images * (train_ratio + val_ratio))
  23. # 分割数据集
  24. train_images = image_files[:train_split]
  25. val_images = image_files[train_split:val_split]
  26. test_images = image_files[val_split:]
  27. # 复制图片文件到YOLO格式文件夹
  28. def copy_images(image_list, subset):
  29. for image_name in image_list:
  30. image_path_src = os.path.join(voc_dir, 'JPEGImages', image_name + '.jpg')
  31. image_path_dest = os.path.join(output_dir, 'images', subset, image_name + '.jpg')
  32. shutil.copy(image_path_src, image_path_dest)
  33. copy_images(train_images, 'train')
  34. copy_images(val_images, 'val')
  35. copy_images(test_images, 'test')
  36. class_to_idx = {
  37. 'aeroplane': 0,
  38. 'bicycle': 1,
  39. 'bird': 2,
  40. 'boat': 3,
  41. 'bottle': 4,
  42. 'bus': 5,
  43. 'car': 6,
  44. 'cat': 7,
  45. 'chair': 8,
  46. 'cow': 9,
  47. 'diningtable': 10,
  48. 'dog': 11,
  49. 'horse': 12,
  50. 'motorbike': 13,
  51. 'person': 14,
  52. 'pottedplant': 15,
  53. 'sheep': 16,
  54. 'sofa': 17,
  55. 'train': 18,
  56. 'tvmonitor': 19,
  57. # 如果你的数据集有更多类别,请继续添加映射
  58. }
  59. # 转换XML标签为YOLO格式并保存为txt文件
  60. def convert_voc_to_yolo_label(image_list, subset):
  61. for image_name in image_list:
  62. label_path_src = os.path.join(voc_dir, 'Annotations', image_name + '.xml')
  63. label_path_dest = os.path.join(output_dir, 'labels', subset, image_name + '.txt')
  64. with open(label_path_dest, 'w') as label_file:
  65. root = ET.parse(label_path_src).getroot()
  66. img_size = root.find('size')
  67. img_width = float(img_size.find('width').text)
  68. img_height = float(img_size.find('height').text)
  69. for obj in root.findall('object'):
  70. class_name = obj.find('name').text
  71. if class_name not in class_to_idx:
  72. continue
  73. class_idx = class_to_idx[class_name]
  74. bbox = obj.find('bndbox')
  75. xmin = float(bbox.find('xmin').text)
  76. ymin = float(bbox.find('ymin').text)
  77. xmax = float(bbox.find('xmax').text)
  78. ymax = float(bbox.find('ymax').text)
  79. # 计算YOLO格式的坐标(中心点坐标、宽度和高度)
  80. x_center = (xmin + xmax) / (2 * img_width)
  81. y_center = (ymin + ymax) / (2 * img_height)
  82. width = (xmax - xmin) / img_width
  83. height = (ymax - ymin) / img_height
  84. # 将YOLO格式的标签写入文件
  85. label_file.write(f"{class_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")
  86. # 对训练集、验证集和测试集执行标签转换
  87. convert_voc_to_yolo_label(train_images, 'train')
  88. convert_voc_to_yolo_label(val_images, 'val')
  89. convert_voc_to_yolo_label(test_images, 'test')
  90. print("数据集转换完成,YOLO格式的数据集保存在", output_dir)

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号