• YOLOV5---自己数据集制作


    在网上找了一大圈YOLOV5数据集的制作,都没有合适的,不是流程太复杂就是给出的代码有问题。所以我在这里记录一下YOLOV5数据集简单的制作过程。

    首先一共要准备4样东西:

    准备材料

    • Annotations

      这里是标注信息,我用的是labelimg。

      Annotations内容

    • images

      存放了标注的图像,最好都是jpg格式的。

      images内容

    • split_train_val.py

    1. # coding:utf-8
    2. import os
    3. import random
    4. import argparse
    5. parser = argparse.ArgumentParser()
    6. #xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
    7. parser.add_argument('--xml_path', default=r'Annotations', type=str, help='input xml label path')
    8. #数据集的划分,没有这个文件夹的话,程序会自动创建
    9. parser.add_argument('--txt_path', default=r'ImageSets', type=str, help='output txt label path')
    10. opt = parser.parse_args()
    11. trainval_percent = 1.0
    12. train_percent = 0.9
    13. xmlfilepath = opt.xml_path
    14. txtsavepath = opt.txt_path
    15. total_xml = os.listdir(xmlfilepath)
    16. if not os.path.exists(txtsavepath):
    17. os.makedirs(txtsavepath)
    18. num = len(total_xml)
    19. list_index = range(num)
    20. tv = int(num * trainval_percent)
    21. tr = int(tv * train_percent)
    22. trainval = random.sample(list_index, tv)
    23. train = random.sample(trainval, tr)
    24. file_train = open(txtsavepath + '/train.txt', 'w')
    25. file_val = open(txtsavepath + '/val.txt', 'w')
    26. for i in list_index:
    27. name = total_xml[i][:-4] + '\n'
    28. if i in trainval:
    29. if i in train:
    30. file_train.write(name)
    31. else:
    32. file_val.write(name)
    33. file_train.close()
    34. file_val.close()
    • voc_label.py

    1. import xml.etree.ElementTree as ET
    2. import pickle
    3. import os
    4. from os import listdir, getcwd
    5. from os.path import join
    6. sets = ['train', 'val']
    7. classes = ["car", "person"] #根据自己的项目改
    8. def convert(size, box):
    9. dw = 1. / size[0]
    10. dh = 1. / size[1]
    11. x = (box[0] + box[1]) / 2.0
    12. y = (box[2] + box[3]) / 2.0
    13. w = box[1] - box[0]
    14. h = box[3] - box[2]
    15. x = x * dw
    16. w = w * dw
    17. y = y * dh
    18. h = h * dh
    19. return (x, y, w, h)
    20. def convert_annotation(image_id):
    21. in_file = open(r'Annotations/%s.xml' % (image_id), 'r', encoding="UTF-8")
    22. out_file = open(r'labels/%s.txt' % (image_id), 'w')
    23. tree = ET.parse(in_file)
    24. root = tree.getroot()
    25. size = root.find('size')
    26. w = int(size.find('width').text)
    27. h = int(size.find('height').text)
    28. for obj in root.iter('object'):
    29. difficult = obj.find('difficult').text
    30. cls = obj.find('name').text
    31. if cls not in classes or int(difficult) == 1:
    32. continue
    33. cls_id = classes.index(cls)
    34. xmlbox = obj.find('bndbox')
    35. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
    36. float(xmlbox.find('ymax').text))
    37. bb = convert((w, h), b)
    38. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    39. wd = getcwd()
    40. print(wd)
    41. for image_set in sets:
    42. if not os.path.exists('labels/'):
    43. os.makedirs('labels/')
    44. image_ids = open(r'ImageSets/%s.txt' % (image_set)).read().strip().split()
    45. list_file = open(r'%s.txt' % (image_set), 'w')
    46. for image_id in image_ids:
    47. list_file.write(r'C:/F/cardata/images/%s.jpg' % (image_id)) #写入绝对路径
    48. list_file.write('\n')
    49. convert_annotation(image_id)
    50. list_file.close()

    然后依次运行split_train_val.py和voc_label.py就行。
    注意:唯一2处需要改的就是voc_label.py我写了注释的地方。

  • 相关阅读:
    Python练习题:从列表中选取任意个元素求和
    手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
    计算机毕业设计ssm校内二手书籍交易系统的设计与实现an1k0系统+程序+源码+lw+远程部署
    软件架构设计
    SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(上)
    UNIX环境高级编程-第二章
    供应 JOSEF约瑟 跳位合位监视继电器 JZ-7GJ-S002XMC AC220V
    1、配置zabbix邮件报警和微信报警。 2、配置zabbix自动发现和自动注册。
    22湖北省赛 - J. Palindrome Reversion(回文,哈希拼接)
    C# 第六章『交互式图形界面』◆第2节:控件(2)ListView
  • 原文地址:https://blog.csdn.net/weixin_45892228/article/details/127863872