布匹瑕疵检测数据集EDA分析
分析数据集中 train 集的每个类别的 bboxes 数量分布情况。因为训练集分了两个:train1,train2。先根据两个数据集的 anno_train.json 文件分析类别分布。数据集:布匹瑕疵检测数据集-阿里云天池 (aliyun.com)
| 数据集 | bbox数量 | 缺陷图片数量 | 正常图片数量 |
|---|---|---|---|
| train1 | 7728 | 4774 | 2538 |
| train2 | 1795 | 1139 | 1125 |
| 总共 | 9523 | 5823 | 3663 |
EDA.py
import json
import os
import matplotlib.pyplot as plt
import seaborn as sns
#########################################
# 定义文件路径,修改成自己的anno文件路径
EDA_dir = './EDA/'
if not os.path.exists(EDA_dir):
# shutil.rmtree(EDA_dir)
os.makedirs(EDA_dir)
root_path = os.getcwd()
train1_json_filepath = os.path.join(root_path, "smartdiagnosisofclothflaw_round1train1_datasets",
"guangdong1_round1_train1_20190818", "Annotations",'anno_train.json')
train2_json_filepath = os.path.join(root_path, "smartdiagnosisofclothflaw_round1train2_datasets",
"guangdong1_round1_train2_20190828", "Annotations",'anno_train.json')
#########################################
# 准备数据
data1 = json.load(open(train1_json_filepath, 'r'))
data2 = json.load(open(train2_json_filepath, 'r'))
category_all = []
category_dis = {}
for i in data1:
category_all.append(i["defect_name"])
if i["defect_name"] not in category_dis:
category_dis[i["defect_name"]] = 1
else:
category_dis[i["defect_name"]] += 1
for i in data2:
category_all.append(i["defect_name"])
if i["defect_name"] not in category_dis:
category_dis[i["defect_name"]] = 1
else:
category_dis[i["defect_name"]] += 1
#########################################
# 配置绘图的参数
sns.set_style("whitegrid")
plt.figure(figsize=(15, 9)) # 图片的宽和高,单位为inch
# 绘制第一个子图:类别分布情况
plt.xlabel('class', fontsize=14) # x轴名称
plt.ylabel('counts', fontsize=14) # y轴名称
plt.xticks(rotation=90) # x轴标签竖着显示
plt.title('Train category distribution') # 标题
category_num = [category_dis[key] for key in category_dis] # 制作一个y轴每个条高度列表
for x, y in enumerate(category_num):
plt.text(x, y + 10, '%s' % y, ha='center', fontsize=10) # x轴偏移量,y轴偏移量,数值,居中,字体大小。
ax = sns.countplot(x=category_all, palette="PuBu_r") # 绘制直方图,palette调色板,蓝色由浅到深渐变。
# palette样式:https://blog.csdn.net/panlb1990/article/details/103851983
plt.savefig(EDA_dir + 'category_distribution.png', dpi=500)
plt.show()
可视化结果展示:

如果你的可视化结果,matplotlib和seaborn不能显示中文,参考这里:解决python中matplotlib与seaborn画图时中文乱码的根本问题 ,亲测有用。
通过可视化结果,我们可以看出数据集中类别极不平衡,最高的1996,最低的11。接下来我们继续分析一下每个类别的宽高分布情况,以及bbox的宽高比分布情况。
EDA.py
import json
import os
import matplotlib.pyplot as plt
import seaborn as sns
#########################################
# 定义文件路径,修改成自己的anno文件路径
EDA_dir = './EDA/'
if not os.path.exists(EDA_dir):
# shutil.rmtree(EDA_dir)
os.makedirs(EDA_dir)
root_path = os.getcwd()
train1_json_filepath = os.path.join(root_path, "smartdiagnosisofclothflaw_round1train1_datasets",
"guangdong1_round1_train1_20190818", "Annotations", 'anno_train.json')
train2_json_filepath = os.path.join(root_path, "smartdiagnosisofclothflaw_round1train2_datasets",
"guangdong1_round1_train2_20190828", "Annotations", 'anno_train.json')
#########################################
# 准备数据
data1 = json.load(open(train1_json_filepath, 'r'))
data2 = json.load(open(train2_json_filepath, 'r'))
category_dis = {}
bboxes = {}
widths = {}
heights = {}
aspect_ratio={}
for i in data1:
if i["defect_name"] not in category_dis:
category_dis[i["defect_name"]] = 1
bboxes[i["defect_name"]] = [i["bbox"], ]
else:
category_dis[i["defect_name"]] += 1
bboxes[i["defect_name"]].append(i['bbox'])
for i in data2:
if i["defect_name"] not in category_dis:
category_dis[i["defect_name"]] = 1
bboxes[i["defect_name"]] = [i["bbox"], ]
else:
category_dis[i["defect_name"]] += 1
bboxes[i["defect_name"]].append(i['bbox'])
for i in bboxes:
widths[i]=[]
heights[i]=[]
aspect_ratio[i]=[]
for j in bboxes[i]:
x1,y1,x2,y2=j
widths[i].append(x2-x1)
heights[i].append(y2-y1)
aspect_ratio[i].append((x2-x1)/(y2-y1))
#########################################
# 配置绘图的参数
sns.set_style("whitegrid")
plt.figure(figsize=(15, 20)) # 图片的宽和高,单位为inch
plt.subplots_adjust(left=0.1,bottom=0.1,right=0.9,top=0.9,wspace=0.5,hspace=0.5) # 调整子图间距
# 绘制bbox宽度和高度分布情况
for idx,i in enumerate(bboxes):
plt.subplot(7,5,idx+1)
plt.xlabel('width', fontsize=11) # x轴名称
plt.ylabel('height', fontsize=11) # y轴名称
plt.title(i, fontsize=13) # 标题
sns.scatterplot(widths[i],heights[i])
plt.savefig(EDA_dir + 'width_height_distribution.png', dpi=500, pad_inches=0)
plt.show()
# 绘制宽高比分布情况
plt.figure(figsize=(15, 20)) # 图片的宽和高,单位为inch
plt.subplots_adjust(left=0.1,bottom=0.1,right=0.9,top=0.9,wspace=0.5,hspace=0.5) # 调整子图间距
for idx,i in enumerate(bboxes):
plt.subplot(7,5,idx+1)
plt.xlabel('aspect ratio', fontsize=11) # x轴名称
plt.ylabel('number', fontsize=11) # y轴名称
plt.title(i, fontsize=13) # 标题
sns.distplot(aspect_ratio[i],kde=False)
plt.savefig(EDA_dir + 'aspect_ratio_distribution.png', dpi=500, pad_inches=0)
plt.show()
可视化结果展示:bbox宽度和高度分布情况

