使用Python分析COCO数据集标注信息:一个简单脚本实现统计与可视化

一、COCO数据集简介

COCO(Common Objects in Context)是目前计算机视觉领域最流行的数据集之一,广泛用于目标检测、实例分割、人体关键点检测等任务。COCO数据集采用JSON格式存储标注信息,包含图片信息、类别信息以及每个目标的标注框(bbox)、分割掩码等。对于从事目标检测研究的同学来说,经常需要分析数据集的标注分布,例如各类别的目标数量、图片分辨率分布等,这有助于理解数据集的构成,为模型训练和评估提供指导。

二、为什么需要分析COCO标注文件

在实际项目中,拿到一个COCO格式的数据集后,我们通常需要回答以下问题:

  • 数据集中有多少张图片?多少个标注框?
  • 类别有哪些?每个类别的标注数量是多少?是否存在类别不平衡?
  • 图片的分辨率分布如何?是否有大量小尺寸图片?

通过分析这些信息,我们可以更好地设计模型输入尺寸、调整数据增强策略,甚至发现数据标注中的错误。手动统计这些信息既繁琐又容易出错,因此编写一个自动化脚本是非常必要的。

三、脚本功能介绍

本文分享的Python脚本可以完成以下功能:

  1. 加载COCO格式的JSON标注文件。
  2. 输出基础统计信息:图片总数、标注总数、类别映射字典。
  3. 统计每个类别的标注数量,并按数量从高到低排序打印。
  4. 统计图片的分辨率分布。
  5. 绘制类别分布的柱状图,并保存为PNG图片。

脚本使用了Python标准库中的jsoncollections.Counter,以及第三方库matplotlib进行可视化。代码简洁易读,非常适合初学者学习和使用。

四、环境准备

在运行脚本之前,请确保你的Python环境已安装必要的库。推荐使用Python 3.6+。

所需库:

  • json(Python内置)
  • collections(Python内置)
  • matplotlib(用于绘图)

安装matplotlib:

bash 复制代码
pip install matplotlib

五、脚本代码

以下是完整的脚本代码。你可以将其保存为analyze_coco.py,并修改文件路径后直接运行。

python 复制代码
import json
from collections import Counter
import matplotlib.pyplot as plt

def analyze_coco_json(file_path):
    print(f"正在加载并分析文件: {file_path} ...\n")
    
    with open(file_path, 'r', encoding='utf-8') as f:
        coco_data = json.load(f)

    # 1. 基础信息提取
    images = coco_data.get('images', [])
    annotations = coco_data.get('annotations', [])
    categories_info = coco_data.get('categories', [])
    
    num_images = len(images)
    num_annotations = len(annotations)
    categories = {cat['id']: cat['name'] for cat in categories_info}

    print("=== 1. 数据集基础统计 ===")
    print(f"图片总数: {num_images}")
    print(f"标注框总数: {num_annotations}")
    print(f"类别映射字典: {categories}\n")

    # 2. 统计各类别标注数量
    cat_counts = Counter([ann['category_id'] for ann in annotations])
    cat_distribution = {categories.get(k, f"Unknown ({k})"): v for k, v in cat_counts.items()}
    
    print("=== 2. 类别分布情况 ===")
    # 按数量从多到少排序
    sorted_cats = dict(sorted(cat_distribution.items(), key=lambda item: item[1], reverse=True))
    for cat, count in sorted_cats.items():
        print(f"  [{cat}]: {count} 个标注")

    # 3. 统计图片分辨率
    resolutions = Counter([(img['width'], img['height']) for img in images])
    print("\n=== 3. 图片分辨率分布 ===")
    for res, count in sorted(resolutions.items(), key=lambda x: x[1], reverse=True):
        print(f"  {res[0]}x{res[1]}: {count} 张图片")
        
    # 4. 绘制类别分布柱状图并保存
    plt.figure(figsize=(8, 5))
    plt.bar(sorted_cats.keys(), sorted_cats.values(), color='#4C72B0')
    plt.title('Annotation Count per Category in COCO Dataset')
    plt.xlabel('Categories')
    plt.ylabel('Number of Annotations (BBoxes)')
    plt.xticks(rotation=45)
    
    # 在柱状图上显示具体数值
    for i, (cat, count) in enumerate(sorted_cats.items()):
        plt.text(i, count + sum(sorted_cats.values())*0.01, str(count), ha='center')

    plt.tight_layout()
    plot_filename = 'category_distribution.png'
    plt.savefig(plot_filename, dpi=300)
    print(f"\n[成功] 类别分布可视化图表已保存为: '{plot_filename}'")

