python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(-代码)

Python是一种功能强大的编程语言,它提供了许多库和工具,用于处理和可视化数据。在本文中,我们将介绍使用Python绘制热力图,并对VOC数据集中的类别标签进行分布及数量统计。

首先,我们需要导入所需的库。使用`numpy`库来处理数据,`matplotlib`库来绘制热力图。

import numpy as np
import matplotlib.pyplot as plt

接下来,我们需要加载VOC数据集并获取类别标签信息。VOC数据集是一个常用的用于目标检测任务的数据集,其中包含了多个类别的物体标注信息。

假设我们已经加载了VOC数据集,并将类别标签保存在一个名为`labels`的列表中。我们可以使用`numpy`库的`unique`函数获取不重复的类别标签,并使用`numpy`库的`count_nonzero`函数统计每个类别的数量。

labels = [...]  # VOC数据集的类别标签unique_labels, label_counts = np.unique(labels, return_counts=True)

现在,我们可以绘制热力图来可视化类别标签的分布情况。热力图可以直观地显示不同类别的数量。

# 创建一个空的矩阵,大小为类别标签的数量
heatmap = np.zeros((len(unique_labels),))# 将每个类别的数量填充到矩阵中
for label, count in zip(unique_labels, label_counts):heatmap[label] = count# 绘制热力图
plt.imshow([heatmap], cmap='hot')
plt.colorbar()
plt.xlabel('Label')
plt.ylabel('Count')
plt.title('VOC Dataset Label Distribution')
plt.show()

运行以上代码,我们就可以得到一个热力图,横轴表示类别标签,纵轴表示数量统计。颜色越深表示数量越多。

通过绘制热力图,我们可以更好地了解VOC数据集中各个类别的分布情况。这对于分析数据集的特点、优化模型的训练等都非常有帮助。

总结起来,本文介绍了如何使用Python绘制热力图,并对VOC数据集中的类别标签进行分布及数量统计。通过可视化数据,我们可以更好地理解和分析数据集,为后续的任务提供指导和参考。

前言

当你需要统计训练数据中每个类别标签有多少,并且想知道坐标中心分布在图像的位置信息时,你可以利用一下脚本进行计算!

步骤

要绘制热力图来分析VOC数据的分布统计,可以按照以下步骤进行:

 

  • 数据处理:首先,你需要读取VOC数据集的标注文件,可以使用Python中的XML解析库(如xml.etree.ElementTree)或者专门用于处理VOC数据集的工具库(如vocparse)来解析XML文件。解析后,你可以获取每个样本的标注信息,包括目标类别、边界框位置等。
  • 统计数据分布:遍历所有样本的标注信息,统计每个类别在图像中出现的次数或占比。根据需要,你可以选择统计全局的数据分布,或者针对特定区域或图像子集进行统计。将统计结果存储在一个二维数组或字典中,以便后续生成热力图。
  • 绘制热力图:根据统计结果,使用Python中的数据可视化库(如matplotlib、seaborn等)来绘制热力图。热力图可以使用颜色来表示数据的密度或占比。一种常见的绘制方法是使用imshow函数,传入统计结果的二维数组,设置合适的颜色映射和标签等。
