• YOLOv5训练自己的voc数据集


    1.yolov5数据的要求

    查看yolov5的配置文件coco.yaml和coco128.yaml,yolov5数据集可以有两种形式,

             一种像coco128所示,在images和labels文件夹下,建立train、test、val三个文件夹,存放训练集、测试集、验证集的标签和数据,然后再复制coco128.yaml前面路径部分,改为自己的路径,其中,训练集、测试集、验证集均写相应的文件夹路径,再将类别数量、名称改为自己数据集的名称和数量。download部分完全没用,不要复制

     

            另一种就是将训练集、测试集、验证集图片路径直接写入txt文件中,复制coco.yaml,路径修改为自己的txt文件、种类数量、名称都要改为自己的数据 

     

    2.VOC数据集

            VOC数据集如图所示:Annotations_original是数据集没有的,是我调整数据后加的,JPEGImages下存放的是图片,Annotations存放标签,ImageSets下的main文件夹存放train/test/val文件标签

     3.VOC数据集调整为coco格式

    1.JPEGImages文件夹名称需要改为images(手动修改)

    2.需要存放训练集、测试集、验证集图片路径的txt文件

    3.labels需要由xml文件改为yolo格式

    运行下面的代码即可:

    1. import os
    2. import random
    3. import xml.etree.ElementTree as ET
    4. import numpy as np
    5. # --------------------------------------------------------------------------------------------------------------------------------#
    6. # annotation_mode用于指定该文件运行时计算的内容
    7. # annotation_mode为0代表整个标签处理过程,训练集、测试集、验证集图片路径的txt文件以及标签xml文件改为yolo格式
    8. # annotation_mode为1代表获得训练集、测试集、验证集图片路径的txt文件
    9. # annotation_mode为2代表标签xml文件改为yolo格式
    10. # --------------------------------------------------------------------------------------------------------------------------------#
    11. annotation_mode = 0
    12. # -------------------------------------------------------------------#
    13. # 必须要修改,用于标签的目标信息
    14. # 与训练和预测所用的classes_path一致即可
    15. # 如果生成的2007_train.txt里面没有目标信息
    16. # 那么就是因为classes没有设定正确
    17. # 仅在annotation_mode为0和2的时候有效
    18. # -------------------------------------------------------------------#
    19. classes_path = '../Detection/classes.txt'
    20. # --------------------------------------------------------------------------------------------------------------------------------#
    21. # trainval_percent用于指定(训练集+验证集)与测试集的比例,默认情况下 (训练集+验证集):测试集 = 9:1
    22. # train_percent用于指定(训练集+验证集)中训练集与验证集的比例,默认情况下 训练集:验证集 = 9:1
    23. # 仅在annotation_mode为0和1的时候有效
    24. # --------------------------------------------------------------------------------------------------------------------------------#
    25. trainval_percent = 0.8
    26. train_percent = 0.8
    27. # -------------------------------------------------------#
    28. # 指向VOC数据集所在的文件夹
    29. # 默认指向根目录下的VOC数据集
    30. # -------------------------------------------------------#
    31. VOCdevkit_path = '../Detection'
    32. def get_classes(classes_path):
    33. with open(classes_path, encoding='utf-8') as f:
    34. class_names = f.readlines()
    35. class_names = [c.strip() for c in class_names]
    36. return class_names, len(class_names)
    37. classes, _ = get_classes(classes_path)
    38. # -------------------------------------------------------#
    39. # 统计目标数量
    40. # -------------------------------------------------------#
    41. photo_nums = np.zeros(len(VOCdevkit_sets))
    42. nums = np.zeros(len(classes))
    43. def convert_label(path, image_id):
    44. def convert_box(size, box):
    45. dw, dh = 1. / size[0], 1. / size[1]
    46. x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
    47. return x * dw, y * dh, w * dw, h * dh
    48. in_file = open(os.path.join(path,f'VOC2007/Annotations/{image_id}.xml'),encoding='utf-8')
    49. out_file = open(os.path.join(path, f'VOC2007/labels/{image_id}.txt'), 'w',encoding='utf-8')
    50. tree = ET.parse(in_file)
    51. root = tree.getroot()
    52. size = root.find('size')
    53. w = int(size.find('width').text)
    54. h = int(size.find('height').text)
    55. for obj in root.iter('object'):
    56. cls = obj.find('name').text
    57. if cls in classes and not int(obj.find('difficult').text) == 1:
    58. xmlbox = obj.find('bndbox')
    59. bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ('xmin', 'xmax', 'ymin', 'ymax')])
    60. cls_id = classes.index(cls) # class id
    61. out_file.write(" ".join([str(a) for a in (cls_id, *bb)]) + '\n')
    62. if __name__ == "__main__":
    63. random.seed(42)
    64. if " " in os.path.abspath(VOCdevkit_path):
    65. raise ValueError("数据集存放的文件夹路径与图片名称中不可以存在空格,否则会影响正常的模型训练,请注意修改。")
    66. if annotation_mode == 0 or annotation_mode == 1:
    67. print("Generate train/test/val txt")
    68. xmlfilepath = os.path.join(VOCdevkit_path, 'VOC2007/Annotations')
    69. saveBasePath = os.path.join(VOCdevkit_path, 'VOC2007')
    70. temp_xml = os.listdir(xmlfilepath)
    71. total_xml = []
    72. for xml in temp_xml:
    73. if xml.endswith(".xml"):
    74. total_xml.append(xml)
    75. num = len(total_xml)
    76. list = list(range(num))
    77. tv = int(num * trainval_percent)
    78. tr = int(tv * train_percent)
    79. trainval = random.sample(list, tv)
    80. train = random.sample(trainval, tr)
    81. random.shuffle(list)
    82. print("train and val size", tv)
    83. print("train size", tr)
    84. ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w',encoding='utf-8')
    85. ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w',encoding='utf-8')
    86. ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w',encoding='utf-8')
    87. fval = open(os.path.join(saveBasePath, 'val.txt'), 'w',encoding='utf-8')
    88. for i in list:
    89. name = total_xml[i][:-4]
    90. if i in trainval:
    91. ftrainval.write('%s/VOC2007/images/%s.jpg\n'% (os.path.abspath(VOCdevkit_path), name))
    92. if i in train:
    93. ftrain.write('%s/VOC2007/images/%s.jpg\n'% (os.path.abspath(VOCdevkit_path), name))
    94. else:
    95. fval.write('%s/VOC2007/images/%s.jpg\n'% (os.path.abspath(VOCdevkit_path), name))
    96. else:
    97. ftest.write('%s/VOC2007/images/%s.jpg\n'% (os.path.abspath(VOCdevkit_path), name))
    98. ftrainval.close()
    99. ftrain.close()
    100. fval.close()
    101. ftest.close()
    102. print("Generate train/test/val.txt done.")
    103. if annotation_mode == 0 or annotation_mode == 2:
    104. print("Generate coco labels")
    105. if not os.path.exists(os.path.join(VOCdevkit_path,'VOC2007/labels/')):
    106. os.makedirs(os.path.join(VOCdevkit_path,'VOC2007/labels/'))
    107. image_ids = os.listdir(os.path.join(VOCdevkit_path, 'VOC2007/Annotations'))
    108. for image_id in image_ids:
    109. convert_label(VOCdevkit_path, image_id[:-4])
    110. print("Generate coco labels done")

    最终得到的文件情况:

     

    最后按照第一点说的,复制 配置文件并修改可以了

     4.训练参数的修改

    data指向自己的yaml文件,训练权重、epochs等按照自己的情况修改

     

     

  • 相关阅读:
    五、Spring Boot 整合持久层技术(5)
    Java 复习笔记 - 常用API 中
    ROS中关于时间的API
    Java 数据库改了一个字段, 前端传值后端接收为null问题解决
    Java项目:SSM水果蔬菜商城批发网站
    庖丁解牛:NIO核心概念与机制详解 06 _ 连网和异步 I/O
    使用RabbitMQ实现延迟关单功能
    ZooKeeper学习笔记
    # Vue3 toRef 和 toRefs 函数
    「零基础从零开始写VO视觉里程计」概率论、最小二乘、图优化(7-4)
  • 原文地址:https://blog.csdn.net/qq_52053775/article/details/125874044