YOLOv7目的检测数据集分别

[复制链接]
查看694 | 回复0 | 2023-8-23 11:56:54 | 显示全部楼层 |阅读模式
1.预备VOC数据集

        将全部数据集图片放入JPEGImages文件夹中,全部的图片对应的xml文件放入Annotations中,ImageSets文件夹中创建Main文件夹,临时Main文件夹为空。

 文件夹布局
  1. VOCdevkit
  2. ————VOC2007
  3.     ————Annotations  # 存放图片对应的xml文件,与JPEGImages图片一一对应
  4.     ————ImageSets
  5.          ————Main    # 存放train.txt和val.txt文件
  6.     ————JPEGImages   # 存放所有图片
复制代码


2.数据集分别

在 VOCdevkit 目次下创建split.py,运行之后会在 Main 文件夹下天生三个个txt文件:
train.txt、val.txt、test.txt
split.py
  1. # -*- coding: utf-8 -*-
  2. """
  3. Author:smile
  4. Date:2022/09/11 10:00
  5. 顺序:脚本A1
  6. 简介:分训练集、验证集和测试集,按照 8:1:1 的比例来分,训练集8,验证集1,测试集1
  7.      
  8. """
  9. import os
  10. import random
  11. import argparse
  12. parser = argparse.ArgumentParser()
  13. # xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
  14. parser.add_argument('--xml_path', default='VOCdevkit/VOC2007/Annotations', type=str, help='input xml label path')
  15. # 数据集的划分,地址选择自己数据下的ImageSets/Main
  16. parser.add_argument('--txt_path', default='VOCdevkit/VOC2007/ImageSets/Main', type=str, help='output txt label path')
  17. opt = parser.parse_args()
  18. train_percent = 0.8  # 训练集所占比例
  19. val_percent = 0.1    # 验证集所占比例
  20. test_persent = 0.1   # 测试集所占比例
  21. xmlfilepath = opt.xml_path
  22. txtsavepath = opt.txt_path
  23. total_xml = os.listdir(xmlfilepath)
  24. if not os.path.exists(txtsavepath):
  25.     os.makedirs(txtsavepath)
  26. num = len(total_xml)  
  27. list = list(range(num))
  28. t_train = int(num * train_percent)  
  29. t_val = int(num * val_percent)
  30. train = random.sample(list, t_train)
  31. num1 = len(train)
  32. for i in range(num1):
  33.     list.remove(train[i])
  34. val_test = [i for i in list if not i in train]
  35. val = random.sample(val_test, t_val)
  36. num2 = len(val)
  37. for i in range(num2):
  38.     list.remove(val[i])
  39. file_train = open(txtsavepath + '/train.txt', 'w')
  40. file_val = open(txtsavepath + '/val.txt', 'w')
  41. file_test = open(txtsavepath + '/test.txt', 'w')
  42. for i in train:
  43.     name = total_xml[i][:-4] + '\n'
  44.     file_train.write(name)
  45. for i in val:
  46.     name = total_xml[i][:-4] + '\n'
  47.     file_val.write(name)   
  48. for i in list:
  49.     name = total_xml[i][:-4] + '\n'
  50.     file_test.write(name)
  51.    
  52.    
  53. file_train.close()
  54. file_val.close()
  55. file_test.close()
