Github仓库:gy-7/coco_EDA (github.com)

对coco数据集的分析,近期忙着写论文,空余时间很少能写博文了。

EDA的代码放在结尾了,Github仓库里也有。仓库里还有其他的一些EDA分析,不定时更新。

训练集所有类别的数量分布情况:

训练集所有类别的尺寸分布情况:

验证集所有类别的数量分布情况:

验证集所有类别的尺寸分布情况:

EDA代码:

import os
import seaborn as sns
import pycocotools.coco
import matplotlib.pyplot as plt root_dir = os.getcwd()
train_ann_fp = os.path.join(root_dir, 'annotations', 'instances_train2017.json')
val_ann_fp = os.path.join(root_dir, 'annotations', 'instances_val2017.json') class COCO_EDA:
def __init__(self, json_file, type='train'):
self.COCO_SMALL_SCALE = 32
self.COCO_MEDIUM_SCALE = 96 self.json_file = json_file
coco = pycocotools.coco.COCO(json_file) self.type = type
self.imgs = coco.dataset['images']
self.anns = coco.dataset['annotations']
self.cats = coco.dataset['categories']
self.img_ids = coco.getImgIds()
self.ann_ids = coco.getAnnIds()
self.cat_ids = coco.getCatIds() self.cat2imgs = coco.catToImgs
self.img2anns = coco.imgToAnns self.imgs_num = len(self.imgs)
self.objs_num = len(self.anns) # data to be collected
self.small_objs_num = 0
self.medium_objss_num = 0
self.large_objss_num = 0 self.small_objs = []
self.medium_objs = []
self.large_objs = [] self.cat2objs = {}
self.small_cat2objs = {} # small objects classes distribution
self.medium_cat2objs = {} # medium objects classes distribution
self.large_cat2objs = {} # large objects classes distribution
self.cat2objs_num = {} # objects classes distribution
self.small_cat2objs_num = {} # small objects classes distribution
self.medium_cat2objs_num = {} # medium objects classes distribution
self.large_cat2objs_num = {} # large objects classes distribution # plot use data
self.catid2name = {} # 用于绘图中显示类别名字
self.cats_plot = [] # coco 所有尺寸目标的类别分布
self.small_cats_plot = [] # 小目标中每个类的分布情况
self.medium_cats_plot = [] # 中目标中每个类的分布情况
self.large_cats_plot = [] # 大目标中每个类的分布情况 # 每个类的小,中,大目标的数量
self.size_distribution = {} def collect_data(coco):
# collect small, medium, large objects
for ann in coco.anns:
if ann['area'] < coco.COCO_SMALL_SCALE ** 2:
coco.small_objs_num += 1
coco.small_objs.append(ann)
elif ann['area'] < coco.COCO_MEDIUM_SCALE ** 2:
coco.medium_objs.append(ann)
coco.medium_objss_num += 1
else:
coco.large_objs.append(ann)
coco.large_objss_num += 1 for i in coco.cat_ids:
coco.cat2objs[i] = []
coco.small_cat2objs[i] = []
coco.medium_cat2objs[i] = []
coco.large_cat2objs[i] = []
coco.cat2objs_num[i] = 0
coco.small_cat2objs_num[i] = 0
coco.medium_cat2objs_num[i] = 0
coco.large_cat2objs_num[i] = 0
coco.size_distribution[i] = [] for i in coco.cats:
coco.catid2name[i['id']] = i['name'] # collect small, medium, large class distribution
for i in coco.anns:
coco.cat2objs[i['category_id']].append(i)
coco.cat2objs_num[i['category_id']] += 1
coco.cats_plot.append(coco.catid2name[i['category_id']])
if i['area'] < coco.COCO_SMALL_SCALE ** 2:
coco.small_cat2objs[i['category_id']].append(i)
coco.small_cat2objs_num[i['category_id']] += 1
coco.small_cats_plot.append(coco.catid2name[i['category_id']])
coco.size_distribution[i['category_id']].append('s')
elif i['area'] < coco.COCO_MEDIUM_SCALE ** 2:
coco.medium_cat2objs[i['category_id']].append(i)
coco.medium_cat2objs_num[i['category_id']] += 1
coco.medium_cats_plot.append(coco.catid2name[i['category_id']])
coco.size_distribution[i['category_id']].append('m')
else:
coco.large_cat2objs[i['category_id']].append(i)
coco.large_cat2objs_num[i['category_id']] += 1
coco.large_cats_plot.append(coco.catid2name[i['category_id']])
coco.size_distribution[i['category_id']].append('l') assert len(coco.small_objs) == coco.small_objs_num == sum(coco.small_cat2objs_num.values())
assert len(coco.medium_objs) == coco.medium_objss_num == sum(coco.medium_cat2objs_num.values())
assert len(coco.large_objs) == coco.large_objss_num == sum(coco.large_cat2objs_num.values())
assert len(coco.anns) == coco.objs_num == sum(coco.cat2objs_num.values()) def plot_coco_class_distribution(plot_data, plot_order, save_fp, plot_title, plot_y_heigh,
plot_y_heigh_residual=[1800, 100]):
# 绘制coco数据集的类别分布
sns.set_style("whitegrid")
plt.figure(figsize=(15, 8)) # 图片的宽和高,单位为inch
plt.title(plot_title, fontsize=9) # 标题
plt.xlabel('class', fontsize=8) # x轴名称
plt.ylabel('counts', fontsize=8) # y轴名称
plt.xticks(rotation=90, fontsize=8) # x轴标签竖着显示
plt.yticks(fontsize=8)
for x, y in enumerate(plot_y_heigh):
if 'train' in save_fp:
plt.text(x, y + plot_y_heigh_residual[0], '%s' % y, ha='center', fontsize=7, rotation=90)
else:
plt.text(x, y + plot_y_heigh_residual[1], '%s' % y, ha='center', fontsize=7, rotation=90)
ax = sns.countplot(x=plot_data, palette="PuBu_r", order=plot_order) # 绘制直方图,palette调色板,蓝色由浅到深渐变。
# palette样式:https://blog.csdn.net/panlb1990/article/details/103851983
plt.savefig(os.path.join(save_fp), dpi=500)
plt.show() def plot_size_distribution(plot_data, save_fp, plot_title, plot_order=['s', 'm', 'l']):
sns.set_style("whitegrid")
plt.figure(figsize=(21, 35)) # 图片的宽和高,单位为inch
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=1, hspace=1.5) # 调整子图间距 for idx, size_data in enumerate(plot_data.values()):
plt.subplot(10, 8, idx + 1)
plt.xticks(rotation=0, fontsize=18) # x轴标签竖着显示
plt.yticks(fontsize=18)
plt.xlabel('size', fontsize=20) # x轴名称
plt.ylabel('count', fontsize=20) # y轴名称
plt.title(plot_title[idx], fontsize=24) # 标题
sns.countplot(x=size_data, palette="PuBu_r", order=plot_order) # 绘制直方图,palette调色板,蓝色由浅到深渐变。 plt.savefig(save_fp, dpi=500, pad_inches=0)
plt.show() def run_plot_coco_class_distribution(coco, save_dir):
# # 绘制coco数据集的类别分布
plot_order = [i for i in coco.catid2name.values()] plot_heigh = [i for i in coco.cat2objs_num.values()]
save_fp = os.path.join(save_dir, f'coco_{coco.type}_class_distribution.png')
plot_coco_class_distribution(coco.cats_plot, plot_order, save_fp, 'COCO train2017 class distribution', plot_heigh,
plot_y_heigh_residual=[1800, 100]) plot_heigh = [i for i in coco.small_cat2objs_num.values()]
save_fp = os.path.join(save_dir, f'coco_{coco.type}_small_class_distribution.png')
plot_coco_class_distribution(coco.small_cats_plot, plot_order, save_fp, 'COCO train2017 small class distribution',
plot_heigh,
plot_y_heigh_residual=[900, 50]) plot_heigh = [i for i in coco.medium_cat2objs_num.values()]
save_fp = os.path.join(save_dir, f'coco_{coco.type}_medium_class_distribution.png')
plot_coco_class_distribution(coco.medium_cats_plot, plot_order, save_fp, 'COCO train2017 medium class distribution',
plot_heigh, plot_y_heigh_residual=[900, 50]) plot_heigh = [i for i in coco.large_cat2objs_num.values()]
save_fp = os.path.join(save_dir, f'coco_{coco.type}_large_class_distribution.png')
plot_coco_class_distribution(coco.large_cats_plot, plot_order, save_fp, 'COCO train2017 large class distribution',
plot_heigh,
plot_y_heigh_residual=[900, 50]) def run_plot_coco_size_distribution(coco, save_dir):
# 绘制coco数据集各类别的尺寸分布
plot_order = [i for i in coco.catid2name.values()]
save_fp = os.path.join(save_dir, f'coco_{coco.type}_size_distribution.png')
plot_size_distribution(coco.size_distribution, save_fp, plot_order) if __name__ == '__main__':
print("analyze coco train dataset...")
print("-" * 50)
coco_train = COCO_EDA(train_ann_fp, type='train')
collect_data(coco_train)
print("coco train images num:", coco_train.imgs_num)
print("coco train objects num:", coco_train.objs_num)
print("coco small objects num:", coco_train.small_objs_num)
print("coco medium objects num:", coco_train.medium_objss_num)
print("coco large objects num:", coco_train.large_objss_num)
print("coco small objects percent:", coco_train.small_objs_num / coco_train.objs_num)
print("coco medium objects percent:", coco_train.medium_objss_num / coco_train.objs_num)
print("coco large objects percent:", coco_train.large_objss_num / coco_train.objs_num)
run_plot_coco_class_distribution(coco_train, ".\\EDA")
run_plot_coco_size_distribution(coco_train, ".\\EDA")
print("-" * 50)
print() print("analyze coco val dataset...")
print("-" * 50)
coco_val = COCO_EDA(val_ann_fp, type='val')
collect_data(coco_val)
print("coco val images num:", coco_val.imgs_num)
print("coco val objects num:", coco_val.objs_num)
print("coco small objects num:", coco_val.small_objs_num)
print("coco medium objects num:", coco_val.medium_objss_num)
print("coco large objects num:", coco_val.large_objss_num)
print("coco small objects percent:", coco_val.small_objs_num / coco_val.objs_num)
print("coco medium objects percent:", coco_val.medium_objss_num / coco_val.objs_num)
print("coco large objects percent:", coco_val.large_objss_num / coco_val.objs_num)
run_plot_coco_class_distribution(coco_val, ".\\EDA")
run_plot_coco_size_distribution(coco_val, ".\\EDA")
print("-" * 50)

