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 相关文章推荐
Python中如何获取类属性的列表
Dec 26 Python
python numpy 显示图像阵列的实例
Jul 02 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python实现代码统计器
Sep 19 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
python实现查找所有程序的安装信息
Feb 18 Python
python中urllib包的网络请求教程
Apr 19 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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框架的性能
2008/01/10 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php 读取文件乱码问题
2010/02/20 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
python中bisect模块用法实例
2014/09/25 Python
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
python绘制简单彩虹图
2018/11/19 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Python中的类与类型示例详解
2019/07/10 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
外贸公司实习自我鉴定
2013/09/24 职场文书
中专自我鉴定范文
2013/10/16 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Python 数据可视化之Matplotlib详解
2021/11/02 Python