python实现的批量分析xml标签中各个类别个数功能示例


Posted in Python onDecember 30, 2019

本文实例讲述了python实现的批量分析xml标签中各个类别个数功能。分享给大家供大家参考,具体如下:

文章目录

需要个脚本分析下各个目标的数目 顺带练习下多进程,自用,直接上代码:

# -*- coding: utf-8 -*-
# @Time  : 2019/06/10 18:56
# @Author : TuanZhangSama
import os
import xml.etree.ElementTree as ET
from multiprocessing import Pool,freeze_support,cpu_count
import imghdr
import logging
def get_all_xml_path(xml_dir:str,filter=['.xml']):
  #遍历文件夹下所有xml
  result=[]
  #maindir是当前搜索的目录 subdir是当前目录下的文件夹名 file是目录下文件名
  for maindir,subdir,file_name_list in os.walk(xml_dir):
    for filename in file_name_list:
      ext=os.path.splitext(filename)[1]#返回扩展名
      if ext in filter:
        result.append(os.path.join(maindir,filename))
  return result
def analysis_xml(xml_path:str):
  tree=ET.parse(xml_path)
  root=tree.getroot()
  result_dict={}
  for obj in root.findall('object'):
    obj_name = obj.find('name').text
    obj_num=result_dict.get(obj_name,0)+1
    result_dict[obj_name]=obj_num
  if imghdr.what(xml_path.replace('.xml','.jpg')) != 'jpeg':
    print(xml_path.replace('.xml','.jpg'),'is worng')
    # logging.info(xml_path.replace('.xml','.jpg'))
  if is_valid_jpg(xml_path.replace('.xml','.jpg')):
    pass
  return result_dict
def analysis_xmls_batch(xmls_path_list:list):
  result_list=[]
  for i in xmls_path_list:
    result_list.append(analysis_xml(i))
  return result_list
def collect_result(result_list:list):
  all_result_dict={}
  for result_dict in result_list:
    for key,values in result_dict.items():
      obj_num=all_result_dict.get(key,0)+values
      all_result_dict[key]=obj_num
  return all_result_dict
def main(xml_dir:str,result_save_path:str =None):
  r'''根据xml文件统计所有样本的数目.对于文件不完整的图片和有xml但无图片的样本,直接进行删除.默认跑满所有的cpu核心
  Parameters
  ----------
  xml_dir : str
    xml所在的文件夹.用的递归形式,因此只需保证xml在此目录的子目录下即可.对应的图片和其xml要在同一目录
  result_save_path : str
    分析结果的日志保存路径.默认 None 无日志
  '''
  if result_save_path is not None:
    assert isinstance(result_save_path,str),'{} is illegal path'.format(result_save_path)
  else:
    logging.basicConfig(filename=result_save_path,filemode='w',level=logging.INFO)
  freeze_support()#windows 上用
  xmls_path=get_all_xml_path(xml_dir)
  worker_num=cpu_count()
  print('your CPU num is',cpu_count())
  length=float(len(xmls_path))/float(worker_num)
  #计算下标,尽可能均匀地划分输入文件的列表
  indices=[int(round(i*length)) for i in range(worker_num+1)]
  #生成每个进程要处理的子文件列表
  sublists=[xmls_path[indices[i]:indices[i+1]] for i in range(worker_num)]
  pool=Pool(processes=worker_num)
  all_process_result_list=[]
  for i in range(worker_num):
    all_process_result_list.append(pool.apply_async(analysis_xmls_batch,args=(sublists[i],)))
  pool.close()
  pool.join()
  print('analysis done!')
  _temp_list=[]
  for i in all_process_result_list:
    _temp_list=_temp_list+i.get()
  result=collect_result(_temp_list)
  logging.info(result)
  print(result)
def is_valid_jpg(jpg_file):
  """判断JPG文件下载是否完整   """
  if not os.path.exists(jpg_file):
    print(jpg_file,'is not existes')
    os.remove(jpg_file.replace('.jpg','.xml'))
  with open(jpg_file, 'rb') as fr:
    fr.seek(-2, 2)
    if fr.read() == b'\xff\xd9':
      return True
    else:
      os.remove(jpg_file)
      os.remove(jpg_file.replace('.jpg','.xml'))
      print(jpg_file)
      logging.error(jpg_file,'is imperfect img')
      return False
if __name__=='__main__':
  test_dir='/home/chiebotgpuhq/Share/winshare/origin'
  save_path='/home/chiebotgpuhq/MyCode/python/pytorch/mmdetection-master/result.log'
  main(test_dir,save_path)
Python 相关文章推荐
Python中用Spark模块的使用教程
Apr 13 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
Python模拟三级菜单效果
Sep 11 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
浅谈pytorch和Numpy的区别以及相互转换方法
Jul 26 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
对python中的高效迭代器函数详解
Oct 18 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 #Python
python基于celery实现异步任务周期任务定时任务
Dec 30 #Python
Django框架之中间件MiddleWare的实现
Dec 30 #Python
Django 路由层URLconf的实现
Dec 30 #Python
python解析多层json操作示例
Dec 30 #Python
pytorch 求网络模型参数实例
Dec 30 #Python
利用python3 的pygame模块实现塔防游戏
Dec 30 #Python
You might like
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
浅析javascript 定时器
2014/12/23 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
Python完成毫秒级抢淘宝大单功能
2019/06/06 Python
Pytorch之Variable的用法
2019/12/31 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
办公室文员自荐书
2014/02/03 职场文书
商场中秋节活动方案
2014/02/07 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
公司董事长岗位职责
2014/06/08 职场文书
环保标语口号
2014/06/13 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS