目标检测中将已有的数据集从.xml转换成.txt格式

2023-11-01

目标检测中将已有的数据集从.xml转换成.txt格式

1.准备工作
IDE:vscode或者pycharm

1.1新建项目
我新建了data目录并新建Annotations, images, ImageSets, JPEGImages, labels 五个文件夹。
其中images和JPEGImages存放的是原始的图片数据集,Annotations存放的是标记后生成的xml文件,labels存放的是保存标记内容的txt文件,ImageSets存放的是训练数据集和测试数据集的分类情况。
在这里插入图片描述

其中Annotations 文件夹 放我们想要转换的xml数据集。如下图

在这里插入图片描述

labels文件夹为空,将要放我们所需要的供YOLO使用的归一化txt文件
ImageSets为空,是我们之后划分训练集、测试集的分类状况

2.makeTxt.py转换代码
需要两个代码文件,makeTxt.py以及voc_label.py

makeTxt.py主要是将数据集分类成训练数据集和测试数据集,默认按照8:2的比例进行随机分类,运行后ImagesSets文件夹中会出现四个文件,主要是生成的训练数据集和测试数据集的图片名称,如下图。
在这里插入图片描述
makeTxt.py代码如下:

import os
import random


trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
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)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

3.voc_label.py转换代码
voc_label.py主要是将图片数据集标注后的xml文件中的标注信息读取出来并写入txt文件,运行后在labels文件夹中出现所有图片数据集的标注信息。
并且,data目录下也会出现这四个文件,内容是训练数据集和测试数据集的图片路径。这就可以用来我们做训练,主要是生成路径。
如下图:
在这里插入图片描述
具体代码如下:

# xml解析包
import xml.etree.ElementTree as ET
import pickle
import os
# os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
from os import listdir, getcwd
from os.path import join


sets = ['train', 'test', 'val']
classes = ['metal', 'plastic', 'guard']


# 进行归一化操作
def convert(size, box): # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax)
    dw = 1./size[0]     # 1/w
    dh = 1./size[1]     # 1/h
    x = (box[0] + box[1])/2.0   # 物体在图中的中心点x坐标
    y = (box[2] + box[3])/2.0   # 物体在图中的中心点y坐标
    w = box[1] - box[0]         # 物体实际像素宽度
    h = box[3] - box[2]         # 物体实际像素高度
    x = x*dw    # 物体中心点x的坐标比(相当于 x/原图w)
    w = w*dw    # 物体宽度的宽度比(相当于 w/原图w)
    y = y*dh    # 物体中心点y的坐标比(相当于 y/原图h)
    h = h*dh    # 物体宽度的宽度比(相当于 h/原图h)
    return (x, y, w, h)    # 返回 相对于原图的物体中心点的x坐标比,y坐标比,宽度比,高度比,取值范围[0-1]


# year ='2012', 对应图片的id(文件名)
def convert_annotation(image_id):
    '''
    将对应文件名的xml文件转化为label文件,xml文件包含了对应的bunding框以及图片长款大小等信息,
    通过对其解析,然后进行归一化最终读到label文件中去,也就是说
    一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
    labal文件中的格式:calss x y w h  同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个
    '''
    # 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
    in_file = open('data/Annotations/%s.xml' % (image_id), encoding='utf-8')
    # print(in_file.name)
    # 准备在对应的image_id 中写入对应的label,分别为
    # <object-class> <x> <y> <width> <height>
    out_file = open('data/labels/%s.txt' % (image_id), 'w', encoding='utf-8')
    # print(out_file.name)
    # 解析xml文件
    tree = ET.parse(in_file)
    # 获得对应的键值对
    root = tree.getroot()
    # 获得图片的尺寸大小
    size = root.find('size')
    # 获得宽
    w = int(size.find('width').text)
    # 获得高
    h = int(size.find('height').text)
    # 遍历目标obj
    for obj in root.iter('object'):
        # 获得difficult ??
        difficult = obj.find('difficult').text
        # 获得类别 =string 类型
        cls = obj.find('name').text
        # 如果类别不是对应在我们预定好的class文件中,或difficult==1则跳过
        if cls not in classes or int(difficult) == 1:
            continue
        # 通过类别名称找到id
        cls_id = classes.index(cls)
        # 找到bndbox 对象
        xmlbox = obj.find('bndbox')
        # 获取对应的bndbox的数组 = ['xmin','xmax','ymin','ymax']
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        print(image_id, cls, b)
        # 带入进行归一化操作
        # w = 宽, h = 高, b= bndbox的数组 = ['xmin','xmax','ymin','ymax']
        bb = convert((w, h), b)
        # bb 对应的是归一化后的(x,y,w,h)
        # 生成 calss x y w h 在label文件中
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 返回当前工作目录
wd = getcwd()
print(wd)


