当前位置:   article > 正文

制作自己的Yolov7数据集【手把手教程】_yolov7自制数据集

yolov7自制数据集

一、制作标签文件

1、数据标注

使用labelimg(本文不进行讲解)进行数据标注,直接选择yolo数据集格式,之后将图片与标注好的标签文件(.txt)放在两个不同的文件夹中(默认行为)。

2、文件筛选

比对两个文件夹中的文件个数是否相同,正常来说txt文件夹中的文件应该比图片文件夹中的数量多一个。在txt文件夹中会有一个class.txt文件。

如果文件数量不符合上述,使用代码将具有相同名称的不同类型文件选出(图片对应的标签文件与图片名称相同,例如图片为1.jpg则标签文件为1.txt)。

使用下面代码将相同名称文件放入另一个文件夹:

  1. import os
  2. # 图片文件夹路径
  3. #img_folder = 'path_to_image_folder'
  4. img_folder = 'C://Users//Administrator//Desktop//abc//JPEGImages'
  5. # 文本文件夹路径
  6. #txt_folder = 'path_to_txt_folder'
  7. txt_folder = 'C://Users//Administrator//Desktop//abc//Annotations'
  8. # 存放相同文件名的文件夹路径
  9. output_folder = 'C://Users//Administrator//Desktop//abc//aaa'
  10. # 获取图片文件夹中的文件名(不包括扩展名)
  11. img_files = [os.path.splitext(file)[0] for file in os.listdir(img_folder)]
  12. # 获取txt文件夹中的文件名(不包括扩展名)
  13. txt_files = [os.path.splitext(file)[0] for file in os.listdir(txt_folder)]
  14. # 找出两个文件夹中文件名相同的文件
  15. common_files = set(img_files) & set(txt_files)
  16. # 输出相同文件名的文件到另一个文件夹
  17. for file in common_files:
  18.     img_path = os.path.join(img_folder, file + '.jpg')
  19.     txt_path = os.path.join(txt_folder, file + '.txt')
  20.     output_img_path = os.path.join(output_folder, file + '.jpg')
  21.     output_txt_path = os.path.join(output_folder, file + '.txt')
  22.    
  23.     # 移动文件
  24.     os.rename(img_path, output_img_path)
  25.     os.rename(txt_path, output_txt_path)
  26. print(f'共找到{len(common_files)}个相同文件名的文件,并已移动到{output_folder}文件夹中。')

二、划分数据集

1、建立文件夹

在你的yolov7项目文件夹中建立一个文件夹,我命名为adata

