Win10环境下,将VOC数据集转为YOLOV5使用的数据集。

简介: Win10环境下,将VOC数据集转为YOLOV5使用的数据集。

YOLOV5 采用的数据集和以前的yolo模型不一样,数据结构如下图:

tt.png

images文件夹存放train和val的图片

labels里面存放train和val的物体数据,里面的每个txt文件和images里面的图片是一一对应的。

txt文件的内容如下:


tt.png


格式:物体类别 x y w h  


坐标是不是真实的坐标,是将坐标除以宽高后的计算出来的,是相对于宽和高的比例。


数据介绍完了,下面讲如何将voc数据转为yolov5使用的数据集。


本次采用的数据集是PASCAL VOC 2007。


地址:


训练集和验证集:


http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

测试集:

http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

下载后解压,将测试集和训练集合并在一起。在YOLOV5工程下面新建tmp文件夹,然后将voc数据集放到tmp文件夹下面,如图:


在tmp文件夹下面新家voc2txt.py文件,将voc的数据转为txt数据。


讲解voc2txt.py代码:


导入包:


import xml.etree.ElementTree as ET


import os


from os import getcwd


列出数据集的类别:


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


classes = ["aeroplane", "bicycle", "bird", "boat", "bottle",


          "bus", "car", "cat", "chair", "cow", "diningtable", "dog",


          "horse", "motorbike", "person", "pottedplant", "sheep",


          "sofa", "train", "tvmonitor"]


对box进行转换,转换后的坐标就是相对长宽的小数:


def convert(size, box):


   dw = 1./(size[0])


   dh = 1./(size[1])


   x = (box[0] + box[1])/2.0 - 1


   y = (box[2] + box[3])/2.0 - 1


   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)


下面这个方法是获取单个xml的内容,将其转换。


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')


整体代码如下:


import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = [('2007', 'train'), ('2007', 'val'), ('2007', '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 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    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.txt' % 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()

运行完成后会生成test.txt  train.txt  val.txt。如图:

tt.png

在tmp文件夹新建makedata.py,将生成的中间结果转为YOLOV5所使用的最终代码。

代码如下:

1.import shutil
import os
file_List = ["train", "val", "test"]
for file in file_List:
    if not os.path.exists('../VOC/images/%s' % file):
        os.makedirs('../VOC/images/%s' % file)
    if not os.path.exists('../VOC/labels/%s' % file):
        os.makedirs('../VOC/labels/%s' % file)
    print(os.path.exists('../tmp/%s.txt' % file))
    f = open('../tmp/%s.txt' % file, 'r')
    lines = f.readlines()
    for line in lines:
        print(line)
        line = "/".join(line.split('/')[-5:]).strip()
        shutil.copy(line, "../VOC/images/%s" % file)
        line = line.replace('JPEGImages', 'labels')
        line = line.replace('jpg', 'txt')
        shutil.copy(line, "../VOC/labels/%s/" % file)


执行完成后,会在yolov5工程下生成最终的数据集。


tt.png

目录
相关文章
|
XML 存储 数据格式
【30】yolov5的数据集准备 | 处理Pascal voc格式的数据集
【30】yolov5的数据集准备 | 处理Pascal voc格式的数据集
901 0
【30】yolov5的数据集准备 | 处理Pascal voc格式的数据集
|
Ubuntu 测试技术 Linux
Ubuntu登录root账号以及修改密码
Ubuntu登录root账号以及修改密码
|
9月前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
在智慧交通和智能驾驶日益普及的今天,准确识别复杂交通场景中的关键元素已成为自动驾驶系统的核心能力之一。传统的图像处理技术难以适应高动态、复杂天气、多目标密集的交通环境,而基于深度学习的目标检测算法,尤其是YOLO(You Only Look Once)系列,因其检测速度快、精度高、可部署性强等特点,在交通场景识别中占据了重要地位。
1024 0
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
|
计算机视觉
YOLOv11改进策略【小目标改进】| 2024-TOP 自适应阈值焦点损失(ATFL)提升对小目标的检测能力
YOLOv11改进策略【小目标改进】| 2024-TOP 自适应阈值焦点损失(ATFL)提升对小目标的检测能力
1986 11
YOLOv11改进策略【小目标改进】| 2024-TOP 自适应阈值焦点损失(ATFL)提升对小目标的检测能力
|
机器学习/深度学习
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
本文介绍了YOLOv10的性能优化,通过融合Ghost模块和C2f结构,实现了网络性能的均衡。GhostNet通过GhostModule和GhostBottleNeck减少参数量,适用于资源有限的场景。YOLOv10-C2f_Ghost在减少参数和计算量的同时,保持了与原始网络相当或更好的性能。文章还提供了详细的代码修改步骤和可能遇到的问题解决方案。
2136 1
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
|
数据可视化 计算机视觉
训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练
本文介绍了一个用于煤炭与矸石分类的煤矸石目标检测数据集,包含891张训练图片和404张验证图片,分为煤炭、矸石和混合物三类。数据集已标注并划分为训练和验证集,适用于YOLOv5/v6/v7/v8训练。数据集可通过提供的链接下载。
714 1
训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练
|
数据采集 弹性计算 供应链
阿里云服务器ECS收费方式:节省计划、按量付费、抢占式实例、包年包月区别及选择参考
阿里云服务器ECS提供灵活的计费方式,在通过云服务器ECS产品页面购买的时候,默认可选的付费类型为包年包月、按量付费和抢占式实例,而节省计划是在已经持有一定数量的按量付费实例,希望进行成本优化时通过“节省计划购买方案测算”选择的计费模式。本文来为大家介绍一下这些付费类型的主要区别及选择参考。
阿里云服务器ECS收费方式:节省计划、按量付费、抢占式实例、包年包月区别及选择参考
|
图形学
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
初识Unity——基本模型、场景操作、世界坐标系和局部坐标系
618 1
|
JavaScript
Vue3骨架屏(Skeleton)
该文章介绍了一个名为Skeleton的Vue组件,用于创建加载时的占位符界面,包含多种可配置项如按钮、输入框、图像等,并支持动画效果。
530 0
Vue3骨架屏(Skeleton)
|
Java API 领域建模
领域驱动设计(DDD)-简单落地
一、序言     领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法。在本文中的实战示例可能会与常见的DDD规则方法不太一样,是简单、入门级别,新手可以快速实践版的DDD。如果不熟悉DDD设计思想可看下基础思想篇 二、设计阶段     领域建模设计阶段常见的方法有 四色建模法、EventSourcing等 推荐一篇博文正确理解领域建
12690 1