• yolov7--制作自己的数据集(VOC转YOLO)


    1. 数据集的制作

    1.1 labelimg安装

    ​ 1.1.1 创建虚拟环境

    ​ 学习计算机视觉,标注工具会与你形影不离,因此我建议将其安装在独立的环境中,便于查找。

    # 查看当前已有的虚拟环境
    conda env list
    # 创建
    conda create - n env_name python=x.x   # env_name: 虚拟环境的名称  python=...:指定python的版本
    #激活虚拟环境
    conda activate env_name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.1.2 激活虚拟环境

    所示的就是我创建的虚拟环境啦:
    在这里插入图片描述

    ​ 1.1.3 安装 labelimg

    pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1

    1.2 labelimg的使用

    ​ 1.2.1 使用

    1. 在刚才创建的虚拟环境中输入labelimg —>回车–>弹出界面

    1.2.1 文件夹的创建

    在这里插入图片描述

    ​ 1.2.2 工具的使用

    ​ 1.2.2.1 文件夹对应

    在这里插入图片描述

    ​ 1.2.2.2 标注

    在这里插入图片描述
    在这里插入图片描述

    2. 数据集转换,VOC转换成YOLO格式

    2.1 xml 文件转换成txt格式

    ​ 代码测试过了,直接复制用就好了
    在这里插入图片描述

    import os.path
    import xml.etree.ElementTree as ET
    
    #1. 将这个地方改成自己类别的列表
    class_names = ['plate']
    # 2. 将路径修改
    xmlpath = r'.....'  # 原xml路径
    txtpath = r'......'  # 转换后txt文件存放路径
    
    
    files = []
    if not os.path.exists(txtpath):
        os.makedirs(txtpath)
     
    for root, dirs, files in os.walk(xmlpath):
        None
     
    number = len(files)
    print(number)
    i = 0
    while i < number:
     
        name = files[i][0:-4]
        xml_name = name + ".xml"
        txt_name = name + ".txt"
        xml_file_name = xmlpath + xml_name
        txt_file_name = txtpath + txt_name
     
        xml_file = open(xml_file_name)
        tree = ET.parse(xml_file)
        root = tree.getroot()
        # filename = root.find('name').text
     
        # image_name = root.find('filename').text
        w = int(root.find('size').find('width').text)
        h = int(root.find('size').find('height').text)
     
        f_txt = open(txt_file_name, 'w+')
        content = ""
     
        first = True
     
        for obj in root.iter('object'):
     
            name = obj.find('name').text
            class_num = class_names.index(name)
            # class_num = 0
     
            xmlbox = obj.find('bndbox')
     
            x1 = int(xmlbox.find('xmin').text)
            x2 = int(xmlbox.find('xmax').text)
            y1 = int(xmlbox.find('ymin').text)
            y2 = int(xmlbox.find('ymax').text)
     
            if first:
                content += str(class_num) + " " + \
                           str((x1 + x2) / 2 / w) + " " + str((y1 + y2) / 2 / h) + " " + \
                           str((x2 - x1) / w) + " " + str((y2 - y1) / h)
                first = False
            else:
                content += "\n" + \
                           str(class_num) + " " + \
                           str((x1 + x2) / 2 / w) + " " + str((y1 + y2) / 2 / h) + " " + \
                           str((x2 - x1) / w) + " " + str((y2 - y1) / h)
     
        # print(str(i / (number - 1) * 100) + "%\n")
        print(content)
        f_txt.write(content)
        f_txt.close()
        xml_file.close()
        i += 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    在这里插入图片描述

    2.2 train与val的划分

    1. 修改路径
    2. 修改训练/验证集的比例在这里插入图片描述
     
    import os
    import random 
    random.seed(0)
    # 1. 将路径修改为自己的
    xmlfilepath=r'E:\yolov7-main\VOC2007\Annotations'
    saveBasePath=r'E:\yolov7-main\VOC2007\ImageSets\Main/'
     
    #----------------------------------------------------------------------#
    #   想要增加测试集修改trainval_percent
    #   train_percent不需要修改
    #----------------------------------------------------------------------#
    trainval_percent = 1
    train_percent = 0.8
     
    temp_xml = os.listdir(xmlfilepath)
    total_xml = []
    for xml in temp_xml:
        if xml.endswith(".xml"):
            total_xml.append(xml)
     
    num=len(total_xml)  
    list=range(num)  
    tv=int(num*trainval_percent)  
    tr=int(tv*train_percent)  
    trainval= random.sample(list,tv)  
    train=random.sample(trainval,tr)  
     
    print("train and val size",tv)
    print("traub suze",tr)
    ftrainval = open(os.path.join(saveBasePath,'trainval.txt'), 'w')  
    ftest = open(os.path.join(saveBasePath,'test.txt'), 'w')  
    ftrain = open(os.path.join(saveBasePath,'train.txt'), 'w')  
    fval = open(os.path.join(saveBasePath,'val.txt'), 'w')  
     
    for i  in list:  
        name=total_xml[i][:-4]+'\n'  
        if i in trainval:  
            ftrainval.write(name)  
            if i in train:  
                ftrain.write(name)  
            else:  
                fval.write(name)  
        else:  
            ftest.write(name)  
      
    ftrainval.close()  
    ftrain.close()  
    fval.close()  
    ftest .close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    2.3 复制出图片和标签

    ​ 按照train.txt,val.txt,将图片和txt文件,分别复制到labels和images中
    1 . 路径名称
    2. .jpg 或者.png 修改成自己对应的就可以了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    import os
    import shutil
    from tqdm import tqdm
     
    SPLIT_PATH = r"E:\yolov7-main\VOC2007\ImageSets\Main"
    IMGS_PATH = r"E:\yolov7-main\VOC2007\JPEGImages"
    TXTS_PATH = r"E:\yolov7-main\VOC2007\txts"
     
    TO_IMGS_PATH = r'E:\yolov7-main\yolov7-main\lesion\images'
    TO_TXTS_PATH =r'E:\yolov7-main\yolov7-main\lesion\labels'
     
    data_split = ['train.txt', 'val.txt']
    to_split = ['train2007', 'val2007']
     
    for index, split in enumerate(data_split):
        split_path = os.path.join(SPLIT_PATH, split)
     
        to_imgs_path = os.path.join(TO_IMGS_PATH, to_split[index])
        if not os.path.exists(to_imgs_path):
            os.makedirs(to_imgs_path)
     
        to_txts_path = os.path.join(TO_TXTS_PATH, to_split[index])
        if not os.path.exists(to_txts_path):
            os.makedirs(to_txts_path)
     
        f = open(split_path, 'r')
        count = 1
     
        for line in tqdm(f.readlines(), desc="{} is copying".format(to_split[index])):
            # 复制图片
            src_img_path = os.path.join(IMGS_PATH, line.strip() + '.png')
            dst_img_path = os.path.join(to_imgs_path, line.strip() + '.png')
            if os.path.exists(src_img_path):
                shutil.copyfile(src_img_path, dst_img_path)
            else:
                print("error file: {}".format(src_img_path))
     
            # 复制txt标注文件
            src_txt_path = os.path.join(TXTS_PATH, line.strip() + '.txt')
            dst_txt_path = os.path.join(to_txts_path, line.strip() + '.txt')
            if os.path.exists(src_txt_path):
                shutil.copyfile(src_txt_path, dst_txt_path)
            else:
                print("error file: {}".format(src_txt_path))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    2.4 文件夹排布

    在这里插入图片描述

  • 相关阅读:
    MySQL进阶
    java毕业生设计员工健康检测系统计算机源码+系统+mysql+调试部署+lw
    第三章-Mybatis源码解析-以xml方式走流程-mapper解析(四)
    mfc入门基础(六)创建模态对话框与非模态对话框
    Linux开发讲课16--- 【内存管理】页表映射基础知识2
    Java反射机制基本概念与相关Class类对反射机制的实现
    累计注意力大模型
    恶意攻击和可解释性
    云扩RPA携手中联教育引领财务机器人教学创新
    UMLChina建模竞赛第3赛季第11轮:啪啪啪啪运指如飞
  • 原文地址:https://blog.csdn.net/weixin_45837625/article/details/127697364