EDA目的:通过了解数据集的分布情况,数据之间的关系,来帮我们更好的后期进行特征工程和建立模型。

本文主要是一个根据coco数据集格式的json文件,来分析数据集中图片尺寸,宽高比,bbox尺寸,宽高比,以及每张图片中bbox数量的分布情况。

分析的数据集来自:零基础入门CV - 街景字符编码识别赛题与数据-天池大赛-阿里云天池 (aliyun.com) ,主要是分析训练集,一共有三万张图片。

instances_train2017.json,是我们通过将数据集json文件转换后符合coco数据集标准的json文件。

import json
import os import matplotlib.pyplot as plt
import seaborn as sns root_path = os.getcwd()
json_filepath = os.path.join(root_path, 'instances_train2017.json')
data = json.load(open(json_filepath, 'r'))
EDA_dir = './EDA/'
if not os.path.exists(EDA_dir):
# shutil.rmtree(EDA_dir)
os.makedirs(EDA_dir) # 准备图片数据
images = data[
'images'] # [{"license": 0, "url": null, "file_name": "0.jpg", "height": 350, "width": 741, "date_captured": null, "id": 0}, , , , , ]
annotations = data[
'annotations'] # [{"id": 0, "image_id": 0, "category_id": 1, "area": 17739, "bbox": [246, 77, 81, 219], "iscrowd": 0}, , , , ] images_height = []
images_width = []
images_aspect_ratio = [] # 图片的宽高比
bboxes_height = []
bboxes_width = []
bboxes_aspect_ratio = [] # bboxes的宽高比
bboxes_num_per_image = [] # 每个图片的bbox数量 for i in images:
images_width.append(i['width'])
images_height.append(i['height'])
width_height = i['width'] / i['height']
images_aspect_ratio.append(width_height) for i in annotations:
bboxes_width.append(i['bbox'][2])
bboxes_height.append(i['bbox'][3])
width_height = i['bbox'][2] / i['bbox'][3]
bboxes_aspect_ratio.append(width_height) temp_num = 0
images_id = []
for i in annotations:
if i['image_id'] not in images_id:
images_id.append(i['image_id'])
if temp_num > 0:
bboxes_num_per_image.append(temp_num)
temp_num = 1
else:
temp_num = temp_num + 1 # 配置绘图的参数
sns.set_style("whitegrid") # 绘制图片宽高的分布
plt.title('Images width and height distribution')
sns.kdeplot(images_width, images_height, shade=True)
plt.savefig(EDA_dir + 'images_width_height_distribution.png', dpi=600)
plt.show() # 绘制图片宽高比分布
plt.title('Images aspect ratio distribution')
sns.distplot(images_aspect_ratio, kde=False)
plt.savefig(EDA_dir + 'images_aspect_ratio.png', dpi=600)
plt.show() # 绘制图片宽度比分布
plt.title('Images width distribution')
sns.distplot(images_width, kde=False)
plt.savefig(EDA_dir + 'images_width_distribution', dpi=600)
plt.show() # 绘制图片高度比分布
plt.title('Images height distribution')
sns.distplot(images_height, kde=False)
plt.savefig(EDA_dir + 'images_height_distribution.png', dpi=600)
plt.show() # 绘制bboxes宽高的分布
plt.title('Bboxes width and height distribution')
sns.kdeplot(bboxes_width, bboxes_height, shade=True)
plt.savefig(EDA_dir + 'bboxes_width_height_distribution.png', dpi=600)
plt.show() # 绘制bboxes宽高比分布
plt.title('Bboxes aspect ratio distribution')
sns.distplot(bboxes_aspect_ratio, kde=False)
plt.savefig(EDA_dir + 'bboxes_aspect_ratio .png', dpi=600)
plt.show() # 绘制bboxes宽度比分布
plt.title('Bboxes width distribution')
sns.distplot(bboxes_width, kde=False)
plt.savefig(EDA_dir + 'bboxes_width_distribution', dpi=600)
plt.show() # 绘制bboxes高度比分布
plt.title('Bboxes height distribution')
sns.distplot(bboxes_height, kde=False)
plt.savefig(EDA_dir + 'bboxes_height_distribution.png', dpi=600)
plt.show() # 绘制每张图片bboxes个数的分布情况
plt.title('Distribution of the number of BBoxes in each image')
sns.distplot(bboxes_num_per_image, kde=False)
plt.savefig(EDA_dir + 'bboxes_per_image_distribution.png', dpi=600)
plt.show()

生成的结果都保存到 ./EDA/ 文件夹中。

结果展示:

图片的宽度分布情况 图片的高度分布情况 图片的宽高比分布情况
bbox的宽度分布情况 bbox的高度分布情况 bbox的宽高比分布情况
图片宽度和高度的分布情况 bbox宽度和高度的分布情况 每张图片中bbox数量的分布情况

