有关数据集处理的脚本工具【附代码】

news2024/12/23 18:26:45

在做分类项目的时候(包括目标检测),经常会涉及到数据集的预处理,这里我将把一些自己写的工具脚本代码开源出来供大家使用,后期也将不定时的更新。

相关功能:

1.分类任务one-hot标签转单标签

2.数据集中各个类别的统计

3.数据集中图片宽、高分布,宽高比分布

4.针对数据集中极端宽高比的图片进行可视化


1.one-hot标签转单标签

比如我们数据集的格式为以下格式,label是one-hot形式。

image1_path.png 1 0 0   # 1 0 0 是猫

image2_path.png 0 1 0   # 0 1 0是狗

image3_path.png 0 0 1   # 0 0 1是鸟

现在需要将one-hot转为单类别的。比如:0-猫,1-狗,2-鸟,也就是以下形式:

image1_path.png 0

image2_path.png 1

image3_path.png 2

......

代码如下:

其中train和test是训练集和测试集的,根据自己的需求去修改相关路径。

# 1 0 0-> 0 猫
# 0 1 0-> 1 狗
# 0 0 1-> 2 鸟

train = False
test = False

if train:
    label_list_path = 'or_train.txt' # one-hot数据集的txt路径
    txt_path = '/train.txt' # 处理后的保存路径
elif test:
    label_list_path = 'or_test.txt' # one-hot.txt 路径
    txt_path = '/test.txt' # 处理后的保存路径
with open(label_list_path, 'r') as f:
    lines = f.readlines()
f.close()

label_list = []
for line in lines:
    image_path = line[:-7]
    one_hot_label = line[len(image_path)+1:].strip()
    label = ''

    if one_hot_label == '1 0 0': # 猫
        label = '0'
    elif one_hot_label == '0 1 0': # 狗
        label = '1'
    elif one_hot_label == '0 0 1': # 鸟
        label = '2'
    label_list.append(image_path + ' ' + label)

file = open(txt_path,'w')
for label in label_list:
    file.write(label + '\n')
file.close()

 


 2.数据集中各个类别的统计

可以统计各个类别的数量并打印,其中txt_path是数据集的txt文件,同样,根据实际情况进行修改。

def label_count(txt_path):
    '''
    函数功能:统计数据集中各个类别的数量以及在整个数据集中的占比
    txt_path:label_list.txt路径,要求label是单标签,不能是one-hot形式
    '''
    all_targets = 0
    class1 = 0  # 记录类别1的数量
    class2 = 0  # 记录类别2的数量
    class3 = 0  # 记录类别3的数量
    with open(txt_path, 'r') as f:
        lines = f.readlines()
    f.close()
    for line in lines:
        label = line.split()[1]
        if label != '':
            all_targets += 1
        if label == '0':  # 猫
            class1 += 1
        elif label == '1':  # 狗
            class2 += 1
        elif label == '2':   # 鸟
            class3 += 1
    print("总目标数量:{}".format(all_targets))
    print("0-猫:{},占比{:.2f}%".format(class1, (class1 / all_targets)*100))
    print("1-狗:{},占比{:.2f}%".format(class2, (class2 / all_targets)*100))
    print("2-鸟:{},占比{:.2f}%".format(class3, (class3 / all_targets)*100))
    return (class1, class2, class3)

打印效果如下:

总目标数量:100928
0-猫:20570,占比20.38%
1-狗:15288,占比15.15%
2-鸟:65070,占比64.47%

如果还想将各个类的数量以柱状图的形式显示,那么代码如下:

def plot_bar(data):
    '''
    函数功能:将每个类的数量在柱状图中显示出来
    '''
    class_names = ['猫', '狗', '鸟']
    # 类别数量
    counts = [x for x in data]
    # 绘制柱状图
    plt.bar(class_names, counts)

    # 添加标签
    for i in range(len(class_names)):
        plt.text(i, counts[i], str(counts[i]), ha='center', va='bottom')
    # 设置标题和坐标轴标签
    plt.title('目标类别数量')
    plt.xlabel('类别')
    plt.ylabel('数量')

    # 显示图形
    plt.show()

 


3.数据集中图片宽、高分布,宽高比分布

比如想统计数据集中所有数据的宽高分布以及宽高比分布。代码如下:

其中root_path是数据集的根目录路径,txt_path是数据集的txt路径。这个需要根据自己实际情况进行代码的修改,只要可以从txt中完整的读取图片即可。

