【目标检测适用】批量修改xml文件中的name字段

news/2024/7/10 0:52:28 标签: python, 目标检测, 标注, xml, 批量修改
xmlns="http://www.w3.org/2000/svg" style="display: none;">

前言:使用labelimg进行标注的时候,由于都是用的是默认的名称,有时候类的名字会出现拼写错误,比如我想要写的是“cow” 结果打上去的是“cwo”, 一出错就错一片,这很常见,所以参考了:https://www.jianshu.com/p/cf12bef0872c 的代码,修改了冗余的代码,并添加了新的模块以后,将代码分享给大家。

文章目录

    • 1. xml文件展示
    • 2. 将文件夹中所有name进行批量更改
      • 2.1 将某类别名称更改
      • 2.2 将某文件夹所有类别都统一成某个类别
      • 2.3 统计每个类别实际目标的个数
    • 3. 全部代码

xml_3">1. xml文件展示

xml"><annotation>
	<folder>part3</folder>
	<filename>0015-1150.jpg</filename>
	<path>I:\part3\0015-1150.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>1280</width>
		<height>720</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>459</xmin>
			<ymin>88</ymin>
			<xmax>567</xmax>
			<ymax>163</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>543</xmin>
			<ymin>92</ymin>
			<xmax>630</xmax>
			<ymax>163</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>659</xmin>
			<ymin>156</ymin>
			<xmax>773</xmax>
			<ymax>263</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>497</xmin>
			<ymin>171</ymin>
			<xmax>677</xmax>
			<ymax>315</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>584</xmin>
			<ymin>303</ymin>
			<xmax>715</xmax>
			<ymax>395</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>537</xmin>
			<ymin>389</ymin>
			<xmax>814</xmax>
			<ymax>497</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>750</xmin>
			<ymin>303</ymin>
			<xmax>918</xmax>
			<ymax>434</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>770</xmin>
			<ymin>223</ymin>
			<xmax>958</xmax>
			<ymax>285</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>974</xmin>
			<ymin>477</ymin>
			<xmax>1152</xmax>
			<ymax>636</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>66</xmin>
			<ymin>454</ymin>
			<xmax>308</xmax>
			<ymax>696</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>1</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>347</xmin>
			<ymin>548</ymin>
			<xmax>550</xmax>
			<ymax>720</ymax>
		</bndbox>
	</object>
	<object>
		<name>cow</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>996</xmin>
			<ymin>154</ymin>
			<xmax>1128</xmax>
			<ymax>245</ymax>
		</bndbox>
	</object>
</annotation>

2. 将文件夹中所有name进行批量更改

2.1 将某类别名称更改

python">def changeName(xml_fold, origin_name, new_name):
    '''
    xml_fold: xml存放文件夹
    origin_name: 原始名字,比如弄错的名字,原先要cow,不小心打成cwo
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name == origin_name: # 修改
                obj.find('name').text = new_name
                print("change %s to %s." % (origin_name, new_name))
                cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

效果如下:
在这里插入图片描述

2.2 将某文件夹所有类别都统一成某个类别

适用于只有一个类,并且进行改名的时候。

python">def changeAll(xml_fold,new_name):
    '''
    xml_fold: xml存放文件夹
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            obj.find('name').text = new_name
            print("change %s to %s." % (tmp_name, new_name))
            cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

效果:
在这里插入图片描述

2.3 统计每个类别实际目标的个数

python">def countAll(xml_fold):
    '''
    xml_fold: xml存放文件夹
    '''
    files = os.listdir(xml_fold)
    dict={}
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name not in dict:
                dict[tmp_name] = 0
            else:
                dict[tmp_name] += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("统计结果如下:")
    print("-"*10)
    for key,value in dict.items():
        print("类别为%s的目标个数为%d." % (key, value))
    print("-"*10)

在这里插入图片描述

3. 全部代码

python">import os
import os.path
from xml.etree.ElementTree import parse, Element