if __name__ == "__main__":
    # 请确保将此处文件名替换为您实际的文件路径
    analyze_coco_json('_annotations.coco.json')

六、运行脚本及结果解读

1. 准备JSON文件

将你的COCO格式标注文件放在脚本同目录下,或者指定绝对路径。脚本默认读取_annotations.coco.json,你需要根据实际情况修改analyze_coco_json()中的文件名。

2. 执行脚本

在终端中运行:

bash 复制代码
python analyze_coco.py

3. 输出示例

假设你的数据集包含3个类别:person、car、dog,脚本运行后控制台会输出类似下面的信息:

复制代码
正在加载并分析文件: _annotations.coco.json ...

=== 1. 数据集基础统计 ===
图片总数: 1000
标注框总数: 8500
类别映射字典: {1: 'person', 2: 'car', 3: 'dog'}

=== 2. 类别分布情况 ===
  [person]: 5000 个标注
  [car]: 2500 个标注
  [dog]: 1000 个标注

=== 3. 图片分辨率分布 ===
  1920x1080: 600 张图片
  1280x720: 300 张图片
  640x480: 100 张图片

[成功] 类别分布可视化图表已保存为: 'category_distribution.png'

4. 生成的图表

脚本会在当前目录下生成category_distribution.png

从图表中可以直观地看到各类别的标注数量,帮助判断数据是否存在长尾分布。

七、自定义与扩展建议

  • 修改类别名称显示 :如果类别名称包含中文,可能需要设置matplotlib支持中文字体,否则可能显示为方框。可以在绘图前加入以下代码:

    python 复制代码
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
  • 统计标注框的尺寸分布 :可以遍历annotations中的bbox字段,提取宽高进行分析。

  • 计算每张图片的标注框数量分布:统计每张图片上有多少个目标,了解图片的密集程度。

  • 输出结果为表格:可以将统计结果保存为CSV文件,便于后续处理。

  • 支持多文件批量分析:将脚本包装成函数,循环处理多个JSON文件。

八、总结

通过这个简单的Python脚本,我们可以快速掌握COCO数据集的标注概况,为后续的模型训练和数据分析打下基础。脚本结构清晰,易于修改和扩展,适合初学者上手实践。如果你在处理其他格式的数据集(如VOC、YOLO),也可以借鉴类似的思路进行统计分析。

希望本文对你有所帮助!如果有任何问题或建议,欢迎在评论区留言交流。

相关推荐
wertyuytrewm1 小时前
自动化与脚本
jvm·数据库·python
智算菩萨1 小时前
【How Far Are We From AGI】4 AGI的“生理系统“——从算法架构到算力基座的工程革命
论文阅读·人工智能·深度学习·算法·ai·架构·agi
qq_417695051 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
problc2 小时前
在 OpenClaw 里一句话记账:消费说出来,账单自动进乖猫记账 App
开发语言·python
紫丁香2 小时前
Dify源码深度剖析3
后端·python·ai·flask·fastapi
@Ma2 小时前
企业微信智能机器人 Python 插件获取回调和发送消息支持文字图片语音视频
python·机器人·企业微信
七夜zippoe2 小时前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
赵谨言2 小时前
基于YOLOv5的海棠花花朵检测识别:文献综述与研究展望
大数据·开发语言·经验分享·python
Cpsu2 小时前
EdgeCrafter:实时目标检测任务新SOTA
人工智能·yolo·目标检测·计算机视觉