yolov3之数据集预处理

2023-11-05

txt标签文件的说明

获取到的数据集是这样的,需要转换为VOC格式,其实就是将txt转换为xml文件:
在这里插入图片描述
打开txt文件可以看到以下内容:

1 0.4635416666666667 0.3016666666666667 0.39375 0.48333333333333334

id为1:目标为 mask,
该图片大小:w * h = 480 * 600

0.4635416666666667:【中心点X的比例标注】,480 * 0.4635416666666667 = 222.5 pixel

0.3016666666666667 :【中心点Y的比例标注】 600*0.3016666666666667 = 181.0 pixel

0.39375: 【BOX宽比例标注】0.39375 * 480 = 189 pixel

0.48333333333333334: 【BOX高比例标注】0.48333333333333334 * 600 = 290 pixel

181 / 2 = 90.5
290 / 2 =145

xmin:222.5 - 90.5 = 132
xmax:222.5 + 90.5 = 313
ymin:189 - 145 = 44
ymax:189 + 145 = 334

将jpg与txt文件分开

先将txt和jpg分别分开到txt和picture文件夹下:
相关代码如下:
修改文件后缀,如果是分出txt,则将后缀改为.txt

# -*- coding:utf-8 -*-
import os
import shutil
import sys
import glob

file_type = ".jpg" #文件后缀
from_path = '.\\mask\\'  #源文件路径
to_path = '.\\picture\\'   #要复制的目标路径



from_path_list = glob.glob(from_path + '*' + file_type)
total = len(from_path_list) # 要复制的文件总数,视情况改
print('复制文件数:',total)

i = 0
interval = 5 # 打算每隔5%变化一次,视需求改
interval_num = int(total / (100 / interval)) 
# 遍历路径内的文件
for root , dirs, files in os.walk(from_path):
    for name in files:
        if name.endswith(file_type): # 只复制特定类型文件
            # print (os.path.join(root, name))
            source = os.path.join(root, name)
            target = os.path.join(to_path, name)
            try:
                shutil.copy(source, target)
            except:
                print("Copy %s failed!" % name)
            
            # 每隔5%刷新一次屏幕显示的进度百分比
            i += 1
            if (i % interval_num == 0):
                sys.stdout.write("Copy progress: %d%%   \r" % (i / interval_num * interval))
                sys.stdout.flush()

                

分开之后的效果
在这里插入图片描述
在这里插入图片描述

txt生成xml标签文件

读取txt文件,并生成xml文件,代码如下:

from xml.dom.minidom import Document
import os
import cv2
import sys


