python:批量统计xml中各类目标的数量案例


Posted in Python onMarch 10, 2020

之前写了一个matlab的,越用越觉得麻烦,如果不同数据集要改类别数目,而且运行速度慢。所以重新写了一个Python的,直接读取xml文件夹路径就可以,不用预先知道类别,直接能够检测出所有类别的目标名称及其对应的数量。

分享出来给大家。

代码如下:

# -*- coding:utf-8 -*-
import os
import xml.etree.ElementTree as ET
import numpy as np
np.set_printoptions(suppress=True, threshold=np.nan)
import matplotlib
from PIL import Image
 
def parse_obj(xml_path, filename):
 tree=ET.parse(xml_path+filename)
 objects=[]
 for obj in tree.findall('object'):
 obj_struct={}
 obj_struct['name']=obj.find('name').text
 objects.append(obj_struct)
 return objects
 
 
def read_image(image_path, filename):
 im=Image.open(image_path+filename)
 W=im.size[0]
 H=im.size[1]
 area=W*H
 im_info=[W,H,area]
 return im_info
 
 
if __name__ == '__main__':
 xml_path='C:/Users/nansbas/Desktop/hebin/03/'
 filenamess=os.listdir(xml_path)
 filenames=[]
 for name in filenamess:
 name=name.replace('.xml','')
 filenames.append(name)
 recs={}
 obs_shape={}
 classnames=[]
 num_objs={}
 obj_avg={}
 for i,name in enumerate(filenames):
 recs[name]=parse_obj(xml_path, name+ '.xml' )
 for name in filenames:
 for object in recs[name]:
 if object['name'] not in num_objs.keys():
  num_objs[object['name']]=1
 else:
  num_objs[object['name']]+=1
 if object['name'] not in classnames:
  classnames.append(object['name'])
 for name in classnames:
 print('{}:{}个'.format(name,num_objs[name]))
 print('信息统计算完毕。')

python:批量统计xml中各类目标的数量案例

补充知识:Python对目标检测数据集xml文件操作(统计目标种类、数量、面积、比例等&修改目标名字)

1. 根据xml文件统计目标种类以及数量

# -*- coding:utf-8 -*-
#根据xml文件统计目标种类以及数量
import os
import xml.etree.ElementTree as ET
import numpy as np
np.set_printoptions(suppress=True, threshold=np.nan)
import matplotlib
from PIL import Image
 
def parse_obj(xml_path, filename):
 tree=ET.parse(xml_path+filename)
 objects=[]
 for obj in tree.findall('object'):
 obj_struct={}
 obj_struct['name']=obj.find('name').text
 objects.append(obj_struct)
 return objects
 
 
def read_image(image_path, filename):
 im=Image.open(image_path+filename)
 W=im.size[0]
 H=im.size[1]
 area=W*H
 im_info=[W,H,area]
 return im_info
 
 
if __name__ == '__main__':
 xml_path='/home/dlut/网络/make_database/数据集——合集/VOCdevkit/VOC2018/Annotations/'
 filenamess=os.listdir(xml_path)
 filenames=[]
 for name in filenamess:
 name=name.replace('.xml','')
 filenames.append(name)
 recs={}
 obs_shape={}
 classnames=[]
 num_objs={}
 obj_avg={}
 for i,name in enumerate(filenames):
 recs[name]=parse_obj(xml_path, name+ '.xml' )
 for name in filenames:
 for object in recs[name]:
  if object['name'] not in num_objs.keys():
   num_objs[object['name']]=1
  else:
   num_objs[object['name']]+=1
  if object['name'] not in classnames:
   classnames.append(object['name'])
 for name in classnames:
 print('{}:{}个'.format(name,num_objs[name]))
 print('信息统计算完毕。')

python:批量统计xml中各类目标的数量案例

2.根据xml文件统计目标的平均长度、宽度、面积以及每一个目标在原图中的占比

# -*- coding:utf-8 -*-
#统计
# 计算每一个目标在原图中的占比
# 计算目标的平均长度、
# 计算平均宽度,
# 计算平均面积、
# 计算目标平均占比

import os
import xml.etree.ElementTree as ET
import numpy as np

#np.set_printoptions(suppress=True, threshold=np.nan) #10,000,000
np.set_printoptions(suppress=True, threshold=10000000) #10,000,000
import matplotlib
from PIL import Image


def parse_obj(xml_path, filename):
 tree = ET.parse(xml_path + filename)
 objects = []
 for obj in tree.findall('object'):
  obj_struct = {}
  obj_struct['name'] = obj.find('name').text
  bbox = obj.find('bndbox')
  obj_struct['bbox'] = [int(bbox.find('xmin').text),
        int(bbox.find('ymin').text),
        int(bbox.find('xmax').text),
        int(bbox.find('ymax').text)]
  objects.append(obj_struct)
 return objects


def read_image(image_path, filename):
 im = Image.open(image_path + filename)
 W = im.size[0]
 H = im.size[1]
 area = W * H
 im_info = [W, H, area]
 return im_info


