Python实现Imagenet数据集的合并和拆分

news2025/6/14 14:54:15

Python实现Imagenet数据集的合并和拆分

在这里插入图片描述

1. 合并Imagenet

任务需求

文件夹形式为一个数据集MyImagenet,路径为/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/valval文件夹又有若干的类别子文件夹,子文件夹是每一个类别的图片,我们要将所有的文件都移动到/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/val这一个文件夹下面,不设定各种子文件夹。

要求点

  1. 输入文件夹路径为/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val,输出文件夹的路径为/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/val,如果没有该文件夹则进行创建。
  2. /home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val下所有子文件夹下图片,都复制到/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/val这个文件夹中。
  3. 要有用python语言
  4. 需要打印处理流程:处理到那一张图片(要计数)和处理完成的标志。

代码实现

这段代码的作用是将指定文件夹下的所有文件(包括子文件夹中的文件)复制到另外一个目录中。

首先,定义了两个变量src_pathdst_path,分别代表源文件夹路径和目标文件夹路径。然后,判断目标文件夹是否存在,若不存在则使用os.mkdir()函数创建该目录。

接下来使用os.walk()函数遍历源目录下的所有子目录和文件,得到每个文件的完整路径。对于每个文件,执行shutil.copy()函数将其复制到目标文件夹中,并打印处理进度信息。计数器count会随着处理文件的数量逐渐累加。

最后,当源目录下所有文件都处理完成后,输出处理完成的标志信息。

需要注意的是,目标文件夹中有相同命名的文件时,shutil.copy()函数会自动覆盖原文件。如果在复制过程中需要保留原文件,请使用shutil.copy2()函数。

import os  
import shutil  
  
# 输入文件夹路径和输出文件夹路径  
src_path = '/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val'  
dst_path = '/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/val'  
  
# 如果目标文件夹不存在,则创建  
if not os.path.exists(dst_path):  
    os.mkdir(dst_path)  
  
# 计数器初始化  
count = 0  
  
# 遍历源目录下的所有子目录和文件  
for root, dirs, files in os.walk(src_path):  
    # 处理当前目录下的所有文件  
    for file in files:  
        # 构造源文件和目标文件的完整路径  
        src_file = os.path.join(root, file)  
        dst_file = os.path.join(dst_path, file)  
        # 复制文件到目标目录  
        shutil.copy(src_file, dst_file)  
        # 计数器加1  
        count += 1  
        # 打印处理进度  
        print('正在处理第{}张图片: {}'.format(count, src_file))  
  
# 处理完成的标志  
print('所有图片已处理完成!')

2. 拆分Imagenet

在数据集合并加工完毕后,我们将处理好的图像保存在一个文件夹中,例如/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/val。不过,在后续的模型预训练中,我们需要重新组织数据集,将所有图片按照标签分类,并分别存储在以标签命名的文件夹中。

构建类别名称和类别编号关系字典

要求点1

  1. /home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val文件夹为例,它的每个文件夹名字都代表了类别名称,而文件夹下的文件是图片,我们从每个类别文件夹随机抽取一个图片,假设抽到n02009912_197.JPEG为例,其中字符串下划线_之前的字符串n02009912是代表类别的编号。
  2. 基于此可以构建图片类别名称与类别编号对应的关系字典。
  3. Python代码实现。
  4. 要求打印出来。

代码实现

import os  
import random  
  
# 定义数据集路径和每个子目录下需要随机选择的图片数量  
data_path = '/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val'  
num_images_per_class = 1  
  
# 构建图片类别名称与类别编号对应的关系字典  
image_dict = {}  
for label_name in os.listdir(data_path):  
    # 获取该类别的编号  
    label_idx = os.listdir(os.path.join(data_path, label_name))[0].split('_')[0]  
    image_dict[label_name] = label_idx  
  
print(image_dict)

这段代码用于构建图片类别名称与类别编号对应的关系字典,具体解释如下:

  • data_path:定义数据集路径。
  • num_images_per_class:定义每个子目录下需要随机选择的图片数量,此处设置为1。
  • image_dict:定义一个字典,用于存储图片类别名称与类别编号之间的对应关系。
  • for label_name in os.listdir(data_path)::遍历数据集目录下的所有子目录(即类别名称)。
  • os.listdir(os.path.join(data_path, label_name)):获取当前类别文件夹下的所有文件(即图片),并返回一个列表。
  • [0]:获取该列表中的第一个元素,即选取一个随机的图片。
  • .split('_')[0]:将该图片的文件名按照下划线分隔成两部分,然后取第一部分作为该图片的类别编号。
  • image_dict[label_name] = label_idx:将该图片的类别名称作为字典的键,将该图片的类别编号作为字典的值。

