• yolov5数据集


    如果想跳过步骤直接获取YOLOv5格式的kitti数据集评论获取阿里云盘提取码

    我们再yolov5/dataset下创建文件夹kitti
    再kiiti中放入我们的数据

    数据集结构框架

    |——kitti
    ├── imgages
    │   ├── val
    │   │   └── 000000.png 
            ├── .......    
                      
    │   └── train
    │   │   └── 000000.png 
            ├── .......    
    │   
    └── labels
        └── train

    注意此时先不要把标签数据放入,我们需要对标签转换一下

    二、KITTI数据集转换
    我们打开标签中的一个内容
    比如000000.txt

    Pedestrian 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01
    

    这里是kitty独有的数据格式,不适用于我们的yolov5网络,所以我们得转换一下

    首先我们把类别归一一下,因为我们只需要用到三个类(代码中的路径自行修改)

    第一个脚本

    1. # modify_annotations_txt.py
    2. import glob
    3. import string
    4. txt_list = glob.glob('E:/datasets/yolov5-6.0/mydata/labels/train/*.txt') # 存储Labels文件夹所有txt文件路径 注意要保留/*
    5. print(txt_list)
    6. def show_category(txt_list):
    7. category_list= []
    8. for item in txt_list:
    9. try:
    10. with open(item) as tdf:
    11. for each_line in tdf:
    12. labeldata = each_line.strip().split(' ') # 去掉前后多余的字符并把其分开
    13. category_list.append(labeldata[0]) # 只要第一个字段,即类别
    14. except IOError as ioerr:
    15. print('File error:'+str(ioerr))
    16. print(set(category_list)) # 输出集合
    17. def merge(line):
    18. each_line=''
    19. for i in range(len(line)):
    20. if i!= (len(line)-1):
    21. each_line=each_line+line[i]+' '
    22. else:
    23. each_line=each_line+line[i] # 最后一条字段后面不加空格
    24. each_line=each_line+'\n'
    25. return (each_line)
    26. print('before modify categories are:\n')
    27. show_category(txt_list)
    28. for item in txt_list:
    29. new_txt=[]
    30. try:
    31. with open(item, 'r') as r_tdf:
    32. for each_line in r_tdf:
    33. labeldata = each_line.strip().split(' ')
    34. # if labeldata[0] in ['Truck','Van','Tram']: # 合并汽车类
    35. # labeldata[0] = labeldata[0].replace(labeldata[0],'Car')
    36. if labeldata[0] == 'Person_sitting': # 合并行人类
    37. labeldata[0] = labeldata[0].replace(labeldata[0],'Pedestrian')
    38. if labeldata[0] == 'DontCare': # 忽略Dontcare类
    39. continue
    40. if labeldata[0] == 'Misc': # 忽略Misc类
    41. continue
    42. new_txt.append(merge(labeldata)) # 重新写入新的txt文件
    43. with open(item,'w+') as w_tdf: # w+是打开原文件将内容删除,另写新内容进去
    44. for temp in new_txt:
    45. w_tdf.write(temp)
    46. except IOError as ioerr:
    47. print('File error:'+str(ioerr))
    48. print('\nafter modify categories are:\n')
    49. show_category(txt_list)

    然后我们再把它转换为xml文件
    创建一个Annotations文件夹用于存放xml

    第二个脚本

    1. # kitti_txt_to_xml.py
    2. # encoding:utf-8
    3. # 根据一个给定的XML Schema,使用DOM树的形式从空白文件生成一个XML
    4. from xml.dom.minidom import Document
    5. import cv2
    6. import glob
    7. import os
    8. def generate_xml(name,split_lines,img_size,class_ind):
    9. doc = Document() # 创建DOM文档对象
    10. annotation = doc.createElement('annotation')
    11. doc.appendChild(annotation)
    12. title = doc.createElement('folder')
    13. title_text = doc.createTextNode('KITTI')
    14. title.appendChild(title_text)
    15. annotation.appendChild(title)
    16. img_name=name+'.jpg'
    17. title = doc.createElement('filename')
    18. title_text = doc.createTextNode(img_name)
    19. title.appendChild(title_text)
    20. annotation.appendChild(title)
    21. source = doc.createElement('source')
    22. annotation.appendChild(source)
    23. title = doc.createElement('database')
    24. title_text = doc.createTextNode('The KITTI Database')
    25. title.appendChild(title_text)
    26. source.appendChild(title)
    27. title = doc.createElement('annotation')
    28. title_text = doc.createTextNode('KITTI')
    29. title.appendChild(title_text)
    30. source.appendChild(title)
    31. size = doc.createElement('size')
    32. annotation.appendChild(size)
    33. title = doc.createElement('width')
    34. title_text = doc.createTextNode(str(img_size[1]))
    35. title.appendChild(title_text)
    36. size.appendChild(title)
    37. title = doc.createElement('height')
    38. title_text = doc.createTextNode(str(img_size[0]))
    39. title.appendChild(title_text)
    40. size.appendChild(title)
    41. title = doc.createElement('depth')
    42. title_text = doc.createTextNode(str(img_size[2]))
    43. title.appendChild(title_text)
    44. size.appendChild(title)
    45. for split_line in split_lines:
    46. line=split_line.strip().split()
    47. if line[0] in class_ind:
    48. object = doc.createElement('object')
    49. annotation.appendChild(object)
    50. title = doc.createElement('name')
    51. title_text = doc.createTextNode(line[0])
    52. title.appendChild(title_text)
    53. object.appendChild(title)
    54. bndbox = doc.createElement('bndbox')
    55. object.appendChild(bndbox)
    56. title = doc.createElement('xmin')
    57. title_text = doc.createTextNode(str(int(float(line[4]))))
    58. title.appendChild(title_text)
    59. bndbox.appendChild(title)
    60. title = doc.createElement('ymin')
    61. title_text = doc.createTextNode(str(int(float(line[5]))))
    62. title.appendChild(title_text)
    63. bndbox.appendChild(title)
    64. title = doc.createElement('xmax')
    65. title_text = doc.createTextNode(str(int(float(line[6]))))
    66. title.appendChild(title_text)
    67. bndbox.appendChild(title)
    68. title = doc.createElement('ymax')
    69. title_text = doc.createTextNode(str(int(float(line[7]))))
    70. title.appendChild(title_text)
    71. bndbox.appendChild(title)
    72. # 将DOM对象doc写入文件
    73. f = open(r'D:\1\win10_yolov5_deepsort_counting-main\Annotations\labels\test\ '+name+'.xml','w')#xml要改这里
    74. f.write(doc.toprettyxml(indent = ''))
    75. f.close()
    76. if __name__ == '__main__':
    77. class_ind=('Pedestrian', 'Car', 'Cyclist')
    78. cur_dir=os.getcwd()
    79. labels_dir=os.path.join(cur_dir,r'D:\1\win10_yolov5_deepsort_counting-main\Annotations\labels\train') #要改这里
    80. # labels_dir=os.path.join(cur_dir,'label_2')
    81. for parent, dirnames, filenames in os.walk(labels_dir):# 分别得到根目录,子目录和根目录下文件
    82. for file_name in filenames:
    83. full_path=os.path.join(parent, file_name) # 获取文件全路径
    84. f=open(full_path)
    85. split_lines = f.readlines() #以行为单位读
    86. name= file_name[:-4] # 后四位是扩展名.txt,只取前面的文件名
    87. img_name=name+'.png'
    88. img_path=os.path.join(r'D:\1\win10_yolov5_deepsort_counting-main\Annotations\images\train',img_name) # 路径需要自行修改 改这里
    89. img_size=cv2.imread(img_path).shape
    90. generate_xml(name,split_lines,img_size,class_ind)
    91. print('txts has converted into xmls')

    这个时候我们已经将.txt转化为.xml并存放在Annotations下了

    最后我们再把.xml转化为适合于yolo训练的标签模式
    也就是darknet的txt格式
    例如:

    第三个脚本

    1. # xml_to_yolo_txt.py
    2. # 此代码和VOC_KITTI文件夹同目录
    3. import glob
    4. import xml.etree.ElementTree as ET
    5. # 这里的类名为我们xml里面的类名,顺序现在不需要考虑
    6. class_names = ['Car', 'Cyclist', 'Pedestrian']
    7. # xml文件路径
    8. path = r'D:\1\win10_yolov5_deepsort_counting-main\Annotations\labels\test\ ' #要改这里
    9. # 转换一个xml文件为txt
    10. def single_xml_to_txt(xml_file):
    11. tree = ET.parse(xml_file)
    12. root = tree.getroot()
    13. # 保存的txt文件路径
    14. txt_file = xml_file.split('.')[0]+'.'+xml_file.split('.')[1]+'.txt'
    15. with open(txt_file, 'w') as txt_file:
    16. for member in root.findall('object'):
    17. #filename = root.find('filename').text
    18. picture_width = int(root.find('size')[0].text)
    19. picture_height = int(root.find('size')[1].text)
    20. class_name = member[0].text
    21. # 类名对应的index
    22. class_num = class_names.index(class_name)
    23. box_x_min = int(member[1][0].text) # 左上角横坐标
    24. box_y_min = int(member[1][1].text) # 左上角纵坐标
    25. box_x_max = int(member[1][2].text) # 右下角横坐标
    26. box_y_max = int(member[1][3].text) # 右下角纵坐标
    27. print(box_x_max,box_x_min,box_y_max,box_y_min)
    28. # 转成相对位置和宽高
    29. x_center = float(box_x_min + box_x_max) / (2 * picture_width)
    30. y_center = float(box_y_min + box_y_max) / (2 * picture_height)
    31. width = float(box_x_max - box_x_min) / picture_width
    32. height = float(box_y_max - box_y_min) / picture_height
    33. print(class_num, x_center, y_center, width, height)
    34. txt_file.write(str(class_num) + ' ' + str(x_center) + ' ' + str(y_center) + ' ' + str(width) + ' ' + str(height) + '\n')
    35. # 转换文件夹下的所有xml文件为txt
    36. def dir_xml_to_txt(path):
    37. for xml_file in glob.glob(path + '*.xml'):
    38. single_xml_to_txt(xml_file)
    39. dir_xml_to_txt(path)

    最后我们将得到的Annotations/下的所有txt文件放入我们之前的dataset/labels中

     这样我们的数据集就准备好了
    接下来我们可以训练了,你们可以先了解怎么训练yolov5的步骤,训练步骤数据集标注(在线标注,方便快捷)/YOLOV5自建数据集_FYY2LHH的博客-CSDN博客_数据集标注网站

  • 相关阅读:
    【科研绘图】将echarts中的散点地图和热力地图融合到同一个地图上
    Kafka与Spark案例实践
    数据驭王: PostgreSQL教程指南解密
    Redis入门,Idea操作Redis
    如何为您的 Linux 服务器设置简单的 Grafana 云监控仪表板
    第六篇:强化学习策略迭代 通俗解释
    链表小题.Play Train AtCoder - abc225_d
    Git详细介绍 -入门到实战万字篇(上)
    Elasticsearch实战(五):Springboot实现Elasticsearch电商平台日志埋点与搜索热词
    自制操作系统日记(5):跳转到C语言执行
  • 原文地址:https://blog.csdn.net/m0_64346597/article/details/127814100