关于目标检测任务中,XML(voc格式)标注文件的可视化

1. 前言

最近在弄关于目标检测的任务,因为检测的图片和标签是分开的,可视化效果不明显,也不知道随便下载的数据集,标注信息对不对。网上看了好多代码,代码风格和本人平时不同,看起来麻烦,也不知道怎么更改,于是按照自己的编码风格,写了个可视化脚本,这里做下记录

本章可视化的数据格式是VOC格式,即标注文件是XML文件,边界框是左上角和右下角的两个点

下面是代码的目录结构,1.jpeg 是数据图像,1.xml是对应的标签信息

result.png 是保存的绘制好边界框的图像

2. 关于代码

代码部分

2.1 自定义函数传入的路径

如下,根据上图摆放好的数据目录,将img_path 传入图片。

对应的 xml 这里是代码生成的,因为大部分数据的标签和训练图像仅仅是目录和后缀的不同,文件名是相同的

2.2 自定义可视化函数

自定义函数传入的三个参数就是原始图片、图片对应的xml标签,save 是展示后是否保存,这里默认保存

如下,parse_xml_to_dict 也是自定义函数,大概就是将xml文件按照树状图的形式解析成层层的字典。看控制台的输出部分,data 就是xml 文件的内容

接下来就是根据解析的字典,读取里面的边界框和检测类别

XML标注格式的文件,目标在<object>下面

因为每张图片的目标不是只有一个,所有用for循环遍历,如下每个i就是一个完整的目标

通过字典的key将对应的value读取出来,然后用列表仅仅保存边界框和分类的名称

值得注意的是,XML标注的目标类别就是真实的类别,而非yolo格式的0 1 2 索引,所以这里绘制边界框是不需要json文件的

xml生成json类别字典文件,可以查看:目标检测篇:如何根据xml标注文件生成类别classes的json文件

关键的信息提取好了,就可以绘制边界框了,通过打印,可以发现ob里面存放的就是我们需要的部分(name、xmin、ymin、xmax、ymax)

绘制的部分很简单,利用cv就行了

2.3 绘制结果

因为大部分训练图像size很大,cv窗口展示不出来,所以这里查看生成的result.png文件

  • 想要同时展示多张绘制好的图片,可以利用for循环嵌套,或者用dataloader和plt结合等等
  • 待会看看能不能把YOLO格式txt的可视化数据写出来,因为yolo标注的相对信息和类别索引,可能会相对复杂一些

 

3. 完整代码

如下:

from lxml import etree
import cv2


# 读取 xml 文件信息,并返回字典形式
def parse_xml_to_dict(xml):
    if len(xml) == 0:  # 遍历到底层,直接返回 tag对应的信息
        return {xml.tag: xml.text}

    result = {}
    for child in xml:
        child_result = parse_xml_to_dict(child)  # 递归遍历标签信息
        if child.tag != 'object':
            result[child.tag] = child_result[child.tag]
        else:
            if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里
                result[child.tag] = []
            result[child.tag].append(child_result[child.tag])
    return {xml.tag: result}