coco2017 Dataset EDA的更多相关文章

  1. 斯坦福【概率与统计】课程笔记(二):从EDA开始

    探索性数据分析(Exploratory Data Analysis) 本节课程先从统计分析四步骤中的第二步:EDA开始. 课程定义了若干个术语,如果学习过机器学习的同学,应该很容易类比理解: popu ...

  2. 【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)

    [机器学习入门与实践]数据挖掘-二手车价格交易预测(含EDA探索.特征工程.特征优化.模型融合等) note:项目链接以及码源见文末 1.赛题简介 了解赛题 赛题概况 数据概况 预测指标 分析赛题 数 ...

  3. HTML5 数据集属性dataset

    有时候在HTML元素上绑定一些额外信息,特别是JS选取操作这些元素时特别有帮助.通常我们会使用getAttribute()和setAttribute()来读和写非标题属性的值.但为此付出的代价是文档将 ...

  4. C#读取Excel,或者多个excel表,返回dataset

    把excel 表作为一个数据源进行读取 /// <summary> /// 读取Excel单个Sheet /// </summary> /// <param name=& ...

  5. DataTable DataRow DataColumn DataSet

    1.DataTable 数据表(内存) 2.DataRow DataTable 的行 3.DataColumn DataTable 的列 4.DataSet 内存中的缓存

  6. C# DataSet装换为泛型集合

    1.DataSet装换为泛型集合(注意T实体的属性其字段类型与dataset字段类型一一对应) #region DataSet装换为泛型集合 /// <summary> /// 利用反射和 ...

  7. 读取Simulink中Dataset类型的数据

    http://files.cnblogs.com/files/pursuiting/%E5%80%92%E7%AB%8B%E6%91%86%E6%8E%A7%E5%88%B6%E7%B3%BB%E7% ...

  8. RDD/Dataset/DataFrame互转

    1.RDD -> Dataset val ds = rdd.toDS() 2.RDD -> DataFrame val df = spark.read.json(rdd) 3.Datase ...

  9. asp.net dataset 判断是否为空 ?

    1,if(ds == null) 这是判断内存中的数据集是否为空,说明DATASET为空,行和列都不存在!! 2,if(ds.Tables.Count == 0) 这应该是在内存中存在一个DATASE ...

  10. C#遍历DataSet中数据的几种方法总结

    //多表多行多列的情况foreach (DataTable dt in YourDataset.Tables) //遍历所有的datatable{foreach (DataRow dr in dt.R ...