def makexml(txtPath,xmlPath,picPath): #读取txt路径,xml保存路径,数据集图片所在路径
        files_len = get_files_list_len(txtPath)

        dict = {'0': "unmask",#字典对类型进行转换,分的种类越多,这里的字典越多
                '1': "mask",
                '2': "slot_l", 
                '3': "sink_l",
                '4': "chap_l",
                '5': "block_l",
                '6': "track_l",
                '7': "plash",
                '8': "block_h"}
        files = os.listdir(txtPath)
        x = 0
        for i, name in enumerate(files):
          xmlBuilder = Document()
          annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签
          xmlBuilder.appendChild(annotation)
          txtFile=open(txtPath+name)
          txtList = txtFile.readlines()
          img = cv2.imread(picPath+name[0:-4]+".jpg")
          Pheight,Pwidth,Pdepth=img.shape
          for i in txtList:
             oneline = i.strip().split(" ")

             folder = xmlBuilder.createElement("folder")#folder标签
             folderContent = xmlBuilder.createTextNode("VOC2007")
             folder.appendChild(folderContent)
             annotation.appendChild(folder)

             filename = xmlBuilder.createElement("filename")#filename标签
             filenameContent = xmlBuilder.createTextNode(name[0:-4]+".jpg")
             filename.appendChild(filenameContent)
             annotation.appendChild(filename)

             size = xmlBuilder.createElement("size")  # size标签
             width = xmlBuilder.createElement("width")  # size子标签width
             widthContent = xmlBuilder.createTextNode(str(Pwidth))
             width.appendChild(widthContent)
             size.appendChild(width)
             height = xmlBuilder.createElement("height")  # size子标签height
             heightContent = xmlBuilder.createTextNode(str(Pheight))
             height.appendChild(heightContent)
             size.appendChild(height)
             depth = xmlBuilder.createElement("depth")  # size子标签depth
             depthContent = xmlBuilder.createTextNode(str(Pdepth))
             depth.appendChild(depthContent)
             size.appendChild(depth)
             annotation.appendChild(size)

             object = xmlBuilder.createElement("object")
             picname = xmlBuilder.createElement("name")
             nameContent = xmlBuilder.createTextNode(dict[oneline[0]])
             picname.appendChild(nameContent)
             object.appendChild(picname)
             pose = xmlBuilder.createElement("pose")
             poseContent = xmlBuilder.createTextNode("Unspecified")
             pose.appendChild(poseContent)
             object.appendChild(pose)
             truncated = xmlBuilder.createElement("truncated")
             truncatedContent = xmlBuilder.createTextNode("0")
             truncated.appendChild(truncatedContent)
             object.appendChild(truncated)
             difficult = xmlBuilder.createElement("difficult")
             difficultContent = xmlBuilder.createTextNode("0")
             difficult.appendChild(difficultContent)
             object.appendChild(difficult)
             bndbox = xmlBuilder.createElement("bndbox")
             xmin = xmlBuilder.createElement("xmin")
             mathData=int(((float(oneline[1]))*Pwidth+1)-(float(oneline[3]))*0.5*Pwidth)
             xminContent = xmlBuilder.createTextNode(str(mathData))
             xmin.appendChild(xminContent)
             bndbox.appendChild(xmin)
             ymin = xmlBuilder.createElement("ymin")
             mathData = int(((float(oneline[2]))*Pheight+1)-(float(oneline[4]))*0.5*Pheight)
             yminContent = xmlBuilder.createTextNode(str(mathData))
             ymin.appendChild(yminContent)
             bndbox.appendChild(ymin)
             xmax = xmlBuilder.createElement("xmax")
             mathData = int(((float(oneline[1]))*Pwidth+1)+(float(oneline[3]))*0.5*Pwidth)
             xmaxContent = xmlBuilder.createTextNode(str(mathData))
             xmax.appendChild(xmaxContent)
             bndbox.appendChild(xmax)
             ymax = xmlBuilder.createElement("ymax")
             mathData = int(((float(oneline[2]))*Pheight+1)+(float(oneline[4]))*0.5*Pheight)
             ymaxContent = xmlBuilder.createTextNode(str(mathData))
             ymax.appendChild(ymaxContent)
             bndbox.appendChild(ymax)
             object.appendChild(bndbox)

             annotation.appendChild(object)

          f = open(xmlPath+name[0:-4]+".xml", 'w')
          xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
          f.close()
          show(files_len,x)
          x = x+1


#获取文件总数
def get_files_list_len(txtPath):
    from_path_list = os.listdir(txtPath)
    total = len(from_path_list) # 文件总数
    print('复制文件数:',total)
    return total

#转换为xml时的进度显示
def show(files_len,x):

    interval = 5 # 打算每隔5%变化一次,视需求改
    interval_num = int(files_len / (100 / interval)) 
    if (x % interval_num == 0):
        sys.stdout.write("Copy progress: %d%%   \r" % (x / interval_num * interval))
        sys.stdout.flush()


if __name__ == '__main__':
    #makexml("txt所在文件夹","xml保存地址","图片所在地址")

    makexml(".\\txt\\",".\\xml\\",".\\picture\\")

生成后的效果;
在这里插入图片描述

xml标签详解

获取后得到的xml标签详解:

