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使用Flask框架同时上传多个文件的方法
Mar 21 Python
Python3写入文件常用方法实例分析
May 22 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python实现list由于numpy array的转换
Apr 04 Python
pytorch 数据集图片显示方法
Jul 26 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
python构建指数平滑预测模型示例
Nov 21 Python
用 python 进行微信好友信息分析
Nov 28 Python
Python入门基础之数字字符串与列表
Feb 01 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
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
实现PHP搜索加分页
2016/10/12 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
php实现socket推送技术的示例
2017/12/20 PHP
用js实现trim()的解决办法
2013/04/16 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
python开发中module模块用法实例分析
2015/11/12 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
公司周年庆典策划方案
2014/05/17 职场文书
公司门卫工作职责
2014/06/28 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
搞笑婚前保证书
2015/02/28 职场文书
实习班主任自我评价
2015/03/11 职场文书
党小组鉴定意见
2015/06/02 职场文书
付款证明模板
2015/06/19 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
python基础之爬虫入门
2021/05/10 Python