目标检测中将已有的数据集从.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格式 的相关文章

  • 如何确定透视变换后的点在新图像平面中的位置?

    我使用 OpenCV Python Numpy 图像中有三个点 我知道这些点的确切位置 P1 P2 N1 我要将图像转换为另一个视图 例如 我将透视图转换为侧视图 如果这样做 我将无法获得图像平面中这三个点的确切位置 我应该以一种可以获得这
  • Android for OpenCV - 打开跟踪文件时出错,UnsatisfiedLinkError

    我对 Android 开发和 OpenCV 都是新手 我从 Android 下载了 OpenCV 库http sourceforge net projects opencvlibrary files opencv android http
  • 使用 pygtk3 将 GUI 窗口添加到 python opencv2 程序

    我已经使用Python和Opencv2完成了一个程序 现在 我想向我的程序添加一个 GUI 窗口 我对 PyGtk3 有一些经验 因此 我修改了代码以采用 PyGtk3 但是 我遇到了错误 因此 我尝试了一个简单的程序来找出实际的错误 我的
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • Opencv C++ 检测并裁剪图像上的白色区域

    我在网上搜索过 已经找到了一些方法来完成我想要的事情 但是与我需要的相比 这些方法的效率较低 我有一个 kinect 使用 Microsoft SDK 当前正在获取一个移除背景的人 将结果保存在 3 通道 Mat 中 并将该人从背景中移除
  • 在 HSV 颜色空间内定义组织学图像掩模的颜色范围(Python、OpenCV、图像分析):

    为了根据颜色将组织学切片分成多个层 我修改了 OpenCV 社区提供的一些广泛分布的代码 1 我们的染色程序用不同的颜色标记组织横截面的不同细胞类型 B 细胞为红色 巨噬细胞为棕色 背景细胞核为蓝色 I m interested in se
  • OpenCV RGB转灰度

    我正在做一个视频监控项目 我看不到从 RGB 到灰度的转换 我为灰色设置了黑色窗口 你能帮我解决这个问题吗 附代码 另外 如何获得当前帧和前一帧之间的差异 多谢 宜兰 include stdafx h include
  • 多线程中的 OpenCV CascadeClassifier C++ 接口

    我想在多个线程中使用 CascadeClassifier 对象运行 OpenCV C 接口 我的程序的工作方式是我的主线程将 some file xml 加载到 CascadeClassifier 对象中 生成三个或更多线程并向它们传递级联
  • OpenCV:RGB 到 YUV 转换,并显示维基百科等通道

    我一直在寻找这种转换有一段时间了 在Linux上使用Python将RGB图像转换为YUV图像并访问Y U和V通道有哪些方法 使用 opencv skimage 等 更新 我用的是opencv img yuv cv2 cvtColor ima
  • CMake:编译 OpenCV 时未找到 CUDA 库

    我正在 Windows 上使用 CMAKE 编译支持 CUDA 的 OpenCV 3 0 0 当我点击 配置 时 出现如下错误 CMake Error The following variables are used in this pro
  • Django manage.py runserver 优雅重载

    我正在开发一个 Django 项目 它集成了网络摄像头和 OpenCV 对于网络摄像头访问 我使用以下代码 如果我使用的话 网络摄像头可以被释放Ctrl C结束正在运行的服务器 但如果服务器在代码更改后重新加载 则网络摄像头无法正确释放 因
  • opencv潜在支持向量机[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用基于部件的模型进行对象分类
  • 如何在不使用OpenCV Python中的split函数的情况下获取图像的单一颜色通道?

    我想强调一下用于实时手势识别的手 我观察到 使用 cv2 imsplit 函数 手的图像对于不同的颜色通道会以不同的方式突出显示 但这种分割功能在时间上是非常昂贵的 我无法使用 Numpy 索引执行相同的功能 如官方网站 https doc
  • 如何创建关键点来计算 SIFT?

    我正在使用 OpenCV Python 我已经使用确定角点cv2 cornerHarris 输出的类型为dst 我需要计算角点的 SIFT 特征 输入到sift compute 必须是以下类型KeyPoint 我不知道如何使用cv2 Key
  • 如何从图像中提取 RGB 并仅将 RG 绘制为图形? R 代表 X,G 代表 Y

    我正在尝试从图像中提取 RGB 分量并使用 matplotlib 绘制 3D RGB 直方图 但我不知道该怎么做 这是我当前的代码 import cv2 import numpy as np from scipy import ndimag
  • 我如何知道在 python 中使用 OpenCV 检测到的白色区域的位置?

    例如 在这段代码中 我过滤了视频源以显示白色区域 我如何知道他们的位置 坐标 x y import cv2 import numpy as np cap cv2 VideoCapture 0 while 1 frame cap read h
  • python - opencv - 将像素从 bgr 转换为 hsv

    img cv2 imread example jpg img hsv cv2 cvtColor img cv2 COLOR BGR2HSV lower mask 0 10 lower red np array 0 50 50 upper r
  • 使用 OpenCV 进行三角形检测

    我有以下示例图像 我想用白色填充角落里的这些三角形 我如何使用 OpenCV 检测它们 当然 在这个特定的示例中 我可以只依靠渐变或亮度 然而 未来图像的形状不会如此完美 所以我正在考虑一些形状检测 我听说形状通常可以通过例如霍夫变换来检测

随机推荐

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

    点击蓝字 关注我们 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