VOC格式数据集转yolo格式

一、VOC格式

在这里插入图片描述

二、yolo格式

在这里插入图片描述

三、VOC转yolo格式

将已经下载好的VOC数据集图片全放在JPEGImages文件夹里面,如果想要VOC所有的数据集,就将其他版本的数据集拷贝进来(比如我是将VOC2007的所有数据集拷贝了进来),xml文件放到Annotations文件夹下
  1. 目录机构
    在这里插入图片描述
  2. 注意如果有其他拷贝进来的数据集,要将main文件夹下的train.txt、val.txt、trainval.txt、test.txt全部合并。
  3. main.py代码
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = [('2012', 'train'), ('2012', 'val'), ('2012', 'test')]

classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus",
           "car", "cat", "chair", "cow", "diningtable", "dog", "horse",
           "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml' % (year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt' % (year, image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text),
             float(xmlbox.find('xmax').text),
             float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/' % (year)):
        os.makedirs('VOCdevkit/VOC%s/labels/' % (year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'
                     % (year, image_set)).read().strip().split()

    list_file = open('%s_%s.txt' % (year, image_set), 'w')

    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'
                        % (wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

  1. 注意核对自己的路径
    在这里插入图片描述
  2. 运行程序之后的目录结构
    会多出来一个文件夹+四个文件
    在这里插入图片描述
    labels下面是所有的VOC转化为yolo之后的txt文件
    2012_test.txt、2012_train.txt、2012_val.txt里面存放的是测试集、训练集、验证集的图片存放路径
    在这里插入图片描述

注:本文是参考这篇博客的基础上自己写的文章,感兴趣的朋友也可以看看

另外:

只讲xml格式转换为yolo格式(文件名是xml的文件名)

import re
import os


def to_one(name_list, xmin, ymin, xmax, ymax, width, height, name):
    data = []
    num = 0
    for x1, y1, x2, y2 in zip(xmin, ymin, xmax, ymax):
        x1 = float(x1)
        y1 = float(y1)
        x2 = float(x2)
        y2 = float(y2)
        w1 = float(width[0])
        h1 = float(height[0])

        x = (x2 - x1) / 2 + x1
        y = (y2 - y1) / 2 + y1
        w = x2 - x1
        h = y2 - y1
        x = x / w1
        y = y / h1
        w = w / w1
        h = h / h1
        data.append(' '.join([str(num), str(x), str(y), str(w), str(h),'\n']))
     #   num += 1
    # print(data)
    with open("%s.txt" % name, 'w') as f:
        f.writelines(data)


def xml_to_yolo(path):
    files_list = os.listdir(path)
    files_path = []
    for file in files_list:
        files_path.append(os.path.join(path, file))
    for file in files_path:
        with open(file, 'r') as f:
            data = f.read()
            name_list = re.findall('<name>(.*?)</name>', data)
            xmin = re.findall('<xmin>(.*?)</xmin>', data)
            ymin = re.findall('<ymin>(.*?)</ymin>', data)
            xmax = re.findall('<xmax>(.*?)</xmax>', data)
            ymax = re.findall('<ymax>(.*?)</ymax>', data)
            width = re.findall('<width>(.*?)</width>', data)
            height = re.findall('<height>(.*?)</height>', data)
            to_one(name_list, xmin, ymin, xmax, ymax, width, height,file.split('\\')[6].split('.')[0])

def make_dir():
    if os.path.exists('.//lables'):
        os.chdir(".//lables")
    else:
        os.makedirs(".//lables")
        os.chdir(".//lables")


if __name__ == '__main__':
    i = 1
    make_dir()
    xml_to_yolo('E:\\pythonProject\\pascalVOC2yolov5\\VOCdevkit\\VOC2012\\Annotations')
    print('完成')
  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 将Java voc格式数据集换为Yolo(Darknet)格式,可以按照以下步骤进行操作: 1. 首先,需要了解VOC格式Yolo(Darknet)格式数据集结构和标注方式。 2. VOC格式通常包含一个XML文件夹,其中包含每个图像的XML文件和图像文件。每个XML文件中包含图像的宽度、高度以及在图像中的目标位置和类别信息。 3. 使用Java解析每个XML文件,提取出图像的宽度、高度和目标位置信息。 4. 将目标位置信息换为Yolo格式的位置信息。Yolo使用相对于图像宽度和高度的相对坐标来表示目标位置。需要使用以下公式将绝对坐标换为相对坐标: x_center = (xmin + xmax) / (2 * width) y_center = (ymin + ymax) / (2 * height) obj_width = (xmax - xmin) / width obj_height = (ymax - ymin) / height 其中,(xmin, ymin) 和 (xmax, ymax) 是目标框的左上角和右下角坐标,width 和 height 是图像的宽度和高度。 5. 根据目标类别信息,将Yolo格式的位置信息和类别信息写入Yolo格式的文本文件。Yolo格式的文本文件的每一行表示一个目标,并包含目标类别以及其在图像中的位置。 6. 重复步骤3-5,直到处理完所有的XML文件。 7. 最后,将换后的Yolo格式的文本文件和VOC格式的图像文件一起使用Yolo训练工具进行训练。 以上是将Java voc格式数据集换为Yolo(Darknet)格式的基本步骤。根据具体的实际需求,可能还需要进行一些额外的处理或修改。 ### 回答2: 要将Java voc格式数据集换为Yolo(Darknet)格式,可以按照以下步骤进行: 1. 确保你已经有了Java voc格式数据集,该数据集通常包含图像和相应的XML文件,每个XML文件中都包含有关图像中对象的位置和类别的信息。 2. 创建一个新的文件夹,用于存储换后的Yolo格式数据集。 3. 使用Java代码读取voc数据集中的XML文件,并解析其中的信息,获取对象的类别和边界框的位置。 4. 将解析得到的类别和边界框的信息换为Yolo格式的标注。Yolo格式的标注通常包含一个txt文件,每行表示一个对象的标注信息,包括类别的编号和边界框的归一化坐标(即左上角和右下角像素坐标除以图像宽度和高度)。 5. 将换后的Yolo格式的标注信息写入txt文件中,并将txt文件保存在新创建的文件夹中,与对应的图像文件放在同一目录下。 6. 重复步骤3至5,将所有图像的标注信息都换为Yolo格式的标注并保存。 7. 最后,将新创建的文件夹中的所有图像和标注文件复制到Darknet的数据集目录中,以便可以在训练或测试过程中使用。 通过以上步骤,你就可以将Java voc格式数据集成功换为Yolo(Darknet)格式数据集,以便用于目标检测任务。 ### 回答3: 将Java VOС格式数据集换为Yolo(darknet)格式,可以按照以下步骤进行操作: 1. 首先,了解Java VOC格式数据集。Java VOC(Visual Object Classes)是一种常用的图像数据集格式,用于物体检测任务。它由一个包含图像和标注信息的文件夹组成,标注信息通常为XML格式。 2. 确定Yolo(darknet)格式的要求。Yolo(darknet)是一种基于深度学习的物体检测框架,它要求数据集以特定的格式存储。Yolo(darknet)要求每个图像的标注信息存储在一个对应的txt文件中,每行包含一个目标的类别和边界框的坐标。 3. 开发一个Java程序来将Java VOC格式数据集换为Yolo(darknet)格式。可以使用Java的文件操作功能,按照以下步骤进行换: - 遍历Java VOC数据集的每个图像和对应的XML标注文件。 - 解析XML文件,提取目标的类别和边界框的坐标。 - 根据Yolo(darknet)格式的要求,将类别和边界框的坐标换为对应的格式,写入一个新的txt文件。 - 将新生成的txt文件与对应的图像放入Yolo(darknet)数据集文件夹中。 4. 运行该Java程序,并确保数据集中的所有图像都被成功换为Yolo(darknet)格式。可以逐个检查换后的txt文件,确保其格式正确且与图像对应。 通过以上步骤,您可以将Java VOC格式数据集换为Yolo(darknet)格式,以供Yolo(darknet)框架进行物体检测训练和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值