统计xml文件包含的标注信息 parse_dataset_annotation

统计xml文件包含的标注信息 parse_dataset_annotation

YOLO算法,统计标注的xml文件中包含的标记框信息

创建parse_dataset_annotation.py

import os
import sys
filedir = os.path.dirname(sys.argv[0])      #获取脚本所在目录
os.chdir(filedir)       #将脚本所在的目录设置为工作目录
wdir = os.getcwd()
print('当前工作目录:{}\n'.format(wdir))      #打印当前工作目录

from xml.dom.minidom import parse

def xml_parser( xml_file ):
    '''
    Parse an xml file and return the annotation info in the file

    :param xml_file: the xml file name to be parsed
    :return: file_name, width, height, objects.
        file_name, filename of the xml file (without extension)
        width, width of the annotated image
        height, height of the annotated image
        objects, annotated objects in the image
        object, (object_name, xmin, ymin, xmax, ymax)
            object_name, name of the annotated object
            xmin, ymin, xmax, ymax, coordinate of the bounding box of the object

    '''
    DOMTree = parse( xml_file )
    collection = DOMTree.documentElement #得到xml文件的根节点
    file_name_xml = collection.getElementsByTagName( 'filename' )[0]
    objects_xml = collection.getElementsByTagName( 'object' )
    size_xml = collection.getElementsByTagName( 'size' )

    file_name = file_name_xml.childNodes[0].data

    for size in size_xml:
        width = size.getElementsByTagName( 'width' )[0]
        height = size.getElementsByTagName( 'height' )[0]

        width = width.childNodes[0].data
        height = height.childNodes[0].data

    objects = []
    for object_xml in objects_xml:
        object_name = object_xml.getElementsByTagName( 'name' )[0]
        bdbox = object_xml.getElementsByTagName( 'bndbox' )[0]
        xmin = bdbox.getElementsByTagName( 'xmin' )[0]
        ymin = bdbox.getElementsByTagName( 'ymin' )[0]
        xmax = bdbox.getElementsByTagName( 'xmax' )[0]
        ymax = bdbox.getElementsByTagName( 'ymax' )[0]

        object = [ object_name.childNodes[0].data,
                   float(xmin.childNodes[0].data),
                   float(ymin.childNodes[0].data),
                   float(xmax.childNodes[0].data),
                   float(ymax.childNodes[0].data) ]

        objects.append( object )

    return file_name, int(width), int(height), objects
    
image_dir = 'images'    
xml_dir = 'labels'
xml_files = os.listdir(xml_dir)
image_files = os.listdir(image_dir)
image_ext = image_files[0].split('.')[-1] #图片文件的扩展名
print(image_ext)
if len(image_files) == len(xml_files):
    print('共有{:d}个xml文件。'.format(len(xml_files)))
else:
    print('图片数量和xml文件数量不一致。')
obj_dict = {}
for xml_file in xml_files:
    annotation = xml_parser(os.path.join(xml_dir, xml_file))
    name_1 = xml_file.split('.')[0] + '.' + image_ext.lower()
    name_2 = xml_file.split('.')[0] + '.' + image_ext.upper()
    if  name_1 not in image_files and name_2 not in image_files:
        print('{:s}没有对应的图片。'.format(xml_file))
    for obj in annotation[-1]:
        key = obj[0]
        x = (obj[1] + obj[3])/2
        y = (obj[2] + obj[4])/2
        width = obj[3] - obj[1]
        height = obj[4] - obj[2]
        box = [x,y,width,height]
        if key in obj_dict:
            obj_dict[key][0] += 1
            n = obj_dict[key][0]
            obj_dict[key][1:5] = [ (i*(n-1)+j)/(n) for i,j in zip(obj_dict[key][1:5] , box)]
            #obj_dict[key][5:9] = [ i if i>=j else j for i,j in zip(obj_dict[key][5:9] , box)]
            #obj_dict[key][9:] = [ i if i>=j else j for i,j in zip(obj_dict[key][9:] , box)]
        else:
            obj_dict[key] = []
            obj_dict[key].append(1)  # 0,个数
            obj_dict[key] += box     # 1-4, 平均坐标
            #obj_dict[key] += box     # 5-8, 最大值
            #obj_dict[key] += box     # 9-12,最小值
for key,value in obj_dict.items():
    print('一共有 {:4d} 个 {:20s},其边框平均位置为{:4.0f} *{:4.0f};平均尺寸为{:3.0f} *{:3.0f}。'.format(value[0],key,*value[1:]))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2159.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电商扣减库存_电商后台系统产品逻辑全解析[通俗易懂]

    电商扣减库存_电商后台系统产品逻辑全解析[通俗易懂]作者:刘志远,电商产品经理,主导过多业务的电商产品搭建、更新迭代。微信公众号:碎碎恋产品,喜欢闲侃产品设计、商业分析以及后台挖坑一、产品经理(现实的理想主义者,对产品有着无比认真的态度,同时能够适当妥协,利用有限的资源来推动产品目标的达成)日常工作:了解用户和市场(学会把用户需求转化为产品需求)、设计产品方案(评定需求优先级)、跟进开发进度、跟进用户反馈,优化迭代电子商务的几种模式:B2C(B…

    2022年10月1日
    4
  • linux工具箱_docker ps命令

    linux工具箱_docker ps命令1.gdb调试利器GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于一名Linux下工作的c++程序员,gdb是必不可少的工具;1.1.启动gdb对C/C++程序的调试,需要在编译前就加上-g选项:$g++-ghello.cpp-ohello调试可执行文件:$gdbprogram也就是你的执行文件,一般在当前目录下。调试core文件(core是程序非法执行后coredump后产生的文件):$gdb$gdb

    2025年11月15日
    2
  • ureport 显示html,UReport2 与业务结合

    ureport 显示html,UReport2 与业务结合本小节中我们将介绍如何在业务页面中展示报表、导出报表文件、引用报表内容等操作。报表相关URL在配置好一个包含UReport2的项目后,就可以运行我们的项目,打开UReport2的基于网页的报表设计器,它的地址如下:UReport2报表设计器URLhttp://host[:port][/context-path]/ureport/designer如果我们是在本地启动项目,并且服务器端口号为8080,…

    2025年7月3日
    7
  • 什么是移动端开发【重点学习系列—干货十足–一万字详解】

    什么是移动端开发【重点学习系列—干货十足–一万字详解】引言这一篇文章主要对移动端开发相关的基础知识点,进行总结。从移动端开发的一些概念、专有名词、缩放、viewport移动端事件、适配问题以及一些工作中沟通经常会用到这些方面来说一下移动端1-移动端开发相关概念移动端特点移动端与PC端网页有所不同,有以下几个特点小屏幕触摸交互屏幕尺寸繁多屏幕大小​屏幕大小指屏幕的对角线的长度,单位一般是英寸。常见的手机屏幕大小3.5、4…

    2022年6月24日
    38
  • 在阿里云申请商标注册步骤详细教程视频_阿里云商标注册不予处理

    在阿里云申请商标注册步骤详细教程视频_阿里云商标注册不予处理近年来国内商标注册申请量的迅猛增长,然而,并不是你申请商标就能下来,很多情况下,你申请的商标,很有可能会失败,而且申请的费用就打水漂了。说白了就是,你申请商标的钱,不会因为你申请商标的失败,还会再退给

    2022年8月6日
    7
  • vagrant 登录不了

    vagrant 登录不了

    2022年2月18日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号