def changeName(xml_fold, origin_name, new_name):
    '''
    xml_fold: xml存放文件夹
    origin_name: 原始名字,比如弄错的名字,原先要cow,不小心打成cwo
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name == origin_name: # 修改
                obj.find('name').text = new_name
                print("change %s to %s." % (origin_name, new_name))
                cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def changeAll(xml_fold,new_name):
    '''
    xml_fold: xml存放文件夹
    new_name: 需要改成的正确的名字,在上个例子中就是cow
    '''
    files = os.listdir(xml_fold)
    cnt = 0 
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            obj.find('name').text = new_name
            print("change %s to %s." % (tmp_name, new_name))
            cnt += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("有%d个文件被成功修改。" % cnt)

def countAll(xml_fold):
    '''
    xml_fold: xml存放文件夹
    '''
    files = os.listdir(xml_fold)
    dict={}
    for xmlFile in files:
        file_path = os.path.join(xml_fold, xmlFile)
        dom = parse(file_path)
        root = dom.getroot()
        for obj in root.iter('object'):#获取object节点中的name子节点
            tmp_name = obj.find('name').text
            if tmp_name not in dict:
                dict[tmp_name] = 0
            else:
                dict[tmp_name] += 1
        dom.write(file_path, xml_declaration=True)#保存到指定文件
    print("统计结果如下:")
    print("-"*10)
    for key,value in dict.items():
        print("类别为%s的目标个数为%d." % (key, value))
    print("-"*10)


if __name__ == '__main__':
    path = r"I:\dongpeijiePickup\assignment\part2_xml" #xml文件所在的目录
    # changeName(path, "cattle", "cow")
    # changeAll(path, "cattle")
    countAll(path)


http://www.niftyadmin.cn/n/1010938.html

相关文章

php多图片生成flash,PHP生成Flash动画的实现代码

其中有一组映射到 SWF 动画中的数据类型的对象&#xff1a;子图形、图形、文本、位图等等。在本文中&#xff0c;我使用了预编译的扩展 php_ming.dll 库用于 Windows 版本的 PHP。清单 2 显示了使用 Ming 库实现的 HelloWorld 示例。清单 2. Hello.php$f new SWFFont( _sans )…

【Android布局】在程序中设置android:gravity 和 android:layo...

2019独角兽企业重金招聘Python工程师标准>>> 在进行UI布局的时候&#xff0c;可能经常会用到 android:gravity 和 android:layout_Gravity 这两个属性。 关于这两个属性的区别&#xff0c;网上已经有很多人进行了说明&#xff0c;这边再简单说一下。 (资料来自网络…

ZooKeeper典型使用场景一览

2019独角兽企业重金招聘Python工程师标准>>> http://rdc.taobao.com/team/jm/archives/1232 转载于:https://my.oschina.net/cmffire/blog/76202

在搭建oracle dataguard 11g过程中遇到的问题一

-bash: ulimit: pipe size: cannot modify limit: Invalid argument 在由root用户切换到Oracle用户时&#xff0c;出现如题所示的问题。 解决办法&#xff1a;在Oracle用户下&#xff0c;vi编辑器打开.bash_profile文件。 配置该文件时有这么一段&#xff1a; if [ $USER &q…

和我一起学 Selenium WebDriver(1)——入门篇

2019独角兽企业重金招聘Python工程师标准>>> zTree 东西不多&#xff0c;我也一直使用着原始的人工测试手段&#xff0c;随着内容的不断增多&#xff0c;测试起来就越发的繁杂&#xff0c;而且经常犯懒&#xff0c;这样就会忽略很多本该发现的问题&#xff0c;而且也…

Pytorch中张量的构造与组织

前言&#xff1a;《神经网络与PyTorch实战》读书笔记之PyTorch中的张量操作 文章目录1. PyTorch中的张量2. 构造Tensor实例方法3. 组织张量元素&#xff08;重点&#xff09;3.1 重排张量3.2 选取部分张量3.3 张量扩展和拼接3.4 torch内置统计函数1. PyTorch中的张量 torch.Te…

如何在Ubuntu 12.04 Server 中安装图形用户界面

使用ubuntu server安装lamp主机非常的方便&#xff0c;只要在安装系统的步骤中选择就是了 。但是很多时候我需要在图形界面下管理主机更加方便。今天的教程就是教大家安装图形界面。首先你需要确定你的源文件中 /etc/apt/sources.list 已经使用Universe和Multiverse库。然后使用…

django mysql文档,《django中使用 MySQL数据库》

在开发环境中使用Mysql作为后台数据库的步骤。在开发环境中安装Mysql服务器安装 Python 和Mysql之间的连接驱动修改 settings.py中的设置&#xff0c;提供Mysql的链接信息。在开发环境安装MySQL服务器apt-get update apt-get upgrate apt-get install mysql-server apt-get ins…