在adata中建立两个文件夹images和labels,分别用来存放划分后的图片和标签文件(不需要自己手动操作),使用如下代码:

            

  1. # 将图片和标注数据按比例切分为 训练集和测试集
  2. import shutil
  3. import random
  4. import os
  5. # 原始路径
  6. image_original_path = "E:/yolo/yolov7-main/adata/data/tp"
  7. label_original_path = "E:/yolo/yolov7-main/adata/data/txt"       # 该路径下不要有classes.txt
  8. cur_path = os.getcwd()
  9. # 训练集路径
  10. train_image_path = os.path.join(cur_path, "images/train/")
  11. train_label_path = os.path.join(cur_path, "labels/train/")
  12. # 验证集路径
  13. val_image_path = os.path.join(cur_path, "images/val/")
  14. val_label_path = os.path.join(cur_path, "labels/val/")
  15. # 测试集路径
  16. test_image_path = os.path.join(cur_path, "images/test/")
  17. test_label_path = os.path.join(cur_path, "labels/test/")
  18. # 训练集目录
  19. list_train = os.path.join(cur_path, "train.txt")
  20. list_val = os.path.join(cur_path, "val.txt")
  21. list_test = os.path.join(cur_path, "test.txt")
  22. train_percent = 0.8
  23. val_percent = 0.1
  24. test_percent = 0.1
  25. def del_file(path):
  26.     for i in os.listdir(path):
  27.         file_data = path + "\\" + i
  28.         os.remove(file_data)
  29. def mkdir():
  30.     if not os.path.exists(train_image_path):
  31.         os.makedirs(train_image_path)
  32.     else:
  33.         del_file(train_image_path)
  34.     if not os.path.exists(train_label_path):
  35.         os.makedirs(train_label_path)
  36.     else:
  37.         del_file(train_label_path)
  38.     if not os.path.exists(val_image_path):
  39.         os.makedirs(val_image_path)
  40.     else:
  41.         del_file(val_image_path)
  42.     if not os.path.exists(val_label_path):
  43.         os.makedirs(val_label_path)
  44.     else:
  45.         del_file(val_label_path)
  46.     if not os.path.exists(test_image_path):
  47.         os.makedirs(test_image_path)
  48.     else:
  49.         del_file(test_image_path)
  50.     if not os.path.exists(test_label_path):
  51.         os.makedirs(test_label_path)
  52.     else:
  53.         del_file(test_label_path)
  54. def clearfile():
  55.     if os.path.exists(list_train):
  56.         os.remove(list_train)
  57.     if os.path.exists(list_val):
  58.         os.remove(list_val)
  59.     if os.path.exists(list_test):
  60.         os.remove(list_test)
  61. def main():
  62.     mkdir()
  63.     clearfile()
  64.     file_train = open(list_train, 'w')
  65.     file_val = open(list_val, 'w')
  66.     file_test = open(list_test, 'w')
  67.     total_txt = os.listdir(label_original_path)
  68.     num_txt = len(total_txt)
  69.     list_all_txt = range(num_txt)
  70.     num_train = int(num_txt * train_percent)
  71.     num_val = int(num_txt * val_percent)
  72.     num_test = num_txt - num_train - num_val
  73.     train = random.sample(list_all_txt, num_train)
  74.     # train从list_all_txt取出num_train个元素
  75.     # 所以list_all_txt列表只剩下了这些元素
  76.     val_test = [i for i in list_all_txt if not i in train]
  77.     # 再从val_test取出num_val个元素,val_test剩下的元素就是test
  78.     val = random.sample(val_test, num_val)
  79.     print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
  80.     for i in list_all_txt:
  81.         name = total_txt[i][:-4]
  82.         srcImage = image_original_path + "/"+name + '.jpg'
  83.         srcLabel = label_original_path + "/"+name + ".txt"
  84.         if i in train:
  85.             dst_train_Image = train_image_path + "/"+name + '.jpg'
  86.             dst_train_Label = train_label_path + "/"+name + '.txt'
  87.             shutil.copyfile(srcImage, dst_train_Image)
  88.             shutil.copyfile(srcLabel, dst_train_Label)
  89.             file_train.write(dst_train_Image + '\n')
  90.         elif i in val:
  91.             dst_val_Image = val_image_path + "/"+name + '.jpg'
  92.             dst_val_Label = val_label_path + "/"+name + '.txt'
  93.             shutil.copyfile(srcImage, dst_val_Image)
  94.             shutil.copyfile(srcLabel, dst_val_Label)
  95.             file_val.write(dst_val_Image + '\n')
  96.         else:
  97.             dst_test_Image = test_image_path + "/"+name + '.jpg'
  98.             dst_test_Label = test_label_path + "/"+name + '.txt'
  99.             shutil.copyfile(srcImage, dst_test_Image)
  100.             shutil.copyfile(srcLabel, dst_test_Label)
  101.             file_test.write(dst_test_Image + '\n')
  102.     file_train.close()
  103.     file_val.close()
  104.     file_test.close()
  105. if __name__ == "__main__":
  106.     main()

2、划分后的文件夹

Images

每个文件夹中都有图片

Labels

同理每个文件夹中都有txt标签文件

除此之外在adata文件夹中还应该有三个txt文件用来存放图片路径

三个txt文件用来存放图片路径,如下图:

3、建立.yaml文件

代码如下:

  1. train: E:\yolo\yolov7-main\adata\train.txt
  2. val: E:\yolo\yolov7-main\adata\val.txt
  3. test: E:\yolo\yolov7-main\adata\test.txt
  4. ## leibie
  5. nc : 4
  6. # class names
  7. names : ["3A","2A","1A","0A"]   ## 0 , 1 , 2

到此可以直接将.yaml文件作为输入开始训练。

 如果使用该步骤建立数据集训练过程中遇到什么问题,可以私信博主,看到会及时回的,写作不易,烦请点个赞,点个关注一起学习进步。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/829424
推荐阅读
  

闽ICP备14008679号