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面向对象编程的知识点总结
Feb 14 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
python实现点对点聊天程序
Jul 28 Python
Python中Proxypool库的安装与配置
Oct 19 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
解决Django连接db遇到的问题
Aug 29 Python
django自定义模板标签过程解析
Dec 14 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
如何让python的运行速度得到提升
Jul 08 Python
Python用SSH连接到网络设备
Feb 18 Python
Python 内置函数速查表一览
Jun 02 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和ACCESS写聊天室(八)
2006/10/09 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
layui 设置table 行的高度方法
2018/08/17 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
python黑魔法之编码转换
2016/01/25 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Python Django Cookie 简单用法解析
2019/08/13 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
Python操作Jira库常用方法解析
2020/04/10 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
奠基仪式策划方案
2014/05/15 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers