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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 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').text
            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_size
                block_y = y_pixel // block_size

                # 统计该像素块中目标框的数量
                block_counts[block_y, block_x] += 1
                i+=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_size
            block_y = y_pixel // block_size

            # 统计该像素块中目标框的数量
            block_counts[block_y, block_x] += 1
            i += 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 1309399183
相关文章
|
8天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
16 1
|
9天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
9天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
6天前
|
分布式计算 并行计算 大数据
Python编程中的高效数据处理技巧
Python编程中的高效数据处理技巧
17 0
|
8天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
16 0
|
2天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
4天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
3天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
2天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!