python绘制热力图-数据处理-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').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
相关文章
|
22天前
|
存储 监控 API
Python实战:跨平台电商数据聚合系统的技术实现
本文介绍如何通过标准化API调用协议,实现淘宝、京东、拼多多等电商平台的商品数据自动化采集、清洗与存储。内容涵盖技术架构设计、Python代码示例及高阶应用(如价格监控系统),提供可直接落地的技术方案,帮助开发者解决多平台数据同步难题。
|
25天前
|
存储 JSON 算法
Python集合:高效处理无序唯一数据的利器
Python集合是一种高效的数据结构,具备自动去重、快速成员检测和无序性等特点,适用于数据去重、集合运算和性能优化等场景。本文通过实例详解其用法与技巧。
76 0
|
6天前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
9天前
|
数据采集 数据可视化 关系型数据库
基于python大数据的电影数据可视化分析系统
电影分析与可视化平台顺应电影产业数字化趋势,整合大数据处理、人工智能与Web技术,实现电影数据的采集、分析与可视化展示。平台支持票房、评分、观众行为等多维度分析,助力行业洞察与决策,同时提供互动界面,增强观众对电影文化的理解。技术上依托Python、MySQL、Flask、HTML等构建,融合数据采集与AI分析,提升电影行业的数据应用能力。
|
18天前
|
数据可视化 大数据 数据挖掘
基于python大数据的招聘数据可视化分析系统
本系统基于Python开发,整合多渠道招聘数据,利用数据分析与可视化技术,助力企业高效决策。核心功能包括数据采集、智能分析、可视化展示及权限管理,提升招聘效率与人才管理水平,推动人力资源管理数字化转型。
|
Web App开发 数据采集 前端开发
用Python统计你的简书数据
写在前面   说来也巧,之前有一次无意间留意到简书好像没有做文章总阅读量的统计(准确的说法应该叫展示),刚好最近有时间,趁这个机会就用Python写了这么个功能,既是学习也是练手。
1459 0
|
9天前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
180 102
|
9天前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
177 104
|
9天前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
171 103
|
9天前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
118 82

推荐镜像

更多