for image_set in sets:
    '''
    对所有的文件数据集进行遍历
    做了两个工作:
    1.讲所有图片文件都遍历一遍,并且将其所有的全路径都写在对应的txt文件中去,方便定位
    2.同时对所有的图片文件进行解析和转化,将其对应的bundingbox 以及类别的信息全部解析写到label 文件中去
         最后再通过直接读取文件,就能找到对应的label 信息
    '''
    # 先找labels文件夹如果不存在则创建
    if not os.path.exists('data/labels/'):
        os.makedirs('data/labels/')
    # 读取在ImageSets/Main 中的train、test..等文件的内容
    # 包含对应的文件名称
    image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
    # 打开对应的2012_train.txt 文件对其进行写入准备
    list_file = open('data/%s.txt' % (image_set), 'w')
    # 将对应的文件_id以及全路径写进去并换行
    for image_id in image_ids:
        list_file.write('data/images/%s.jpg\n' % (image_id))
        # 调用  year = 年份  image_id = 对应的文件名_id
        convert_annotation(image_id)
    # 关闭文件
    list_file.close()


至此 我们就吧.xml文件成功的转换成了yolo使用的归一化txt文件 并划分了训练集、测试集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测中将已有的数据集从.xml转换成.txt格式 的相关文章

  • 如何在 CMake Makefile 中包含 OpenCV 库

    我希望你可以帮助我 我有一个简单的 CMakeLists txt 以便在 Leopard 10 5 8 上构建我的项目 我正在使用 CMake 2 8 1 目前这是代码 cmake minimum required VERSION 2 8
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • 针对不同相机(RGB 和红外)的 StereoCalibrate

    我在校准两个摄像头时遇到问题 第一个是 RGB 第二个是红外 它们有不同的分辨率 我调整了大小并裁剪了更大的图像 焦距等等 例子 RGB 1920x1080 Infrared 512x424 如何相互校准它们 我应该在stereoCalib
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • 从视频/图像中提取元数据

    我从 IP 摄像机获取 MJPEG 流 我正在查看该流并将其保存在计算机上 可以找到我的操作代码here https stackoverflow com questions 21702477 how to parse mjpeg http
  • 如何使用 OpenCV 从图像中获取调色板 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想提取图像的调色板 类似于此 来自 我需要它来提取特定的颜色 如黄色 绿色和棕色 并显示该颜色覆盖的区域的百分比 另外 我可以添加更
  • 从 2 个摄像头捕获(OpenCV、Python)[重复]

    这个问题在这里已经有答案了 所以我试图从 openCV 中的两个摄像头 python 和 windows 7 进行捕获 我用一台相机拍摄的效果很好 你也会注意到我正在对图像做一些时髦的事情 但这并不重要 这是尝试使用两个的代码 import
  • 如何在 opencv 3.0 Beta 中从文件读取 UMat?

    我想用UMat所以我的代码可以使用 OpenCL OpenCV 3 0 0 Beta 在 GPU 和 CPU 上运行 但我找不到将图像文件读入的方法UMat或转换一个Mat to UMat 如何将图像读入UMat 样品用于Mat to UM
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • 使用 OpenCV 和 Python 叠加两个图像而不丢失颜色强度

    如何叠加两个图像而不损失两个图像的颜色强度 我有图像1和图像2 2 我尝试使用 0 5 alpha 和 beta 但它给我的合并图像的颜色强度只有一半 dst cv2 addWeighted img1 0 5 img2 0 5 0 但是当我
  • 如何确定透视变换后的点在新图像平面中的位置?

    我使用 OpenCV Python Numpy 图像中有三个点 我知道这些点的确切位置 P1 P2 N1 我要将图像转换为另一个视图 例如 我将透视图转换为侧视图 如果这样做 我将无法获得图像平面中这三个点的确切位置 我应该以一种可以获得这
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 从凸点获取角点

    我编写了算法来提取图像中显示的点 它们形成凸形 我知道它们的顺序 如何从这些点中提取角点 顶部 3 个和底部 3 个 我正在使用opencv 如果你已经有了物体的凸包 并且该包包含角点 那么你需要做的就是简化包直到它只有 6 个点 有很多方
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • Opencv C++ 检测并裁剪图像上的白色区域

    我在网上搜索过 已经找到了一些方法来完成我想要的事情 但是与我需要的相比 这些方法的效率较低 我有一个 kinect 使用 Microsoft SDK 当前正在获取一个移除背景的人 将结果保存在 3 通道 Mat 中 并将该人从背景中移除
  • OpenCV OpenNI 校准kinect

    我使用 home 通过 kinect 进行捕捉 capture retrieve depthMap CV CAP OPENNI DEPTH MAP capture retrieve bgrImage CV CAP OPENNI BGR IM
  • opencv - 在图像中绘制轮廓

    我正在尝试在图像周围绘制轮廓 我可以看到找到了轮廓 但无法绘制轮廓 轮廓的颜色似乎是两种 黑色和白色 颜色中的一种 import cv2 import numpy as np import matplotlib pyplot as plt