通过EDA分析,我们可以得出:

  • 图片的宽度大部分处于0~200,小部分处于200~400之间,极少数>400。

  • 图片的高度大部分处于0~100,小部分处于100~200之间,极少数>200。

  • 图片的宽高比大部分处于1.7~3之间。

  • bbox的宽度大部分处于0~50。

  • bbox的高度大部分处于0~50,小部分处于50~100。

  • bbox的宽高比大部分处于0.25~0.75。

  • 每张图片中bbox数量大部分是1,2,3,小部分有4个bbox,极少数有5,6个bbox。

EDA(Exploratory Data Analysis)数据探索性分析的更多相关文章

  1. 探索性数据分析(Exploratory Data Analysis,EDA)

    探索性数据分析(Exploratory Data Analysis,EDA)主要的工作是:对数据进行清洗,对数据进行描述(描述统计量,图表),查看数据的分布,比较数据之间的关系,培养对数据的直觉,对数 ...

  2. 1.探索性数据分析(EDA,Exploratory Data Analysis)

    一.数据探索 1.数据读取 遍历文件夹,读取文件夹下各个文件的名字:os.listdir() 方法:用于返回指定的文件夹包含的文件或文件夹的名字的列表.这个列表以字母顺序. 它不包括 '.' 和'.. ...

  3. 学习笔记之Data analysis

    Data analysis - Wikipedia https://en.wikipedia.org/wiki/Data_analysis Data analysis is a process of ...

  4. How to use data analysis for machine learning (example, part 1)

    In my last article, I stated that for practitioners (as opposed to theorists), the real prerequisite ...

  5. 数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)的区别是什么? 数据科学(data science)和商业分析(business analytics)之间有什么关系?

    本来我以为不需要解释这个问题的,到底数据挖掘(data mining),机器学习(machine learning),和人工智能(AI)有什么区别,但是前几天因为有个学弟问我,我想了想发现我竟然也回答 ...

  6. 《python for data analysis》第九章,数据聚合与分组运算

    # -*- coding:utf-8 -*-# <python for data analysis>第九章# 数据聚合与分组运算import pandas as pdimport nump ...

  7. 转录组分析综述A survey of best practices for RNA-seq data analysis

    转录组分析综述 转录组 文献解读 Trinity cufflinks 转录组研究综述文章解读 今天介绍下小编最近阅读的关于RNA-seq分析的文章,文章发在Genome Biology 上的A sur ...

  8. 深入浅出数据分析 Head First Data Analysis Code 数据与代码

    <深入浅出数据分析>英文名为Head First Data Analysis Code, 这本书中提供了学习使用的数据和程序,原书链接由于某些原因不 能打开,这里在提供一个下载的链接.去下 ...

  9. 《python for data analysis》第七章,数据规整化

    <利用Python进行数据分析>第七章的代码. # -*- coding:utf-8 -*-# <python for data analysis>第七章, 数据规整化 imp ...

  10. 《利用Python进行数据分析: Python for Data Analysis 》学习随笔

    NoteBook of <Data Analysis with Python> 3.IPython基础 Tab自动补齐 变量名 变量方法 路径 解释 ?解释, ??显示函数源码 ?搜索命名 ...

随机推荐

  1. C++标准库字符串流sstream

    sstream与strstream 在C++有两种字符串流,一种在<strstream>中定义,另一种在<sstream>中定义,两者的区别如下: strstream里包含st ...

  2. python queue join task_done的概念及实例解析

    一 概念 Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执行别的 ...

  3. C++ 调用 Python 总结(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. [Leetcode 1981. 最小化目标值与所选元素的差] 记忆化搜索

    记忆化搜索 class Solution { int ans = 5001; public int minimizeTheDifference(int[][] mat, int target) { i ...

  5. 恶意软件开发(五)Linux shellcoding

    什么是shellcode? Shellcode通常指的是一段用于攻击的机器码(二进制代码),可以被注入到目标计算机中并在其中执行.Shellcode 的目的是利用目标系统的漏洞或弱点,以获取系统控制权 ...

  6. Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性 ...

  7. 记录--教你用three.js写一个炫酷的3D登陆页面

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言: 该篇文章用到的主要技术:vue3.three.js 我们先看看成品效果: 高清大图预览(会有些慢): 座机小图预览: 废话不多说, ...

  8. verilog之时钟信号的编写2

    verilog之时钟信号的编写2 1.时钟信号的特点 时钟信号除了可以根据时序一个个变化列举出来,还可以利用其循环的变化的特点,使用循环执行语句always来实现.这种方法实现的时钟信号可以一直执行且 ...

  9. KingbaseES错误分析 -- “requested character too large”

    一.适用于: 本文档使用于KingbaseES所有版本. 二.问题现象: 使用从其他数据库迁移到KingbaseES数据库的自定义函数.存储过程.Package包..出现以下错误信息: 错误:所请求的 ...

  10. 鸿蒙HarmonyOS实战-ArkUI组件(Grid/GridItem)

    一.Grid/GridItem 1.概述 网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活.简洁.易于维护.网格布局能够将页面分成多个单元格,可以在这些 ...