def Dataset_shape_distribution(root_path, txt_path):
    with open(txt_path, 'r') as f:
        lines = f.readlines()
    f.close()
    widths = []  # 存储所有图像的w
    heights = []  # 存储所有图像的h

    for line in lines:
        image_path = root_path + '/' + line.split()[0]
        img = Image.open(image_path)
        w, h = img.size
        widths.append(w)
        heights.append(h)

    # 计算宽高比
    aspect_ratios = [widths[i] / heights[i] for i in range(len(widths))]

    # --------------获取宽高比的频数和bins--------------------------------
    hist, bins = np.histogram(aspect_ratios, bins=50)
    # 找到频数最多的范围
    max_freq_index = np.argmax(hist)  # 获取频数最大值的索引
    most_common_range = (bins[max_freq_index], bins[max_freq_index + 1])  # 根据索引获取对应范围
    print("宽高比分布主要的范围为:",np.around(most_common_range,decimals=2))

    hist_w, bins_w = np.histogram(widths, bins=50)
    max_freq_w_index = np.argmax(hist_w)  # 获取频数最大值的索引
    most_common_w_range = (bins_w[max_freq_w_index], bins_w[max_freq_w_index + 1])  # 根据索引获取对应范围
    print("宽分布主要的范围为:", np.around(most_common_w_range, decimals=2))

    hist_h, bins_h = np.histogram(heights, bins=50)
    max_freq_h_index = np.argmax(hist_h)  # 获取频数最大值的索引
    most_common_h_range = (bins_h[max_freq_h_index], bins_w[max_freq_h_index + 1])  # 根据索引获取对应范围
    print("高分布主要的范围为:", np.around(most_common_h_range, decimals=2))

    # 如果要归一化显示
    # min_width = min(widths)
    # max_width = max(widths)
    # min_height = min(heights)
    # max_height = max(heights)
    # normalized_widths = [(w - min_width) / (max_width - min_width) for w in widths]
    # normalized_heights = [(h - min_height) / (max_height - min_height) for h in heights]

    # -------------------------plot 部分-----------------------------------------------
    # 以直方图形式展现w和h的分布
    # bins:指定直方图显示的条数
    plt.hist(widths, bins=50, alpha=0.5, color='b', edgecolor='black')
    plt.title('Datasets Width Distribution')
    plt.xlabel('Width')
    plt.ylabel('Count')
    plt.show()
    # 绘制高的分布
    plt.hist(heights, bins=50, alpha=0.5, color='b', edgecolor='black')
    plt.title('Datasets Height Distribution')
    plt.xlabel('Height')
    plt.ylabel('Count')
    plt.show()

    # 绘制散点图
    #plt.scatter(normalized_widths, normalized_heights, s=0.9)
    plt.scatter(widths, heights, s=0.9)
    plt.xlabel('Width')
    plt.ylabel('Height')
    plt.title('Width vs Height Distribution')
    plt.show()

    # 绘制宽高比直方图
    plt.hist(aspect_ratios, bins=50, edgecolor='black')
    plt.xlabel('Aspect Ratio')
    plt.ylabel('Count')
    plt.title('宽高比分布')
    plt.show()

    # 绘制宽高比分布范围最多直方图
    plt.hist(aspect_ratios, bins=50, edgecolor='black')
    plt.xlabel('Aspect Ratio')
    plt.ylabel('Count')
    plt.title('宽高比分布')
    # 绘制最常见范围
    plt.axvspan(most_common_range[0], most_common_range[1], color='r', alpha=0.5)
    # 显示图形
    plt.show()

输出形式如下:

宽高比分布最大的范围为: [0.33 0.43]
宽分布最大的范围为: [ 80.72 156.44]
高分布最大的范围为: [411.84 535.04]

同时会将数据集中的宽、高分、宽高比布绘制如下: 

 

标题数据集宽分布
数据集高分布

 

数据集宽高整体分布情况

 

宽高比分布情况(红色是出现频率最高的)

 


4.针对数据集中极端宽高比的图片进行可视化 

从3中的宽高比分布中可以看到有些数据的宽高比存在极端,那么我们可以将这些极端数据显示出来,看看这些都是什么样的数据。代码如下:

其中root_path是根目录,txt_path是数据集txt路径,save_path是保存路径,whr_thre是宽高比阈值,会将小于该阈值的图片保存在save_path中。同样根据自己项目修改这些路径参数。

def Extreme_data_display(root_path, txt_path, save_path, whr_thre=1.5):
    '''
    通过对数据集宽高比进行分析,设置宽高比阈值显示对应的图片(可以将一些宽高比比较极端的数据显示出来)
    '''
    with open(txt_path) as f:
        lines = f.readlines()
    f.close()
    for line in lines:
        image_path = root_path + '/' + line.split()[0]
        img = Image.open(image_path)
        w, h = img.size
        ratio = w / h
        #if whr_thre <= ratio:
        if whr_thre >= ratio:
            img.save(save_path + line.split()[0].split('/')[-1])

至于为什么做极端数据的可视化,比如在行人检测中,有些图像呈现“细条状”,如果存在大量的这类样本,会影响网络的训练。比如下面这种:

极端样本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm+vue的课程网络学习平台管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的课程网络学习平台管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体…

nodejs+vue+elementui酒店客房服务系统mysql带商家

视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术&#xff1a;nodejsvueel…

DBCO Sata650,二苯并环辛烷Sata650,Seta-650-DBCO

产品简介&#xff1a; CAS号&#xff1a;N/A 中文名&#xff1a;二苯并环辛烷Sata650 英文名&#xff1a;DBCO Sata650,Seta-650-DBCO 化学式&#xff1a;N/A 分子量&#xff1a;1431.85 纯度标准&#xff1a;95% 供应商&#xff1a;陕西新研博美生物科技有限公司 存储…

