一、coco数据集简介
coco(common objects in context)是目前计算机视觉领域最流行的数据集之一,广泛用于目标检测、实例分割、人体关键点检测等任务。coco数据集采用json格式存储标注信息,包含图片信息、类别信息以及每个目标的标注框(bbox)、分割掩码等。对于从事目标检测研究的同学来说,经常需要分析数据集的标注分布,例如各类别的目标数量、图片分辨率分布等,这有助于理解数据集的构成,为模型训练和评估提供指导。
二、为什么需要分析coco标注文件
在实际项目中,拿到一个coco格式的数据集后,我们通常需要回答以下问题:
- 数据集中有多少张图片?多少个标注框?
- 类别有哪些?每个类别的标注数量是多少?是否存在类别不平衡?
- 图片的分辨率分布如何?是否有大量小尺寸图片?
通过分析这些信息,我们可以更好地设计模型输入尺寸、调整数据增强策略,甚至发现数据标注中的错误。手动统计这些信息既繁琐又容易出错,因此编写一个自动化脚本是非常必要的。
三、脚本功能介绍
本文分享的python脚本可以完成以下功能:
- 加载coco格式的json标注文件。
- 输出基础统计信息:图片总数、标注总数、类别映射字典。
- 统计每个类别的标注数量,并按数量从高到低排序打印。
- 统计图片的分辨率分布。
- 绘制类别分布的柱状图,并保存为png图片。
脚本使用了python标准库中的json、collections.counter,以及第三方库matplotlib进行可视化。代码简洁易读,非常适合初学者学习和使用。
四、环境准备
在运行脚本之前,请确保你的python环境已安装必要的库。推荐使用python 3.6+。
所需库:
json(python内置)collections(python内置)matplotlib(用于绘图)
安装matplotlib:
pip install matplotlib
五、脚本代码
以下是完整的脚本代码。你可以将其保存为analyze_coco.py,并修改文件路径后直接运行。
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. 执行脚本
在终端中运行:
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支持中文字体,否则可能显示为方框。可以在绘图前加入以下代码:
plt.rcparams['font.sans-serif'] = ['simhei'] # 用来正常显示中文标签 plt.rcparams['axes.unicode_minus'] = false # 用来正常显示负号
统计标注框的尺寸分布:可以遍历annotations中的bbox字段,提取宽高进行分析。
计算每张图片的标注框数量分布:统计每张图片上有多少个目标,了解图片的密集程度。
输出结果为表格:可以将统计结果保存为csv文件,便于后续处理。
支持多文件批量分析:将脚本包装成函数,循环处理多个json文件。
八、总结
通过这个简单的python脚本,我们可以快速掌握coco数据集的标注概况,为后续的模型训练和数据分析打下基础。脚本结构清晰,易于修改和扩展,适合初学者上手实践。如果你在处理其他格式的数据集(如voc、yolo),也可以借鉴类似的思路进行统计分析。
到此这篇关于python脚本实现统计与可视化coco数据集标注信息的文章就介绍到这了,更多相关python分析coco数据集内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论