if __name__ == '__main__':
 image_path = '/home/dlut/网络/make_database/数据集——合集/VOCdevkit/VOC2018/JPEGImages/'
 xml_path = '/home/dlut/网络/make_database/数据集——合集/VOCdevkit/VOC2018/Annotations/'
 filenamess = os.listdir(xml_path)
 filenames = []
 for name in filenamess:
  name = name.replace('.xml', '')
  filenames.append(name)
 print(filenames)
 recs = {}
 ims_info = {}
 obs_shape = {}
 classnames = []
 num_objs={}
 obj_avg = {}
 for i, name in enumerate(filenames):
  print('正在处理 {}.xml '.format(name))
  recs[name] = parse_obj(xml_path, name + '.xml')
  print('正在处理 {}.jpg '.format(name))
  ims_info[name] = read_image(image_path, name + '.jpg')
 print('所有信息收集完毕。')
 print('正在处理信息......')
 for name in filenames:
  im_w = ims_info[name][0]
  im_h = ims_info[name][1]
  im_area = ims_info[name][2]
  for object in recs[name]:
   if object['name'] not in num_objs.keys():
    num_objs[object['name']] = 1
   else:
    num_objs[object['name']] += 1
   #num_objs += 1
   ob_w = object['bbox'][2] - object['bbox'][0]
   ob_h = object['bbox'][3] - object['bbox'][1]
   ob_area = ob_w * ob_h
   w_rate = ob_w / im_w
   h_rate = ob_h / im_h
   area_rate = ob_area / im_area
   if not object['name'] in obs_shape.keys():
    obs_shape[object['name']] = ([[ob_w,
            ob_h,
            ob_area,
            w_rate,
            h_rate,
            area_rate]])
   else:
    obs_shape[object['name']].append([ob_w,
             ob_h,
             ob_area,
             w_rate,
             h_rate,
             area_rate])
  if object['name'] not in classnames:
   classnames.append(object['name']) # 求平均

 for name in classnames:
  obj_avg[name] = (np.array(obs_shape[name]).sum(axis=0)) / num_objs[name]
  print('{}的情况如下:*******\n'.format(name))
  print(' 目标平均W={}'.format(obj_avg[name][0]))
  print(' 目标平均H={}'.format(obj_avg[name][1]))
  print(' 目标平均area={}'.format(obj_avg[name][2]))
  print(' 目标平均与原图的W比例={}'.format(obj_avg[name][3]))
  print(' 目标平均与原图的H比例={}'.format(obj_avg[name][4]))
  print(' 目标平均原图面积占比={}\n'.format(obj_avg[name][5]))
 print('信息统计计算完毕。')

python:批量统计xml中各类目标的数量案例

3.修改xml文件中某个目标的名字为另一个名字

#修改xml文件中的目标的名字,
import os, sys
import glob
from xml.etree import ElementTree as ET

# 批量读取Annotations下的xml文件
# per=ET.parse(r'C:\Users\rockhuang\Desktop\Annotations\000003.xml')
xml_dir = r'/home/dlut/网络/make_database/数据集——合集/VOCdevkit/VOC2018/Annotations'
xml_list = glob.glob(xml_dir + '/*.xml')
for xml in xml_list:
 print(xml)
 per = ET.parse(xml)
 p = per.findall('/object')

 for oneper in p: # 找出person节点
  child = oneper.getchildren()[0] # 找出person节点的子节点
  if child.text == 'PinNormal': #需要修改的名字
   child.text = 'normal bolt' #修改成什么名字
  if child.text == 'PinDefect': #需要修改的名字
   child.text = 'defect bolt-1' #修改成什么名字

 per.write(xml)
 print(child.tag, ':', child.text)

python:批量统计xml中各类目标的数量案例

以上这篇python:批量统计xml中各类目标的数量案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
动态创建类实例代码
Oct 07 Python
跟老齐学Python之使用Python查询更新数据库
Nov 25 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
Python 实现try重新执行
Dec 21 Python
Python openpyxl 插入折线图实例
Apr 17 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python实现区域填充的示例代码
Feb 03 Python
Python基础之数据类型知识汇总
May 18 Python
学习Python列表的基础知识汇总
Mar 10 #Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 #Python
python 成功引入包但无法正常调用的解决
Mar 09 #Python
python 中不同包 类 方法 之间的调用详解
Mar 09 #Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 #Python
python3 使用traceback定位异常实例
Mar 09 #Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 #Python
You might like
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
python中的字典详细介绍
2014/09/18 Python
详解Python的Django框架中的templates设置
2015/05/11 Python
Python中http请求方法库汇总
2016/01/06 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
Selenium的使用详解
2018/10/19 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
经贸日语专业个人求职信
2013/12/13 职场文书
小学生获奖感言范文
2014/02/02 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
新任教师自我鉴定
2014/02/24 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
致接力运动员加油稿
2015/07/21 职场文书
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server