<annotation>
	<folder>VOC2007</folder>          #文件夹
	<filename>test_00000002.jpg</filename>     #图片名称
	<size>                                     #图片大小
		<width>480</width>
		<height>600</height>
		<depth>3</depth>              #图片维度
	</size>
	<object>
		<name>mask</name>           #类别名称
		<pose>Unspecified</pose>    #拍摄角度
		<truncated>0</truncated>   #是否被裁减,0表示完整,1表示不完整
		<difficult>0</difficult>  #是否容易识别,0表示容易,1表示困难
		<bndbox>                          #先验框的位置
			<xmin>129</xmin>
			<ymin>37</ymin>
			<xmax>318</xmax>
			<ymax>327</ymax>
		</bndbox>
	</object>
</annotation>

xml标签生成txt

#!/usr/bin/evn python 
#coding:utf-8 
import os

try: 
  import xml.etree.cElementTree as ET 
except ImportError: 
  import xml.etree.ElementTree as ET 
import sys 


#获取文件总数
def get_files_list_len(txtPath):
    from_path_list = os.listdir(txtPath)
    total = len(from_path_list) # 文件总数
    print('复制文件数:',total)
    return total, from_path_list

#处理进度显示
def show(files_len,x):

    interval = 5 # 打算每隔5%变化一次,视需求改
    interval_num = int(files_len / (100 / interval)) 
    if (x % interval_num == 0):
        sys.stdout.write("Copy progress: %d%%   \r" % (x / interval_num * interval))
        sys.stdout.flush()

#读取xml标签,处理为txt文件
def xml_to_txt(xml_path,txt_path):
  files_len,from_path_list = get_files_list_len(xml_path)
  for i in range(files_len):
    #file_srx = open()  #其中包含所有待计算的文件名
    #print(from_path_list[i])

    #print(line)
    #f = line[:-1]    # 除去末尾的换行符
    tree = ET.parse('.\\xml\\' + from_path_list[i])     #打开xml文档 
    root = tree.getroot()         #获得root节点  
    #print ("*"*10)
    filename = root.find('filename').text
    filename = filename[:-4]
    #print (filename) 

    file_object = open(txt_path + filename + ".txt", 'w') #写文件
    file_object_log = open(txt_path + filename + ".log", 'w') #写文件
    flag = False
    
    ########################################
    for size in root.findall('size'): #找到root节点下的size节点 
      width = size.find('width').text   #子节点下节点width的值 
      height = size.find('height').text   #子节点下节点height的值 
      #print (width, height)
    ########################################
    
    for object in root.findall('object'): #找到root节点下的所有object节点 
      name = object.find('name').text   #子节点下节点name的值 
      #print (name)
      bndbox = object.find('bndbox')      #子节点下属性bndbox的值 
      xmin = bndbox.find('xmin').text
      ymin = bndbox.find('ymin').text
      xmax = bndbox.find('xmax').text
      ymax = bndbox.find('ymax').text
      #print (xmin, ymin, xmax, ymax)

      file_object.write(name+' '+ xmin +' ' + ymin + ' ' + xmax + ' ' + ymax)

  #    if name == ("bicycle" or "motorbike"):
        #file_object.write("Cyclist" + " 0 0 0 " + xmin + ".00 " + ymin + ".00 " + xmax + ".00 " + ymax + ".00 " + "0 0 0 0 0 0 0" + "\n")
  #      file_object_log.write(str(float(int(xmax) - int(xmin)) * 1920.0 / float(width)) + " " + str(float(int(ymax) - int(ymin)) * 1080.0 / float(height)) + "\n")
  #      flag = True
  #    if name == ("car"):
        #file_object.write("Car" + " 0 0 0 " + xmin + ".00 " + ymin + ".00 " + xmax + ".00 " + ymax + ".00 " + "0 0 0 0 0 0 0" + "\n")
  #      file_object_log.write(str(float(int(xmax) - int(xmin)) * 1920.0 / float(width)) + " " + str(float(int(ymax) - int(ymin)) * 1080.0 / float(height)) + "\n")
  #      flag = True
  #    if name == ("person"):
        #file_object.write("Pedestrian" + " 0 0 0 " + xmin + ".00 " + ymin + ".00 " + xmax + ".00 " + ymax + ".00 " + "0 0 0 0 0 0 0" + "\n")
  #      file_object_log.write(str(float(int(xmax) - int(xmin)) * 1920.0 / float(width)) + " " + str(float(int(ymax) - int(ymin)) * 1080.0 / float(height)) + "\n")
  #      flag = True
    #file_object.close( )
    file_object_log.close()
    if flag == False:  #如果没有符合条件的信息,则删掉相应的txt文件以及jpg文件
      #os.remove(filename + ".txt")
      #os.remove(filename + ".jpg")
      os.remove(txt_path + filename + ".log")
    #line = file_srx.readline()
    show(files_len,i)

