学习资源站

04-手把手教你划分自己的数据集_yolov5划分数据集yolo数据类型

YOLOv5入门实践(3)——手把手教你划分自己的数据集

一、训练集、测试集、验证集介绍

我们通常把训练的数据分为三个文件夹:训练集、测试集和验证集

我们来举一个栗子:模型的训练与学习,类似于老师教学生学知识的过程。

  • 1、训练集(train set):用于训练模型以及确定参数。相当于老师教学生知识的过程。
  • 2、验证集(validation set):用于确定网络结构以及调整模型的超参数。相当于月考等小测验,用于学生对学习的查漏补缺。
  • 3、测试集(test set):用于检验模型的泛化能力。相当于大考,上战场一样,真正的去检验学生的学习效果。

参数(parameters):指由模型通过学习得到的变量,如权重和偏置。

超参数(hyperparameters):指根据经验进行设定的参数,如迭代次数,隐层的层数,每层神经元的个数,学习率等。

c3c37c4064974a2e80dcf4562ae12c1e.png


二、准备自己的数据集

第1步:在YOLOv5项目下创建对应文件夹

在YOLOv5项目目录下创建datasets文件夹(名字自定义),接着在该文件夹下新建Annotationsimages文件夹。

  • Annotations:存放标注的标签文件
  • images:存放需要打标签的图片文件

如下图所示: 

d7e1c690a8e24881b7eb2fbf2729159f.png


 第2步:打开labelimg开始标注数据集

使用教程可以看我的上一篇介绍:

标注后Annotations文件夹下面为xml文件,如下图所示:

546910e49f3949a88ff751f9831f87c8.png

 images文件夹是我们的数据集图片,格式为jpg,如下图所示: 24d94e63b33743f38de229c22405e26e.png


第3步:创建保存划分后数据集的文件夹

创建一个名为ImageSets的文件夹(名字自定义),用来保存一会儿划分好的训练集、测试集和验证集。

9f2b4dafef2040ba84bea9abfe60b465.png


 准备工作的注意事项:

  • 所有训练所需的图像存于一个目录,所有训练所需的标签存于一个目录。
  • 图像文件与标签文件都统一的格式。
  • 图像名与标签名一一对应。

三、划分的代码及讲解

完成以上工作我们就可以来进行数据集的划分啦!

第1步:创建split.py 

在YOLOv5项目目录下创建split.py项目。

43186ecef51c4280854e08583a036ce2.png


第2步:将数据集打乱顺序

通过上面我们知道,数据集有imagesAnnotations这两个文件,我们需要把这两个文件绑定,然后将其打乱顺序。
首先设置空列表,将for循环读取这两个文件的每个数据放入对应表中,再将这两个文件通过zip()函数绑定,计算总长度。

  1. def split_data(file_path,xml_path, new_file_path, train_rate, val_rate, test_rate):
  2. each_class_image = []
  3. each_class_label = []
  4. for image in os.listdir(file_path):
  5. each_class_image.append(image)
  6. for label in os.listdir(xml_path):
  7. each_class_label.append(label)
  8. data=list(zip(each_class_image,each_class_label))
  9. total = len(each_class_image)

然后用random.shuffle()函数打乱顺序,再将两个列表解绑。

  1. random.shuffle(data)
  2. each_class_image,each_class_label=zip(*data)

第3步:按照确定好的比例将两个列表元素分割

分别获取train、val、test这三个文件夹对应的图片和标签。

  1. train_images = each_class_image[0:int(train_rate * total)]
  2. val_images = each_class_image[int(train_rate * total):int((train_rate + val_rate) * total)]
  3. test_images = each_class_image[int((train_rate + val_rate) * total):]
  4. train_labels = each_class_label[0:int(train_rate * total)]
  5. val_labels = each_class_label[int(train_rate * total):int((train_rate + val_rate) * total)]
  6. test_labels = each_class_label[int((train_rate + val_rate) * total):]

第4步:在本地生成文件夹,将划分好的数据集分别保存