该段代码的主要作用是在不知道每个类别文件夹下有多少张图片的情况下,随机选取每个类别文件夹下的一张图片,并将其所属的类别编号与类别名称存储到字典中,方便后续的分类模型训练和评估。

结果呈现

{'rule': 'n04118776', 'gartersnake': 'n01735189', 'mobilehome': 'n03776460', 'schoolbus': 'n04146614', 'pooltable': 'n03982430', 'washer': 'n04554684', 'wool': 'n04599235', 'ModelT': 'n03777568', 'beerbottle': 'n02823428', 'whitefox': 'n02120079', 'birdhouse': 'n02843684', 'Bread': 'n07684084', 'warplane': 'n04552348', 'web': 'n06359193', 'trimaran': 'n04483307', 'chickadee': 'n01592084', 'cucumber': 'n07718472', 'Siamese': 'n02123597', 'carton': 'n02971356', 'missile': 'n03773504', 'wolfspider': 'n01775062', 'husky': 'n02109961', 'catamaran': 'n02981792', 'Oriole': 'n01531178', 'recreationalvehicle': 'n04065272', 'digitalclock': 'n03196217', 'watertower': 'n04562935', 'butternutsquash': 'n07717556', 'ostrich': 'n01518878', 'radiotelescope': 'n04044716', 'Grasshopper': 'n02226429', 'reflexcamera': 'n04069434', 'moped': 'n03785016', 'coffeepot': 'n03063689', 'firetruck': 'n03345487', 'matchstick': 'n03729826', 'revolver': 'n04086273', 'artichoke': 'n07718747', 'tileroof': 'n04435653', 'Tram': 'n04335435', 'chimpanzee': 'n02481823', 'gorilla': 'n02480855', 'hourglass': 'n03544143', 'thatch': 'n04417672', 'Persiancat': 'n02123394', 'hyaena': 'n02117135', 'tank': 'n04389033', 'badger': 'n02447366', 'rocker': 'n04099969', 'horn': 'n03394916', 'trifle': 'n07613480', 'convertible': 'n03100240', 'piano': 'n04515003', 'butterfly': 'n02281787', 'bottlecap': 'n02877765', 'keypad': 'n03085013', 'stonewall': 'n04326547', 'leatherbackturtle': 'n01665541', 'streetsign': 'n06794110', 'goldfish': 'n01443537', 'soapdispenser': 'n04254120', 'cassetteplayer': 'n02979186', 'golfball': 'n03445777', 'Recordsheet': 'n03841143', 'measuringcup': 'n03733805', 'malamute': 'n02110063', 'Americanegret': 'n02009912', 'dustcart': 'n03417042', 'lizard': 'n01675722', 'desktopcomputer': 'n03180011', 'projector': 'n04009552', 'gibbon': 'n02483362', 'Rottweiler': 'n02106550', 'stoplight': 'n06874185', 'SaintBernard': 'n02109525', 'vase': 'n04522168', 'monitor': 'n03782006', 'tabby': 'n02123045', 'tablelamp': 'n04380533', 'carrier': 'n02687172', 'dishrag': 'n03207743', 'runningshoe': 'n04120489', 'crocodile': 'n01697457', 'person': 'n03450230', 'suspensionbridge': 'n04366367', 'limpkin': 'n02013706', 'numbfish': 'n01496331', 'fly': 'n02190166', 'carwheel': 'n02974003', 'freightcar': 'n03393912', 'submarine': 'n04347754', 'mask': 'n03724870', 'minibus': 'n03769881', 'jeep': 'n03594945', 'daybed': 'n04344873', 'chiffonier': 'n03016953', 'greatgreyowl': 'n01622779', 'taxi': 'n02930766', 'yurt': 'n04613696', 'leopard': 'n02128385'}

基于要求点1实现合并数据集的拆分

要求点2

  1. 通过要点1获得的图片类别名称与类别编号对应的关系字典image_dict,读取字典的键,在该路径下/home/lihuanyu/code/03AdaBins/MyImagenet_merge/val,以键名创建对应文件夹。
  2. 遍历/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val的图片文件名,假设文件名为n02009912_197.JPEG,截取_前面的字符串,并判断字符串属于那个那个键对应的键值,匹配成功后,将图片复制到对应的文件夹。