if __name__ == '__main__':
  
  xml_path = '.\\xml'  #读取xml路径
  txt_path = '.\\to_txt\\'   #保存txt路径
  xml_to_txt(xml_path,txt_path)

运行后效果如图
在这里插入图片描述
在这里插入图片描述

参考文献:
https://www.jianshu.com/p/c5b98b2cb7ff
https://zhuanlan.zhihu.com/p/58392978
https://blog.csdn.net/weixin_39875161/article/details/92846873
https://blog.csdn.net/xiao_lxl/article/details/85342707
https://www.cnblogs.com/rainsoul/p/6283231.html

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

yolov3之数据集预处理 的相关文章

  • Pandas:参差不齐的时间序列的时间加权滚动平均值

    我有一个参差不齐 意思是不规则的频率 时间索引的 DataFrame 我想对其执行时间加权滚动平均值 以维护 DataFrame 的原始索引 假设记录的值在被另一个值取代之前一直有效 实现此目的的一种方法是将参差不齐的 DataFrame
  • 导入错误:没有名为请求的模块

    我尝试导入requests https requests readthedocs io import requests 但我收到一个错误 导入错误 没有名为请求的模块 Requests 不是内置模块 默认的 python 安装不附带 因此您
  • 为什么我的 jupyter 笔记本中不需要“%matplotlib inline”?

    我只是想理解为什么我的 jupyter 安装不需要我运行 matplotlib inline 根据我读过的所有内容 我应该运行它才能将我的绘图内联到我的 jupyter 笔记本中 但事实是 无论我是否运行 matplotlib inline
  • 如何在 Heroku 中安装 NLTK 模块

    嘿 我想在我的 Heroku 服务器上安装 NLTK pos tag 我该怎么办呢 请给我一些步骤 因为我是 Heroku 服务器系统的新手 我刚刚添加了官方nltk支持构建包 只需添加一个nltk txt文件包含要安装的语料库列表 一切都
  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • 让 argparse 收集但不响应标志

    我有一个脚本 它接受一些参数 使用其中一些参数来选择要运行的脚本 并将其余参数传递给该脚本 所以它看起来像这样 parser ArgumentParser parser add argument script choices a b par
  • Python bash 管道

    我想将 python 脚本的输出通过管道传输到 bash 脚本 到目前为止我所做的是尝试使用os popen sys subprocess 并试图给出一个管道的例子 os popen echo P 1 1 591336 4927369 1
  • 倒计时:01:05

    如何在 Python 中创建一个看起来像 00 00 分钟和秒 的倒计时时钟 它独立成一行 每次减少一actual秒 则应将旧计时器替换为低一秒的新计时器 01 00变成00 59它实际上击中了00 00 这是我开始使用但想要改造的基本计时
  • Django 和 VirtualEnv 开发/部署最佳实践

    只是好奇人们如何结合 virtualenv 部署 Django 项目 更具体地说 如何使生产虚拟环境与开发计算机正确同步 我使用 git 进行 scm 但 git 存储库中没有 virtualenv 我应该这样做 还是最好使用 pip fr
  • Python:并行修改数组的简单方法

    这个问题可能听起来很简单 但作为 Python 并行化的新手 我肯定会遇到困难 我处理了 OpenMP for C 中的并行化问题 这要容易得多 我需要做的是并行修改矩阵的条目 就是这样 问题是 我无法使用简单的 joblib 库来做到这一
  • 如何定期向数组添加新元素,使其出现在每 500 个元素之后?

    如果我有一个包含 500k 个元素 仅限数字 的数组 列 我如何能够在每 500 个元素之后添加一个新元素 新的数字应该是相邻元素的平均值 例如 在元素 499 和 500 之间有一个值为 499 的值 500 的值 2 的新元素 依此类推
  • 是否有像 python 的 issubclass 这样的东西,如果第一个参数不是类,它将返回 False?

    我想要issubclass 1 str 返回 false 1不是 的子类str 因为它根本不是一个类 所以我收到了 TypeError 有没有一个好的方法来测试这个而不诉诸try except try if issubclass value
  • 检查空查询集

    我想确认这是否是检查空查询集的正确方法 如果这就是为什么我会遇到 UNIQUE 约束错误 syn check Synonym objects filter MD objects get filter dict synonym type St
  • 在Python中,如何将“datetime”对象转换为秒?

    我有一堆日期时间对象 我想计算每个对象自过去固定时间以来的秒数 例如自 1970 年 1 月 1 日以来 import datetime t datetime datetime 2009 10 21 0 0 这似乎只是区分具有不同日期的日期
  • 如何将当前登录的用户指定为模型字段的默认值?

    我想做这样的事情 class Task models Model created by models ForeignKey User default LoggedInUser blank True null True related nam
  • 如何在lxml,Python中将<转换为<?

    有一个xml文件
  • 虎鲸失踪

    使用plotly 导出静态图表时遇到小问题 Plotly 无法正确识别我已安装 orca 并且仍然存在与缺少 orca 相关的错误 我尝试更改 orca 目录 但它仍然无法正常工作 谁知道出了什么问题吗 My code import plo
  • 熊猫:SettingWithCopyWarning:[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码将列转换为 日期 df DATE pd to datetime df DATE or df DATE pd to datetime df DATE 但我收到以下错误 Users xyz anac
  • Python Flask 不更新图像[重复]

    这个问题在这里已经有答案了 这里有一些关于图像的 Flask 问题 但没有一个能解决我的问题 我有一个应用程序可以创建图像 保存它 然后显示它 一次 它应该多次执行此操作 每次更改图像时 它应该加载新图像 它不是 它只显示与其显示的文件名关
  • Python - 使用 BeautifulSoup 从 URL 列表中抓取文本的最简单方法

    使用 BeautifulSoup 从几个网页 使用 URL 列表 中抓取文本的最简单方法是什么 有可能吗 最好的 乔治娜 import urllib2 import BeautifulSoup import re Newlines re c

随机推荐

  • 期货开户收费政策非常合理

    需要大家支付的费用由两部分组成 一部分是保证金 另一部分是费率 保证金和费率都由交易所收取 收取的费用是固定的 因为后期大家投资的项目是不一样的 所以需要大家准备的费用肯定也不一样 除了交易所所收取的费用以外 还包括了开户公司所收取的费用
  • 51单片机原理图

    51单片机 TOC
  • ANDROID APP的页面布局(Part I)

    做一个好的APP自然是不能缺少一个好的漂亮的且合理的页面布局了 ANDORID里面支持的布局大致上有下列即种 根据界面的需要使用不同的布局可达到事半功倍的效果 这个跟做HMTL的页面的原理是一样 好的页面看起来就是舒服 而且容易维护 1 L
  • Lambda表达式与函数式编程

    文章目录 函数式编程 Stream流 概述 为什么学 函数式编程思想 Lambda表达式 概述 Lambda表达式的前身 省略规则 Stream流 概述 案例数据准备 创建流 中间操作 终结操作 reduce归并 注意事项 Optional
  • C语言运算符优先级(超详细)

    转自 http blog csdn net huangblog article details 8271791 每当想找哪个运算符优先级高时 很多时候总是想找的就没有 真让人气愤 现在 终于有个我个人觉得非常全的 分享给大家 欢迎拍砖 C语
  • 前端开发面试题及答案整理(合集)

    前端开发面试题及答案 1 对Web标准以及W3C的理解与认识 答 标签闭合 标签小写 不乱嵌套 提高搜索机器人搜索几率 使用外链CSS和JS脚本 结构行为表现的分离 文件下载与页面速度更快 内容能被更多的用户所访问 内容能被更广泛的设备所访
  • Qt 助手 assistant 单独运行 及 字体设置

    曾经在 Qt creator上 不知道点击了哪里 Qt 助手也是可以单独运行的 这样就可以不需要安装字体了 但是 一直没有找到这个重现的规则 或者快捷键 1 运行Qt 助手 assistant linux 所在目录 xxxxxx Qt5 1
  • java调用 Myeclipse用jax-ws创建的webservice具体方法(三)

    首先需要下载所需的jar包 webservices所需全部jar包下载 点击打开链接 直接上代码 import java net MalformedURLException import java net URL import java r
  • 基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 2 算法运行软件版本 matlab2022a 3 部分核心程序 fine regular grid NSa
  • Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}

    org springframework beans factory BeanDefinitionStoreException Invalid bean definition with name dataSource defined in f
  • $.ajaxFileUpload上传文件出现错误...问题总结

    1 加载报错 ajaxfileupload js 1 Uncaught ReferenceError jQuery is not defined 上传报错 Uncaught TypeError ajaxFileUpload is not a
  • C++ Pat甲级1003 Emergency (25 分)图+dfs

    1003 Emergency 25 分 As an emergency rescue team leader of a city you are given a special map of your country The map sho
  • FPGA实现电机转速PID控制

    通过纯RTL实现电机转速PID控制 包括电机编码器值读取 电机速度 正反转控制 PID算法 卡尔曼滤波 最终实现对电机速度进行控制 使其能够渐近设定的编码器目标值 一 设计思路 前面通过SOPC之NIOS 实现电机转速PID控制 调用中断函
  • Android数据库升级解决方案

    方案一 第三方库ActiveAndroid数据库 在对应继承model的实体类中添加的字段 并且对应的数据库版本升级 1 在assert资源文件添加一个migrations文件夹 里面创建文件 版本号 sql 文件中添加数据库脚本 即 AL
  • 最容易理解的JavaScript解决约瑟夫环问题的方式之一

    这种方式虽然效率不是最高的 但绝对是最容易理解的思路之一 function ysf flag stayNum allNum let arr let start 1 for let i 1 i lt allNum i arr push i 当
  • 做爱做的事,做有快感的事

    还是不发首页了 最近没规划 需要缓一缓 因为发首页还是要符合几点要求的 所以就先停停 不过文章还是得写 本来十一点多就写好了 没想到洗个澡就过了十二点 今天就更像聊天了 上一篇说到拖延症 最后留下了一个尾巴 就是怎么找到不会发生拖延症的事去
  • 【Git】(四)子模块

    1 增加子模块 进入准备添加子模块所在的目录 例如library git submodule add b 1 0 0 0 git gitee com sunriver2000 SubModule git 参数 b用于指定子模块分支 2 更新
  • 刷脸支付每个人的脸都具有唯一性无法复制

    移动支付时代 手机成为承载资金的介质 人人手机里有支付宝或者微信支付 但如果手机一旦丢失 不法分子破解了用户密码 那么资金安全也面临威胁 而刷脸支付的第一大优势就在于保证用户资金安全 因为在整个支付过程中 用户完全不用打开手机和自己的资金账
  • [游戏开发][Shader]GLSLSandBox转Unity-CG语言

    官网 GLSL Sandbox Galleryhttps glslsandbox com 屏幕坐标计算 fragCoord与 ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2 a b c d 函数返回vec2
  • yolov3之数据集预处理

    目录 txt标签文件的说明 将jpg与txt文件分开 txt生成xml标签文件 xml标签详解 xml标签生成txt txt标签文件的说明 获取到的数据集是这样的 需要转换为VOC格式 其实就是将txt转换为xml文件 打开txt文件可以看