可视化结果展示:bbox宽高比的分布情况

做完所有的EDA后,可以得到以下分析:
- bbox的类别分布极不平衡。
- bbox的形状差异很大,粗维,稀密档,百脚等宽高比数值很大,部分大于10,说明bbox呈细条状。需要针对此进行修改,生成特殊比例的anchor。
布匹瑕疵检测数据集EDA分析的更多相关文章
- KDD Cup 99网络入侵检测数据的分析
看论文 该数据集是从一个模拟的美国空军局域网上采集来的 9 个星期的网络连接数据, 分成具有标识的训练数据和未加标识的测试数据.测试数据和训练数据有着不同的概率分布, 测试数据包含了一些未出现在训练数 ...
- dlib人脸关键点检测的模型分析与压缩
本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...
- 阿里系产品Xposed Hook检测机制原理分析
阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...
- 目标检测数据集The Object Detection Dataset
目标检测数据集The Object Detection Dataset 在目标检测领域,没有像MNIST或Fashion MNIST这样的小数据集.为了快速测试模型,我们将组装一个小数据集.首先,我们 ...
- IRIS数据集的分析-数据挖掘和python入门-零门槛
所有内容都在python源码和注释里,可运行! ########################### #说明: # 撰写本文的原因是,笔者在研究博文“http://python.jobbole.co ...
- opencv: 角点检测源码分析;
以下6个函数是opencv有关角点检测的函数 ConerHarris, cornoerMinEigenVal,CornorEigenValsAndVecs, preConerDetect, coner ...
- Linux下利用Valgrind工具进行内存泄露检测和性能分析
from http://www.linuxidc.com/Linux/2012-06/63754.htm Valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简绍 ...
- 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式
代码:转换用的代码放在这里 之前用Tensorflow提供的object detection API可以很方便的进行fine-tuning实现所需的特定物体检测模型(看这里).那么现在的主要问题就是数 ...
- faster-rcnn 目标检测 数据集制作
本文的目标是制作目标检测的数据集 使用的工具是 python + opencv 实现目标 1.批量图片重命名,手动框选图片中的目标,将目标框按照一定格式保存到txt中 图片名格式(批量) .jpg . ...
- FDDB人脸检测数据集 生成ROC曲线
看了好多博客,踩了很多坑,终于把FDDB数据集的ROC曲线绘制出来了.记录一下. 环境:ubuntu18.04 1.数据集准备 去FDDB官网:http://vis-www.cs.umass.edu/ ...
随机推荐
- Sharding-JDBC源码解析与vivo的定制开发
作者:vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件,在分库分表场景具有广泛应用.本文对Sharding-JDBC的解析.路由 ...
- react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁
react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁 let imageTopBg if (imgSrcBg) { c ...
- react 修改页面title - react-document-title
安装 cnpm install --save react-document-title 引用 import DocumentTitle from 'react-document-title' 代码 & ...
- 网络io与select
我们知道网络IO模型一共有5种,这里我们主要讨论同步IO和select多路复用的情况. 我们先从一个简单的TCP服务器的代码出发,来讨论一下这个是怎么实现的. 一个十分简单的TCP服务器 一个简单的T ...
- .NET开源快速、强大、免费的电子表格组件
前言 今天大姚给大家分享一个.NET开源(MIT License).快速.强大.免费的电子表格组件,支持数据格式.冻结.大纲.公式计算.图表.脚本执行等.兼容 Excel 2007 (.xlsx) 格 ...
- Jest快速使用指南
1. 引言 写了几个函数,怎么知道写得对不对呢? 可以通过测试函数,当然开发中测试的意义不只是这个 Jest是常用的JavaScript测试框架 官网为:Jest · Delightful JavaS ...
- Java Agent技术
在定位公司问题的时候,需要了解一下skywalking的相关知识,而agent就提上了日程. 官网文档 Agent技术是Jdk在1.5版本之后,所提供的一个在jvm启动前后对部分java类代理加强的机 ...
- OpenCvSharp+Yolov5Net+Onnx 完整Demo
效果 工程 代码 using Microsoft.ML.OnnxRuntime; using OpenCvSharp; using System; using System.Collections.G ...
- Oracle ORA-09925
Error : 30: Read-only file system 造成这个问题的原因大多数是因为非正常关机后导致文件系统受损引起的,在系统重启之后,受损分区就会被Linux自动挂载为只读. 解决办法 ...
- Python---time对象的使用获取时间
https://www.jb51.net/article/49326.htm 1.time.time() 它返回当前时间的时间戳(1970纪元后经过的浮点秒数). 如果调用这个函数,如: print ...