随机推荐

  1. springboot,简要记录,方便复习,

    boot 笔记第一步新建工程,导包,由于boot的数据库框架是用mybtis -paus,所以关于数据库系统那儿不用色选mybatis ,需要重新maven导包完整导包以下人容: <?xml v ...

  2. Java面向对象(中)--super/多态/向下转型/equals/toString/包装类/单元测试工具

    java对象 方法重写 子类继承父类以后,可以对父类同名同参数的方法,进行覆盖操作 重写后,当创建子类对象以后,通过子类对象调用子父类中同名同参数的方法时,执行的是子类重写父类的方法. 如何区分方法重 ...

  3. 利用Nginx正向代理实现局域网电脑访问外网

    引言 在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的.这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx ...

  4. 摆脱鼠标系列 - 浏览器操作 - Vimium C 插件 f 显示链接字母 jk上下移动

    为什么 摆脱鼠标系列 - 浏览器操作 - Vimium C 插件 f 显示链接字母 jk上下移动 百度搜索资料的时候,争取少用鼠标 关闭当前页签 x 左边页签 J 右边页签 K 搜索 /关键字回车 n

  5. kubectl create 与 kubectl apply的区别

    kubectl apply和kubectl create都是Kubernetes(k8s)中用于创建或更新资源的命令,但它们在使用方式.功能和灵活性上存在一些区别. 声明式与命令式: kubectl ...

  6. Android自定义View学习(1)——基础知识介绍

    原文:Android自定义View学习(1)--基础知识介绍 - Stars-One的杂货小窝 准备学习自定义View,介绍一下先了解了下相关的前置基础知识,特此总结 本系列集合文章链接可访问Andr ...

  7. verilog勘误系列之-->算术运算符运算失败

    描述 在verilog代码设计时使用算术运算符与乘法搭配使用出现计算错误 原因 由于数据位宽设置不当导致 错误案例 wire signed [13:0] w01; wire signed [23:0] ...

  8. 基于webpack与TypeScript的SolidJS项目搭建

    本文将讲述如何基于webpack与TypeScript搭建一个基础的支持less模块的solidjs项目.方便后续涉及到solidjs相关分析与讨论都可以基于本文的成果之上进行. 前置 nodejs ...

  9. drf(视图组件)

    一. 前言 Django REST framwork 提供的视图的主要作用 1. 控制序列化器的执行(检验.保存.转换数据) 2. 控制数据库查询的执行 二. 两个视图基类 两个视图基类: APIVi ...

  10. C# 12 拦截器 Interceptors

    拦截器Interceptors是一种可以在编译时以声明方式替换原有应用的方法. 这种替换是通过让Interceptors声明它拦截的调用的源位置来实现的. 您可以使用拦截器作为源生成器的一部分进行修改 ...