接口自动化测试框架搭建【附教程加源码】

1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff…

c++day6(菱形继承、虚继承、多态、模板、异常)

今日任务 1.思维导图 2.编程题&#xff1a; 代码&#xff1a; #include <iostream>using namespace std; /*以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&a…

网络安全(黑客技术)—0基础学习手册

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…

行业追踪,2023-10-12

自动复盘 2023-10-12 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

【设计模式】八、桥接模式

文章目录 举例问题分析基本介绍桥接模式在 JDBC 的源码剖析桥接模式的注意事项和细节JDBC 举例 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c; 传统方法对应的类图&#xff1a; 问题分析 扩展性问题(类爆炸)&#xff…

YOLOv7优化:轻量高效注意力模块Sea_AttentionBlock | ICLR2023|SeaFormer:轻量级语义分割算法,复旦大学和腾讯联合提出

💡💡💡本文独家改进:一种即插即用的通用注意力模块Sea_AttentionBlock ,带有squeeze Axial和细节增强,二次创新引入到YOLOv7增强特征提取能力 Sea_AttentionBlock | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI…

Raise抛出异常

raise 是Python中用于手动引发异常的关键字。你可以使用 raise 来触发特定类型的异常&#xff0c;以便在程序的某个位置明确地报告错误。以下是一个示例说明 raise 的用法&#xff1a; def divide(x, y):if y 0:raise ZeroDivisionError("除以零错误&#xff1a;y不能为…

高考600分能上哪些大学 分数线在600以下的大学

大部分学生在高考时最关注一定就是自己的分数最终可以考上哪些大学了&#xff0c;其中600是很多人最关注的一个分数线&#xff0c;那么高于600分的话可以上哪些大学呢&#xff1f;下面就来告诉大家吧。 高考600分能上的大学&#xff1a;湖南大学、西南大学、西安电子科技大学、…

nodejs+vue+elementui大学生心理健康管理系统

简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE本大学生心理健康管理系统使用简洁的框架结构&#xff0c;专门用于用户咨询心理专家&#xff0c;系统具有方便性、灵活性、应用性。于是…

Facebook广告账户被封?这份防封及申诉指南收好

Facebook广告是海外营销的一大利器&#xff0c;但是随着互联网的发展&#xff0c;有部分不法分子正在利用他进行盈利&#xff0c;导致Facebook官方安全审核日益严格&#xff0c;不少卖家遭遇封号问题&#xff01;这篇文章就来教你如何更好地管理 Facebook广告帐户&#xff0c;实…

【Linux--进程间通信】

进程间通信介绍 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息。通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…

萤石网络发布家用及商用清洁机器人 积极布局具身智能

10月12日&#xff0c;萤石网络在杭州举行“智无感 净无忧——2023清洁机器人新品发布会”&#xff0c;带来了两款采用具身智能理念研发的清洁服务机器人新品。AI扫拖宝RS20 Pro支持AI智能融合避障&#xff0c;搭载主动切毛滚刷等创新技术&#xff0c;告别传统清洁困扰&#xff…

02Maven核心程序的下载与settings.xml文件的配置,环境变量的配置

Maven核心程序的解压与配置 Maven的下载与解压 Maven官网下载安装包 将下载的Maven核心程序压缩包apache-maven-3.8.4-bin.zip解压到一个非中文且没有空格的目录 Maven的核心配置文件 在Maven的解压目录conf中我们需要配置Maven的核心配置文件settings.xml 配置本地仓库位置…

Websocket升级版

之前写过一个关于websocket的博客&#xff0c;是看书时候做的一个demo。但是纸上得来终觉浅&#xff0c;这次实战后实打实的踩了不少坑&#xff0c;写个博客记录总结。 1.安装postman websocket接口调试&#xff0c;需要8.5以及以上版本的postman 先把以前的卸载&#xff0c…

CSS 中几种常用的换行方法

1、使用 br 元素&#xff1a; 最简单的换行方法是在需要换行的位置插入 元素。例如&#xff1a; <p>This is a sentence.<br>It will be on a new line.</p>这会在 “This is a sentence.” 和 “It will be on a new line.” 之间创建一个换行。 效果&a…

需永远在线的游戏公司,如何在线替换开源存储?

小帅是一个酷爱游戏的玩家&#xff0c;他玩一款游戏已经很久了&#xff0c;始终乐在其中。 这款游戏风靡全球&#xff0c;在中国手游出海榜单中&#xff0c;长期位居榜首。 他不知道的是&#xff0c;就在他玩游戏的过程中&#xff0c;这款游戏的出品公司&#xff0c;其实已经…

Nginx解析漏洞

常见的解析漏洞&#xff1a; IIS 5.x/6.0解析漏洞 IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞 Nginx <8.03 空字节代码执行漏洞 Apache解析漏洞 Nginx文件解析漏洞 对于任意文件名&#xff0c;例如:cd.jpg在后面添加/x.php后&#xff0c;即可将文件作为php解析。 原理…