接下来就是设置相应的路径保存格式,将图片和标签对应保存下来。

  1. for image in train_images:
  2. print(image)
  3. old_path = file_path + '/' + image
  4. new_path1 = new_file_path + '/' + 'train' + '/' + 'images'
  5. if not os.path.exists(new_path1):
  6. os.makedirs(new_path1)
  7. new_path = new_path1 + '/' + image
  8. shutil.copy(old_path, new_path)
  9. for label in train_labels:
  10. print(label)
  11. old_path = xml_path + '/' + label
  12. new_path1 = new_file_path + '/' + 'train' + '/' + 'labels'
  13. if not os.path.exists(new_path1):
  14. os.makedirs(new_path1)
  15. new_path = new_path1 + '/' + label
  16. shutil.copy(old_path, new_path)
  17. for image in val_images:
  18. old_path = file_path + '/' + image
  19. new_path1 = new_file_path + '/' + 'val' + '/' + 'images'
  20. if not os.path.exists(new_path1):
  21. os.makedirs(new_path1)
  22. new_path = new_path1 + '/' + image
  23. shutil.copy(old_path, new_path)
  24. for label in val_labels:
  25. old_path = xml_path + '/' + label
  26. new_path1 = new_file_path + '/' + 'val' + '/' + 'labels'
  27. if not os.path.exists(new_path1):
  28. os.makedirs(new_path1)
  29. new_path = new_path1 + '/' + label
  30. shutil.copy(old_path, new_path)
  31. for image in test_images:
  32. old_path = file_path + '/' + image
  33. new_path1 = new_file_path + '/' + 'test' + '/' + 'images'
  34. if not os.path.exists(new_path1):
  35. os.makedirs(new_path1)
  36. new_path = new_path1 + '/' + image
  37. shutil.copy(old_path, new_path)
  38. for label in test_labels:
  39. old_path = xml_path + '/' + label
  40. new_path1 = new_file_path + '/' + 'test' + '/' + 'labels'
  41. if not os.path.exists(new_path1):
  42. os.makedirs(new_path1)
  43. new_path = new_path1 + '/' + label
  44. shutil.copy(old_path, new_path)

  • file_path:图片所在位置,就是image文件夹
  • xml_path:标签所在位置,就是Annotation文件夹
  • new_file_path:划分后三个文件的保存位置,就是ImageSets文件夹
  1. if __name__ == '__main__':
  2. file_path = "D:\yolov5-6.1\datasets\image"
  3. xml_path = "D:\yolov5-6.1\datasets\Annotation"
  4. new_file_path = "D:\yolov5-6.1\datasets\ImageSets"
  5. split_data(file_path,xml_path, new_file_path, train_rate=0.7, val_rate=0.1, test_rate=0.2)

  1. import os
  2. import shutil
  3. import random
  4. random.seed(0)
  5. def split_data(file_path,xml_path, new_file_path, train_rate, val_rate, test_rate):
  6. each_class_image = []
  7. each_class_label = []
  8. for image in os.listdir(file_path):
  9. each_class_image.append(image)
  10. for label in os.listdir(xml_path):
  11. each_class_label.append(label)
  12. data=list(zip(each_class_image,each_class_label))
  13. total = len(each_class_image)
  14. random.shuffle(data)
  15. each_class_image,each_class_label=zip(*data)
  16. train_images = each_class_image[0:int(train_rate * total)]
  17. val_images = each_class_image[int(train_rate * total):int((train_rate + val_rate) * total)]
  18. test_images = each_class_image[int((train_rate + val_rate) * total):]
  19. train_labels = each_class_label[0:int(train_rate * total)]
  20. val_labels = each_class_label[int(train_rate * total):int((train_rate + val_rate) * total)]
  21. test_labels = each_class_label[int((train_rate + val_rate) * total):]
  22. for image in train_images:
  23. print(image)
  24. old_path = file_path + '/' + image
  25. new_path1 = new_file_path + '/' + 'train' + '/' + 'images'
  26. if not os.path.exists(new_path1):
  27. os.makedirs(new_path1)
  28. new_path = new_path1 + '/' + image
  29. shutil.copy(old_path, new_path)
  30. for label in train_labels:
  31. print(label)
  32. old_path = xml_path + '/' + label
  33. new_path1 = new_file_path + '/' + 'train' + '/' + 'labels'
  34. if not os.path.exists(new_path1):
  35. os.makedirs(new_path1)
  36. new_path = new_path1 + '/' + label
  37. shutil.copy(old_path, new_path)
  38. for image in val_images:
  39. old_path = file_path + '/' + image
  40. new_path1 = new_file_path + '/' + 'val' + '/' + 'images'
  41. if not os.path.exists(new_path1):
  42. os.makedirs(new_path1)
  43. new_path = new_path1 + '/' + image
  44. shutil.copy(old_path, new_path)
  45. for label in val_labels:
  46. old_path = xml_path + '/' + label
  47. new_path1 = new_file_path + '/' + 'val' + '/' + 'labels'
  48. if not os.path.exists(new_path1):
  49. os.makedirs(new_path1)
  50. new_path = new_path1 + '/' + label
  51. shutil.copy(old_path, new_path)
  52. for image in test_images:
  53. old_path = file_path + '/' + image
  54. new_path1 = new_file_path + '/' + 'test' + '/' + 'images'
  55. if not os.path.exists(new_path1):
  56. os.makedirs(new_path1)
  57. new_path = new_path1 + '/' + image
  58. shutil.copy(old_path, new_path)
  59. for label in test_labels:
  60. old_path = xml_path + '/' + label
  61. new_path1 = new_file_path + '/' + 'test' + '/' + 'labels'
  62. if not os.path.exists(new_path1):
  63. os.makedirs(new_path1)
  64. new_path = new_path1 + '/' + label
  65. shutil.copy(old_path, new_path)
  66. if __name__ == '__main__':
  67. file_path = "D:\yolov5-6.1\datasets\image"
  68. xml_path = "D:\yolov5-6.1\datasets\Annotation"
  69. new_file_path = "D:\yolov5-6.1\datasets\ImageSets"
  70. split_data(file_path,xml_path, new_file_path, train_rate=0.7, val_rate=0.1, test_rate=0.2)