代码块 
import os
import xml.etree.ElementTree as ET
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt# VOC数据集路径
dataset_path = 'Annotations/'# 存储标签及其对应的目标框数量
label_counts = {}
image_width = 1280
image_height = 960
block_size = 40# 创建一个二维数组,用于存储每个块中目标框的数量
block_counts = np.zeros((image_height // block_size, image_width // block_size))# 遍历数据集中的每个XML文件
i=0
for filename in os.listdir(dataset_path):if filename.endswith('.xml'):# 解析XML文件tree = ET.parse(os.path.join(dataset_path, filename))root = tree.getroot()# 遍历XML文件中的所有目标框for obj in root.findall('object'):label = obj.find('name').textif label=='vehicle':xmin = int(float(obj.find('bndbox/xmin').text))ymin = int(float(obj.find('bndbox/ymin').text))xmax = int(float(obj.find('bndbox/xmax').text))ymax = int(float(obj.find('bndbox/ymax').text))x_pixel = int((xmin + ymin) / 2)y_pixel = ymax# 将底部中心点映射到相应的像素块block_x = x_pixel // block_sizeblock_y = y_pixel // block_size# 统计该像素块中目标框的数量block_counts[block_y, block_x] += 1i+=1
plt.imshow(block_counts, cmap='hot')
plt.colorbar()# 设置坐标轴
plt.xlabel('Blocks (50x50 pixels)')
plt.ylabel('Blocks (50x50 pixels)')
plt.title('Object Distribution Heatmap')# 显示热力图
plt.show()
print(block_counts)
print("该标签有",i)

 

代码讲解

  • 在进行VOC数据集的类别标签分布和数量统计时,有以下几个需要注意的点:
  • 数据集路径:确保设置正确的数据集路径,指向包含XML文件的文件夹。
  • 标签统计:使用一个字典或其他适合的数据结构来存储每个标签及其对应的目标框数量。可以使用标签作为键,目标框数量作为值。
  • XML解析:使用适当的XML解析库(如xml.etree.ElementTree)解析XML文件。检查XML文件中的标签结构,并定位到目标框的位置信息。
  • 目标框位置信息:目标框通常由左上角和右下角的坐标表示(例如xmin、ymin、xmax、ymax)。确保正确提取这些坐标,并转换为适当的格式。
  • 统计目标框数量:根据目标框的位置信息,可以将它们映射到图像的像素块中,并在相应的像素块中递增目标框数量。这样就可以统计每个像素块中目标框的数量。
  • 绘制热力图:使用合适的可视化库(如matplotlib.pyplot)绘制热力图,以展示目标分布情况。热力图的颜色可以根据目标框数量的大小进行渐变。
  • 坐标轴和标题:设置适当的坐标轴标签和标题,以说明热力图的含义和解释。
  • 显示热力图:使用适当的函数(如plt.show())显示生成的热力图。
     
import os  # 导入os模块,用于文件操作
import xml.etree.ElementTree as ET  # 导入xml.etree.ElementTree模块,用于解析XML文件
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot模块,用于绘图
import numpy as np  # 导入numpy模块,用于科学计算
VOC数据集路径
dataset_path = 'Annotations/'
存储标签及其对应的目标框数量
label_counts = {}
图像的宽度和高度
image_width = 1280
image_height = 960
每个像素块的大小
block_size = 40
创建一个二维数组,用于存储每个块中目标框的数量
block_counts = np.zeros((image_height // block_size, image_width // block_size))
遍历数据集中的每个XML文件
 
i = 0
for filename in os.listdir(dataset_path):if filename.endswith('.xml'):# 解析XML文件tree = ET.parse(os.path.join(dataset_path, filename))root = tree.getroot()
    # 遍历XML文件中的所有目标框for obj in root.findall('object'):label = obj.find('name').text# 判断标签是否为'vehicle'if label == 'vehicle':# 获取目标框的坐标信息xmin = int(float(obj.find('bndbox/xmin').text))ymin = int(float(obj.find('bndbox/ymin').text))xmax = int(float(obj.find('bndbox/xmax').text))ymax = int(float(obj.find('bndbox/ymax').text))# 计算目标框的底部中心点坐标x_pixel = int((xmin + ymin) / 2)y_pixel = ymax# 将底部中心点映射到相应的像素块block_x = x_pixel // block_sizeblock_y = y_pixel // block_size# 统计该像素块中目标框的数量block_counts[block_y, block_x] += 1i += 1

绘制热力图

plt.imshow(block_counts, cmap='hot')
plt.colorbar()

设置坐标轴和标题

plt.xlabel('Blocks (50x50 pixels)')
plt.ylabel('Blocks (50x50 pixels)')
plt.title('Object Distribution Heatmap')

显示热力图 
plt.show()print(block_counts)
print("该标签有", i)#联系 qq 767172261

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查找算法(部分)

顺序查找 顺序查找是最简单的了&#xff0c;属于无序查找算法&#xff0c;它的原理就是从前往后一个一个的找&#xff0c;如果找到了就返回它的位置&#xff0c;否则就返回-1。 如果有多个相同元素的话&#xff0c;返回第一个该元素的位置。 代码&#xff1a; #include<…

Vue3 中使用 Vuex 和 Pinia 对比之 Vuex的用法

本文基于 Vue3 的 composition API 来展开 Vuex 和 Pinia 的用法比较 Pinia传送门 Vuex传送门 Vuex 状态管理的核心概念 状态- 驱动应用的数据源&#xff1b;视图 - 以声明方式将状态映射到视图&#xff1b;操作 - 响应在视图上的用户输入导致的状态变化 下面是源自Vuex 官…

进口零部件三维模型扫描替换抄数建模逆向造型设计服务CASAIM

三维扫描技术在现代制造业中发挥着越来越重要的作用&#xff0c;尤其在零部件建模领域&#xff0c;它能够快速、准确地获取物体的三维数据&#xff0c;为后续的逆向工程和快速原型制造提供了有力支持。 CASAIM三维扫描仪设备通过对零部件进行三维扫描&#xff0c;我们可以获得…

OpenHarmony4.0适配LVDS屏幕驱动

1.概述 手头有一块RK3568的开发板OK3568-C&#xff0c;但是还没有适配OpenHarmony&#xff0c;用的还是LVDS屏幕&#xff0c;但是官方和网上好像还没有OpenHarmony4.0的LVDS屏幕驱动的通用实现&#xff0c;所以决定尝试了一下适配该开发板&#xff0c;完成LVDS屏幕驱动的适配&…

OpenAIOps社区线上宣讲会圆满召开,期待您的加入!

2024年1月12日“OpenAIOps社区”线上宣讲会圆满召开&#xff0c;群体智慧协同创新社区的创立为AIOps领域未来发展注入了活力。OpenAIOps社区是一个AIOps开源社区及创新平台&#xff0c;由中国计算机学会(CCF)、清华大学、南开大学、中科院、国防科大、必示科技等单位共同发起&a…

Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图 窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图&#xff0c;这个图只有一个QBar3DSeries序列&#xff0c;数据是按行存储的&#xff0c;可以有多行。水平方向是行坐标轴和列坐标轴&#xff0c;使用…

Windows安装和使用kafka

一、安装kafka 由于kafka依赖jdk和zookeeper&#xff0c;安装kafka之前需要先安装jdk和zookeeper&#xff0c;也可以使用kafka自带的zookeeper。安装jdk可以参考&#xff1a;Windows和Linux安装jdk&#xff0c;此处使用kafka自带的zookeeper&#xff0c;不单独安装。 下面在Wi…

VUE2/3:element ui table表格的显隐列(若依框架)

若依框架自带一个组件&#xff0c;封装了关于表格&#xff0c;展示和隐藏表格列的功能&#xff1b; 使用效果就是这样的&#xff0c;在表格上面&#xff0c;三个框&#xff0c;从左到右分别是隐藏上面搜索&#xff0c;刷新列表&#xff0c;和显隐列的功能&#xff1b; 一、下面…

每日一题 82. 删除排序链表中的重复元素 II(中等,链表)

和昨天差不多&#xff0c;今天的是把所有重复数字的节点都删除&#xff08;昨天留了一个&#xff09; 显然当我们发现重复数字时&#xff0c;需要重复的第一个数字的前一个节点才能把重复数字删完&#xff0c;所有在while循环中我们每次判断 t.next 和 t.next.next 的值是否重复…

互联网今年都崩盘了gis开发还有前途嘛?

互联网和GIS其实分不开的&#xff0c;尤其是在新兴技术领域。 互联网行业都已经在进军测绘、GIS以及智慧城市、无人驾驶等行业&#xff0c;随着高新技术的发展&#xff0c;互联网和GIS其实结合会越来越紧密。 传统互联网行业已经不能满足大众需求&#xff0c;近十年&#xff…

如何应对Android面试官->我用RecyclerView实现了吸顶效果

前言 RecyclerView 计划用两个章节来讲解&#xff0c;今天主要是以 itemDecoration 和 实现吸顶效果为主&#xff1b; ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 Layout 的偏移&#xff0c;对于绘制 View 之间的分割线&#xff0c;视觉分组边…

用bat脚本执行py文件以及批量执行py文件(全网超详细)

1.前言 对于python代码&#xff0c;每次执行一个文件就要运行一个命令&#xff0c;太过麻烦 在Windows电脑上&#xff0c;想一次性执行多个python文件的代码&#xff0c;就需要用到bat脚本 2.python代码 先写几个python代码的文件 如下图 3.py文件为中文&#xff0c;用bat执…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

腾讯云价格计算器怎么用?太简单了一键报价

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff1a; 腾讯云服务器价格计算器 打开腾…

❤ React报错问题分析

❤ React报错问题分析 ❤️ You passed a second argument to root.render(…) but it only accepts one argument. You passed a second argument to root.render(…) but it only accepts one argument. react-dom.development.js:86 Warning: You passed a second argumen…

css 居中方式

居中分为水平居中和垂直居中

C++ 数组分页,经常有用到分页,索性做一个简单封装 已解决

在项目设计中&#xff0c; 有鼠标滑动需求&#xff0c;但是只能说能力有限&#xff0c;索性使用 php版本的数组分页&#xff0c;解决问题。 经常有用到分页&#xff0c;索性做一个简单封装、 测试用例 QTime curtime QTime::currentTime();nHour curtime.hour();nMin curtim…

各种排序算法学习笔记

Docshttps://r0dhfl3ujy9.feishu.cn/docx/XFlEdnqv9oCEoVx7ok8cpc4knnf?fromfrom_copylink如果你认为有错误&#xff0c;欢迎指出&#xff01;

Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

效果效果官方案例 区别&#xff1a;官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 createReflector() {const plane this.helper.create.plane(2, 2);this.helper.add(plane.mesh);plane.mesh.rotat…

juniper EX系列交换机POE配置

PoE&#xff08;Power over Ethernet&#xff0c;以太网供电&#xff0c;又称远程供电&#xff09;是指设备通过以太网接口&#xff0c;利用双绞线对外接PD&#xff08;Powered Device&#xff0c;受电设备&#xff09;设备&#xff08;如IP 电话、无线AP、网络摄像头等&#x…