复制代码
3. VOC转YOLO格式

        第2步只是把数据集分别了比例,想练习,还要举行这一步。在VOCdevkit目次下创建voc_label.py,点击运行,会在目次下天生新的labels文件夹,把数据集路径导入txt文件,将每个xml标注信息提取转换为了txt格式,每个图像对应一个txt文件。
  1. # -*- coding: utf-8 -*-
  2. import xml.etree.ElementTree as ET
  3. import os
  4. sets = ['train', 'val', 'test']  # 如果你的Main文件夹没有test.txt,就删掉'test'
  5. # classes = ["a", "b"]   # 改成自己的类别,VOC数据集有以下20类别
  6. classes = ["aeroplane", 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog',
  7.            'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']  # class names
  8. abs_path = os.getcwd()  
  9. def convert(size, box):
  10.     dw = 1. / (size[0])
  11.     dh = 1. / (size[1])
  12.     x = (box[0] + box[1]) / 2.0 - 1
  13.     y = (box[2] + box[3]) / 2.0 - 1
  14.     w = box[1] - box[0]
  15.     h = box[3] - box[2]
  16.     x = x * dw
  17.     w = w * dw
  18.     y = y * dh
  19.     h = h * dh
  20.     return x, y, w, h
  21. def convert_annotation(image_id):
  22.     in_file = open(abs_path + '/VOCdevkit/VOC2007/Annotations/%s.xml' % (image_id), encoding='UTF-8')
  23.     out_file = open(abs_path + '/VOCdevkit/VOC2007/labels/%s.txt' % (image_id), 'w')
  24.     tree = ET.parse(in_file)
  25.     root = tree.getroot()
  26.     size = root.find('size')
  27.     w = int(size.find('width').text)
  28.     h = int(size.find('height').text)
  29.     for obj in root.iter('object'):
  30.         difficult = obj.find('difficult').text
  31.         # difficult = obj.find('Difficult').text
  32.         cls = obj.find('name').text
  33.         if cls not in classes or int(difficult) == 1:
  34.             continue
  35.         cls_id = classes.index(cls)
  36.         xmlbox = obj.find('bndbox')
  37.         b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  38.              float(xmlbox.find('ymax').text))
  39.         b1, b2, b3, b4 = b
  40.         # 标注越界修正
  41.         if b2 > w:
  42.             b2 = w
  43.         if b4 > h:
  44.             b4 = h
  45.         b = (b1, b2, b3, b4)
  46.         bb = convert((w, h), b)
  47.         out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  48. for image_set in sets:
  49.     if not os.path.exists(abs_path + '/VOCdevkit/VOC2007/labels/'):
  50.         os.makedirs(abs_path + '/VOCdevkit/VOC2007/labels/')
  51.     image_ids = open(abs_path + '/VOCdevkit/VOC2007/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
  52.     list_file = open(abs_path + '/VOCdevkit/VOC2007/%s.txt' % (image_set), 'w')
  53.     for image_id in image_ids:
  54.         list_file.write(abs_path + '/VOCdevkit/VOC2007/JPEGImages/%s.jpg\n' % (image_id))  # 要么自己补全路径,只写一半可能会报错
  55.         convert_annotation(image_id)
  56.     list_file.close()
复制代码
运行之后,会在VOC2007目次下天生 labels文件夹和3个新的.txt文件

 此中,新天生的3个的train.txt、val.txt、test.txt,这正是反面练习必要用的文件。每个txt文件里面存放的图片的文件名全路径:


4.练习预备


1.创建自己数据集的 yaml 文件
找到文件夹 data , 在data 文件夹中创建自己数据集的 mydata.yaml 文件
train  val   test :  三个txt的路径(注意冒号后要有一个空格)
nc : 自己数据集种别个数
names: 数据集种别名字

2.修改练习 yolov7 的 yaml 文件
cfg/training 文件夹中,选择想要使用的 yaml 文件,将文件中的 nc 改为自己数据集的种别数

3. 修改datasets.py文件
做完以上步调,若直接开始练习,会报错:
  1. AssertionError: train: No labels in 2007_train.cache. Can not train without labels
复制代码
办理方法:
找到  utils/dataset.py 文件,搜刮框搜刮 Define label,将下图赤色线处内容修改为’JPEGImages’。原本yolov7 代码这里是’images’,但VOC是把图片生存在JPEGImages下的,以是必要修改方能精确读取图片。



5. 开始练习

练习的时间 train 和 val 数据集都会使用到,验证集 test 在下一步使用
weights : 预练习权重位置
cfg : 上一部分修改的 yolov7.yaml 文件位置
data : 上一部分修改的数据集 yaml 文件位置
hyp :练习所需超参数位置,可以不消修改
epochs : 想要练习的轮数
batch-size : 步距,必要显存,过大大概报错



6.使用 test.py

当练习完之后想要使用测试集(test)举行测试的时间,找到  test.py
weights : 自己练习完之后天生的权重位置
data : 同练习时使用的一样(自己数据集的 yaml)
task : 改为 test


参考:yolov5练习—VOC数据集分别(练习集、验证集、测试集)和转换YOLO格式_目的检测_下雨天不下雨-DevPress官方社区 (csdn.net)

来源:https://blog.csdn.net/qq_44177768/article/details/129799520
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则