# xml 标注文件的可视化
def xmlShow(img,xml,save = True):
    image = cv2.imread(img)
    with open(xml, encoding='gb18030', errors='ignore') as fid:  # 防止出现非法字符报错
        xml_str = fid.read()
    xml = etree.fromstring(xml_str)
    data = parse_xml_to_dict(xml)["annotation"]  # 读取 xml文件信息

    ob = []         # 存放目标信息
    for i in data['object']:        # 提取检测框
        name = str(i['name'])        # 检测的目标类别

        bbox = i['bndbox']
        xmin = int(bbox['xmin'])
        ymin = int(bbox['ymin'])
        xmax = int(bbox['xmax'])
        ymax = int(bbox['ymax'])

        tmp = [name,xmin,ymin,xmax,ymax]    # 单个检测框
        ob.append(tmp)

    # 绘制检测框
    for name,x1,y1,x2,y2 in ob:
        cv2.rectangle(image,(x1,y1),(x2,y2),color=(255,0,0),thickness=2)    # 绘制矩形框
        cv2.putText(image,name,(x1,y1-10),fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=0.5,thickness=1,color=(0,0,255))

    # 保存图像
    if save:
        cv2.imwrite('result.png',image)

    # 展示图像
    cv2.imshow('test',image)
    cv2.waitKey()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    img_path = './my_xml_dataset/train/images/1.jpeg'  # 传入图片

    labels_path = img_path.replace('images', 'labels')       # 自动获取对应的 xml 标注文件
    labels_path = labels_path.replace('.jpeg', '.xml')

    xmlShow(img=img_path, xml=labels_path,save=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0c;基于web页面实现任务调度配置与记录&#xff0c;使用简单&#xff0c;上手快速&#xff0c;其主要功能特性如下&#xff1a; 使用简单&…

ClickHouse基础介绍

目录 前言 1、什么是clickhouse 2、OLAP场景的关键特征 3、列式存储更适合于OLAP场景的原因 4、clickhouse的独特功能 5、clickhouse的缺点 6、性能 6.1、单个大查询的吞吐量 6.2、处理短查询的延迟时间 6.3、处理大量短查询的吞吐量 6.4、数据的写入性能 前言 11月…

RTSP/Onvif安防平台EasyNVR接入EasyNVS显示服务不存在的原因及解决办法

EasyNVS云管理平台具备汇聚与管理EasyGBS、EasyNVR等平台的能力&#xff0c;可以将接入的视频资源实现统一的视频能力输出&#xff0c;支持远程可视化运维等管理功能&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户在现场部署EasyNVR&#xff0c;…

how2heap-2.23-04-unsorted_bin_leak

#include<stdio.h> #include<malloc.h>int main() {char* a malloc(0x88);char* b malloc(0x8);free(a);long* c malloc(0x88);printf("%lx , %lx\n",c[0],c[1]);return 0; }unsorted bin leak原理&#xff1a;将chunk从unsorted bin申请回来时&#…

ssm基于web的素材网的设计与实现+vue论文

基于web的素材网站的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的素材信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理…

安卓逆向某脚本-stringFog 拆解

引言 有个autojs 脚本软件,挺好用的,我想看下这个软件怎么实现的,学习写人家怎么写的。 先用MT 重新打包下, 看下重打包之后是否还可以继续使用。 用MT 打开APK,然后选择查看 随便找一个dex ,编辑下

02、Kafka ------ 配置 Kafka 集群

目录 配置 Kafka 集群配置步骤启动各Kafka节点 配置 Kafka 集群 启动命令&#xff1a; 1、启动 zookeeper 服务器端 小黑窗输入命令&#xff1a; zkServer 2、启动 zookeeper 的命令行客户端工具 &#xff08;这个只是用来看连接的节点信息&#xff0c;不启动也没关系&#…

数据结构与算法(六)

文章目录 高频-体系学习班(六)41 四边形不等式技巧(上)41.1 非负数组切分成左右两部分累加和的最大值41.2 非负数组切分成左右两部分累加和的最大值的数组41.3 合并石子的得分41.4 画匠问题42 四边形不等式技巧(下)42.1 邮局选址问题42.2 丢棋子问题43 状态压缩的动态规划…

RabbitMQ安装与应用

文章目录 1. RabbitMQ1.1. 同步通讯与异步通讯1.2. 异步通讯的优缺点1.3. 几种MQ的对比1.4. docker安装运行RabbitMQ 流程1.5. RabbitMQ的几个概念1.6. 五种模型1.6.1. 基本消息队列 1.7. 基本使用1.7.1. 1建立连接时会出现以下界面![在这里插入图片描述](https://img-blog.csd…

MFC扩展库BCGControlBar Pro v34.0 - 网格、报表控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.0已正式发布了&#xff0c;该版本包括新的主题任务对话框、图像效果、旋转圆形刻度、…

[电子榨菜]状态管理redux,以及react-redux

0.写在前面 很遗憾&#xff0c;最终还是没能入围2023年的博客评选。 不过不管怎么说&#xff0c;今年需要开个好头。 迫于成本压力吧&#xff0c;最终还是没能顺利离开这里。。。。。。 其实白天已经能放的下啦&#xff0c;我给自己买了喜欢的玩具&#xff0c;去了喜欢的漫…

MySQL:约束主键唯一键

表的约束&#xff1a;表中一定有约束&#xff0c;通过约束让插入表中的数据是符号预期的 约束的本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据 Null约束 这里的Null表示在插入的时候&#xff0c;该属性能否为空&#xff0c;如果是NO&#xff0c;则插入时候必须有数…

《Effective C++》《Resource Management》

文章目录 13、term13:Use objects to manage resources14、term14:Think carefully about copying behavior in resource-managing classes15、term15:Provide access to raw resources in resource-managing classes法一&#xff1a; 使用智能指针的get进行显示转换法二&#…

第11课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo10并修改demo10为demo11…

Python数据分析从入门到进阶:分类算法

数据分析是处理和解释数据以发现有用信息和洞察的过程。其中&#xff0c;分类算法是数据分析领域的一个重要组成部分&#xff0c;它用于将数据分为不同的类别或组。 本文将介绍分类算法的基本概念和进阶技巧&#xff0c;以及如何在Python中应用这些算法&#xff0c;包括示例代…

01.微服务架构优缺点、服务拆分和远程调用

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

企业招聘信息查询API:招聘市场情报站,一键了解就业机会

前言 在当今这个信息爆炸的时代&#xff0c;快速、准确地获取企业招聘信息对于求职者来说至关重要。为了满足这一需求&#xff0c;企业招聘信息查询API应运而生&#xff0c;它为求职者提供了一个便捷、高效的平台&#xff0c;帮助用户快速了解企业的招聘动态。本文将详细介绍企…

众和策略:全国期货市场成交量同比增长25%

近来&#xff0c;我国期货业协会发布2023年12月全国期货商场生意状况数据。以单边核算&#xff0c;12月全国期货生意商场成交量为6.91亿手&#xff0c;成交额为480437.25亿元&#xff0c;同比分别添加4.48%和0.08%&#xff0c;环比分别下降12.58%和12.49%。2023年1-12月&#x…

AI写作生成器哪个好用一点,试试下面这五款

AI写作生成器在当今信息时代的快速发展中&#xff0c;成为了许多人的选择。然而&#xff0c;面对市场上众多的AI写作生成器&#xff0c;我们很难判断哪个更好用一点。为了解决这个问题&#xff0c;本文将介绍并使用下面这五款AI写作生成器&#xff0c;以帮助大家做出更明智的选…

使用 SpringSecurity 发送POST请求出现 403

问题场景 在使用 SpringSecurity 时对一些访问权限进行了设置, 在用户请求资源时出现了403错误 , 通过检查代码发现请求权限是开放的, 并且切换成 GET 请求也是可以通过, 换成POST 请求就无法通过。 解决方法 在 SpringSecurity 中关闭 CSRF 因为 前端向后台发送 post 请求…