代码实现

这段代码实现了将一个数据集中的各个子文件夹下的一定数量的图片(num_images_per_class)随机选择后合并到同一个文件夹下的相应子文件夹里。具体来说,代码首先指定了数据集所在的路径 data_path 和每个子目录下需要随机选择的图片数量 num_images_per_class,接着用 get_key_by_value 函数通过图像 ID 在 image_dict 字典中查找对应的类别名称,然后根据该名称创建相应的文件夹,建立好文件夹和文件之间的映射关系后,用 shutil 库的 copy 函数将指定的图片从原数据集路径 data_path 复制到新路径(即将所有子文件夹的图片复制到同一文件夹下相应子文件夹里)。整个过程会输出完成复制的图片数量。


import os  
import shutil  
  
# 定义图片数据集路径和每个子目录下需要随机选择的图片数量  
type = 'val'  
  
data_path = '/home/lihuanyu/code/03AdaBins/MyImagenet_disorganize/{}'.format(type)  #未合并的文件夹位置  
num_images_per_class = 1  
  
def get_key_by_value(dict_obj, value):  
    """  
    返回一个字典中某个值对应的键  
    :param dict_obj: 字典对象  
    :param value: 字典中的值  
    :return: 与给定值对应的键,若未找到则返回 None    """    for k, v in dict_obj.items():  
        if v == value:  
            return k  
    return None  
i = 0  
# 根据字典的键名创建对应的文件夹  
for label_name in image_dict.keys():  
    if not os.path.exists(os.path.join('/home/lihuanyu/code/03AdaBins/MyImagenet_merge/{}'.format(type), label_name)): #合并的文件夹位置  
        os.makedirs(os.path.join('/home/lihuanyu/code/03AdaBins/MyImagenet_merge/{}'.format(type), label_name))  #合并的文件夹位置  
    for filename in os.listdir(os.path.join('/home/lihuanyu/code/03AdaBins/MyImagenet_process/{}'.format(type),label_name)):  
        label_idx = filename.split('_')[0]  
  
        key_idx = get_key_by_value(image_dict,label_idx)  
        src_path = os.path.join(data_path, filename)  
        dst_path = os.path.join('/home/lihuanyu/code/03AdaBins/MyImagenet_merge/{}'.format(type), key_idx, filename)  
        shutil.copy(src_path, dst_path)  
        i = i + 1  
        print("完成第{}个图片{}".format(i,filename))

结果呈现

在这里插入图片描述

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

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

相关文章

数据结构_第十一关:二叉树的链式结构

目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.3二叉树遍历的实现: 1)先序遍历、中序遍历、后续遍历代码如下 2)层序遍历: 1.4结点个数以及高度的计算 1)求二叉树的总节点: 2&#…

阿里张勇:所有行业都值得用大模型重新做一遍!

‍数据智能产业创新服务媒体——聚焦数智 改变商业“2023阿里云峰会”于4月11日在北京国际会议中心隆重召开,本次峰会以" 与实俱进 为创新提速!"为主题,阿里巴巴集团董事会主席兼首席执行官张勇、阿里云智能集团首席技术官周靖人、…

Python机器学习:适合新手的8个项

再多的理论也不能代替动手实践。教科书和课程会让你误以为精通,因为材料就在你面前。但当你尝试去应用它时,可能会发现它比看起来更难。而「项目」可帮助你快速提高应用的 ML 技能,同时让你有机会探索有趣的主题。此外,你可以将项…

java mysql高校教学成果管理系统dzkfY3程序

1.用户管理模块: 该模块包括注册用户管理和系统用户管理,系统用户主要是普通管理员,对用户信息进行管理,只有注册用户才可在该系统上进行相应的操作。用户对个人信息可进行修改;管理员可对自己的个人信息进行维护&…

Java线程系列详解

一,基本概念 进程: 程序是计算机指令的集合,它以文件形式存储在磁盘上,而进程就是一个执行中的程序,而每一个进程都有其独立的内存空间和系统资源。线程: 线程运行在进程中,不能独立存在。线程…

2019年 团体程序设计天梯赛——题解集

前言: Hello各位童学大家好!😊😊,茫茫题海你我相遇即是缘分呐,或许日复一日的刷题已经让你感到疲惫甚至厌倦了,但是我们真的真的已经达到了我们自身极限了吗?少一点自我感动&#xf…