随机推荐

  • 干货!自动驾驶场景下的多目标追踪与实例分割

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 多目标跟踪和分割 MOTS 需要将视频中给定的类别的物体进行检测 分类 跟踪和像素级分割 在其重要的应用场景自动驾驶中 复杂的路况 市区内密集且相似的车辆和行人 以及对低功耗低延
  • sqli-labs-master第17关

    前言 这一关变化还是挺大的 让我们修改密码 第17关 http 192 168 89 134 sqli labs master Less 17 到这里我们还是毫无头绪 只能看源代码 从源码中可以看到 接收到用户POST的uname和pass
  • python猜数字游戏编程、直到猜对为止显示猜了几次_python编写猜数字小游戏

    python编写猜数字小游戏 本文实例为大家分享了python编写猜数字小游戏的具体代码 供大家参考 具体内容如下 import random secret random randint 1 30 guess 0 tries 0 print
  • QCC300x笔记(9) -- 从一个客户问题说说传统蓝牙的AVRCP

    哈喽大家好 这是该系列博文的第九篇 篇 lt lt 系列博文索引 快速通道 gt gt 写在前面 客户反馈连接苹果手机的蓝牙 播放音乐时 会频繁上报歌词 1 客户使用苹果手机 播放音乐后会频繁上报歌词 一句歌词上报一次 通过ID3事件在AL
  • 更改conda镜像源

    show channel urls true channel alias http mirrors tuna tsinghua edu cn anaconda default channels http mirrors tuna tsing
  • 分布式介绍

    虽然本人在前面也写过好几篇分布式系统相关的文章 主要包括CAP理论 分布式存储与分布式事务 但对于分布式系统 并没有一个跟清晰的概念 分布式系统涉及到很多的技术 理论与协议 很多人也说 分布式系统是 入门容易 深入难 我之前的学习也只算是管
  • Django/Flask/Tornado三大web框架性能分析

    写在前面 本文的数据涉及到之前遇到过的问题 大概一次 http 请求到收到响应需要多少时间 这个问题在实际工作中与框架有比较大的关系 因此特别就框架的性能做了一次分析 这里使用之前的一个报告数据 Python s Web Framework
  • ubuntu安装openpose

    一 使用Git直接下载openposegit clone https github com CMU Perceptual Computing Lab openpose git二 下载各种模型文件 比较大 可能需要几分钟到几个小时不等 看网速
  • STM32 电机教程 10 - BLDC 6 步方波控制

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • 关于cocos2dx,多个图块集下的CCTMXTiledMap要注意的一个小地方

    转自 http miraklelhj i sohu com blog view 227380352 htm 最近在开发 三国 的战场地图 为了提高开发速度 果断使用CCTMXTiledMap拼接地图 美术画好图块后 再用TileMap自带的
  • 低压差稳压器--AMS1117芯片简介 结构

    低压差稳压器 AMS1117芯片简介 结构 从内部框图可以看出 ASM1117提供电流限制和热保护 TSD 以防环境温度造成过高的结温 电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在 1 以内 ADJ引脚是可调整电压引脚 用来接入
  • Unity中的屏幕坐标:ComputeScreenPos/VPOS/WPOS

    Unity中的屏幕坐标 ComputeScreenPos VPOS WPOS Unity中的屏幕坐标 ComputeScreenPos VPOS WPOS 1 通过 VPOS WPOS 语义获取 VPOS 是 HLSL 中 对 屏幕 坐标
  • UNI-APP_subNVue原生子窗口使用,web-view层级问题解决

    subNVues文档 app subnvues文档 subNVues开发指南 需求 在pages cloud control index页面使用subNVue原生子窗口 1 pages文件配置 app plus bounce none su
  • 刷脸支付将引领未来让众多对其寄予厚望

    无现金时代为我们带来了诸多便利 而随着这两年刷脸支付的普及 无手机时代也将随之来临 引领一个支付新时代 刷脸支付服务商商们整装待发 等候刷脸支付时代的到来 大家都说刷脸支付是行业新风口 刷脸支付将引领未来 让众多对其寄予厚望 刷脸支付之所以
  • 小乌龟TortoiseGit设置中文模式及设置失败的解决方案

    先安装好小乌龟TortoiseGit 64位 32位均可汉化 1 先去官网下载TortoiseGit Downloads页面 点击进入官网链接 下载完成后就可以进行安装了 2 下载TortoiseGit的中文安装包 PS 32位和64位都行
  • 关于mysql突然启动不了的解决方案?

    下午我用idea写项目的时候因为需要连接数据库 所以打开数据源mysql选项发现自己的本地数据库怎么都打不开了 花费了半个小时去修理这个问题 我的问题与解决如下 1 问题描述 cmd管理员窗口输入net start mysql 报出拒绝启动
  • 剑指offer——面试题49:不使用atoi库函数实现把字符串转换成整数

    下面是参考代码 enum Status kValid 0 kInvalid int g nStatus kValid int StrToInt const char str g nStatus kInvalid long long num
  • 离线安装clamav

    一 简介 Clam AntiVirus是一个类UNIX系统上使用的反病毒软件包 ClamAV是免费而且开放源代码的防毒软件 软件与病毒码的更新皆由社群免费发布 目前ClamAV主要是使用在由Linux FreeBSD等Unix like系统
  • k8s--基础--23.4--认证-授权-准入控制--准入控制

    k8s 基础 23 4 认证 授权 准入控制 准入控制 1 介绍 Kubernetes的Admission Control实际上是一个准入控制器 Admission Controller 插件列表 发送到APIServer的请求都需要经过这
  • 目标检测中将已有的数据集从.xml转换成.txt格式

    目标检测中将已有的数据集从 xml转换成 txt格式 1 准备工作 IDE vscode或者pycharm 1 1新建项目 我新建了data目录并新建Annotations images ImageSets JPEGImages label