城乡供水一体化信息化系统-城乡供水一体化

建设方案 城乡供水一体化信息化系统是运用云计算、大数据等信息化手段,借助在线监测设备,并依托“供水信息化平台”,实时感知供水系统的运行状态,实现对农村供水工程远程监控、在线监测、实时预警、智慧监管。 系统功能 水源地监测…

【 初识 Spring MVC 程序开发 】

文章目录一、什么是 Spring MVC二、什么是 MVC三、MVC 和 Spring MVC 的关系四、为什么要学 Spring MVC五、怎么学 Spring MVC六、Spring MVC 创建和连接一、什么是 Spring MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框…

搜索算法(一) 深度优先搜索 dfs

一、搜索算法 包括深度优先搜索算法和广度优先搜索算法,用于树或图等结构中进行搜索。 二、深度优先搜索 深度优先算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源…

全网最详细,Jmeter性能测试-性能基础详解,终成测试卷王(一)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 发起请求 发起HTTP…

电脑自动录屏软件哪个好用 电脑自动录屏怎么设置

录屏是很多工作都需要进行的操作,很多会议、培训课程、PPT等都可能需要通过屏幕录制的方式来进行分享。但是目前市面上的录屏软件很多,想找到使用便捷且高效的软件并不容易。今天就来分享一下电脑自动录屏软件哪个好用,电脑自动录屏怎么设置。…

条码控件Aspose.BarCode入门教程(5):用Java 生成和扫描二维码

Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

学习数据结构第4天(线性表的顺序表示)

线性表的顺序表示顺序表的定义顺序表的基本操作顺序表的定义 线性表的顺序存储又称顺序表。顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储时指用一组地址连续的存储单元,依次存储线性表中的各个元素。因此线性表中任一数据元素都可…

60行代码出炫酷效果之 python语音控制电脑壁纸切换

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 电脑大家有吧!手大家有吧!今天!! 就由我带领大家用区区60行代码打造一款语音壁纸切换器程序!!! 单纯的桌面有时候会让人觉得单调&#xff0c…

vue.js实现带表情评论功能前后端实现(仿B站评论)

文章目录学习链接效果图后台建表评论表(重要)用户表实体类CommentUserCommentDTO(重要)WebConfig配置配置跨域和静态资源文件夹Mybatisplus相关类MyBatisPlusConfig 配置分页插件CommentMapperCommentMapper.xml(非常重…

git 将其它分支的文件检出到工作区

主要是使用如下命令&#xff1a; git checkout [-f|--ours|--theirs|-m|--conflict<style>] [<tree-ish>] [--] <pathspec>…​覆盖与 pathspec 匹配的文件的内容。当没有给出<tree-ish> (通常是一个commit)时&#xff0c;用 index 中的内容覆盖工作树…

高频电流探头示波器电流探头的功能检验和消磁操作

高频电流探头运用了成熟的霍尔效应技术并与示波器接口相结合。主要特点包括&#xff1a;分芯结构&#xff0c;简便地连接电路&#xff1b;AC / DC测量能力&#xff1b;精度1%5mV&#xff1b;连接的仪器上直接显示读数。 功能检验&#xff1a; 1、探头连接示波器&#xff1b; 2…

OpenAI Embedding:基于人工智能的搜索新篇章

theme: orange 本文正在参加「金石计划」 Embedding模型在许多应用场景中都有广泛的应用。在OpenAI中&#xff0c;文本嵌入技术主要用于衡量文本字符串之间的相关性。 什么是Embedding 嵌入(Embeddings)是一种将离散变量表示为连续向量的方法。它在机器学习中起到了不可或缺的作…

字节分享的软件测试《面试笔记》文档,让我直呼卧槽卧槽

我有一个朋友&#xff08;真是朋友&#xff0c;不是我啊&#xff09;&#xff0c;前几年环境好的时候入的行&#xff0c;那时候软件测试的要求真的很低&#xff0c;他那时好像是报了个班&#xff0c;然后入门的&#xff0c;但学的都是些基础&#xff0c;自动化涉及了一点&#…

天坑,后悔进那外包啊......

关于计算机专业应届生毕业之后会遇到的就业问题&#xff0c;网上已经有许多的套路&#xff0c;实际上许多人在选择专业的时候并没有考虑到之后的就业方向&#xff0c;甚至于自己所学的专业面向的工作岗位都不是特别清楚。计算机专业毕业大概率是要做程序员的&#xff0c;而目前…