ImageNet1K数据集的下载解压与处理

前言

博主因为这个数据集踩了好多坑,浪费了好几天时间,最近终于找到了高效的办法,写此篇文章来记录具体操作方法,也希望可以帮助到有需要的人。(主要是在云服务器是使用)在这里插入图片描述

下载数据集

一共下载三个文件,力求高效,也不要纠结在官网下载了(官网需要学校邮箱),下载的文件和官网一样的。
在Linux上直接用命令行进行下载:

1.训练集(ILSVRC2012_img_train.tar):【费时3h+】

wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar --no-check-certificate

2.验证集(ILSVRC2012_img_val.tar):【费时40min+】

wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar --no-check-certificate

3.标签映射文件(ILSVRC2012_devkit_t12.tar.gz):【费时几秒】

wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_devkit_t12.tar.gz --no-check-certificate

下载好后是这样的
在这里插入图片描述

解压数据集

1.在当前目录下执行命令,解压ILSVRC2012_devkit_t12.tar.gz这个文件:

tar -xzf ILSVRC2012_devkit_t12.tar.gz

会得到文件夹ILSVRC2012_devkit_t12,该文件中记录着验证集中的图像名及其类别标签之间的映射关系。

2.在当前目录下创建val文件夹,使用命令解压。执行命令,将验证集图像解压到 val 目录下:

tar xvf ILSVRC2012_img_val.tar -C ./val

此时 val 目录下是50000张图像,并没有被分类到1000个文件夹下。因此需要将验证集中的图像进行分类存放。【稍后会讲怎么操作】

3.在当前目录下创建img文件夹,存ILSVRC2012_img_train.tar解压后的1000个.tar文件。执行命令,将训练集解压到文件夹 img目录下:

tar xvf ILSVRC2012_img_train.tar -C ./img

用脚本检查是不是有1000个.tar文件,执行脚本代码如下【将代码保存为.py文件】(可选)

import osdef count_tar_files():count = 0for root, dirs, files in os.walk('.'):for file in files:if file.endswith('.tar'):count += 1return countif __name__ == "__main__":tar_file_count = count_tar_files()print(f"当前目录及其子目录下共有 {tar_file_count} 个.tar 文件。")

在当前目录下创建train文件夹,存1000个.tar文件解压后的图片。
执行脚本代码如下【将代码保存为.py文件】

import os
import tarfile
from pathlib import Pathdef batch_extract_tar():"""批量解压目录下的所有.tar文件解压后的文件将保存到知道目录中"""# 指定绝对路径【换成你自己的】source_dir = "/root/lanyun-tmp/img"target_dir = "/root/lanyun-tmp/train"# 验证源目录是否存在source_path = Path(source_dir)if not source_path.exists() or not source_path.is_dir():print(f"错误: 源目录 '{source_dir}' 不存在或不是目录")return# 创建目标目录(如果不存在)target_path = Path(target_dir)target_path.mkdir(parents=True, exist_ok=True)# 统计解压的文件数量extracted_count = 0failed_count = 0# 直接遍历源目录中的所有文件for item in source_path.iterdir():if item.is_file() and item.suffix.lower() == '.tar':try:print(f"正在解压: {item}")# 获取tar文件名(不含扩展名),用于创建子目录tar_name = item.stem  # 例如:n01440764.tar → n01440764target_subdir = target_path / tar_nametarget_subdir.mkdir(exist_ok=True)# 打开tar文件并解压到目标子目录with tarfile.open(item, 'r') as tar:tar.extractall(path=target_subdir)print(f"成功解压到: {target_subdir}")extracted_count += 1except Exception as e:print(f"错误: 解压文件 '{item}' 失败: {e}")failed_count += 1print(f"解压完成: 成功 {extracted_count} 个,失败 {failed_count} 个")if __name__ == "__main__":# 直接调用函数,无需解析命令行参数batch_extract_tar()    

处理val文件夹

解压后的val文件夹是全部图片在一个文件夹,需要把他们按类别分开,分类后是和训练集train一样的显示格式,1000个文件夹的名字和顺序都是完全一致的。
在这里插入图片描述
具体是需要用到文件夹ILSVRC2012_devkit_t12下的文件
在这里插入图片描述
先执行命令安装scipy包

pip install scipy  # 用于解析 .mat 文件

执行脚本代码如下【将代码保存为.py文件】

from scipy import io
import os
import shutildef move_valimg(val_dir='./val', devkit_dir='./ILSVRC2012_devkit_t12'):"""move valimg to correspongding folders.val_id(start from 1) -> ILSVRC_ID(start from 1) -> WINDorganize like:/val/n01440764images/n01443537images....."""# load synset, val ground truth and val images listsynset = io.loadmat(os.path.join(devkit_dir, 'data', 'meta.mat'))ground_truth = open(os.path.join(devkit_dir, 'data', 'ILSVRC2012_validation_ground_truth.txt'))lines = ground_truth.readlines()labels = [int(line[:-1]) for line in lines]root, _, filenames = next(os.walk(val_dir))for filename in filenames:# val image name -> ILSVRC ID -> WINDval_id = int(filename.split('.')[0].split('_')[-1])ILSVRC_ID = labels[val_id-1]WIND = synset['synsets'][ILSVRC_ID-1][0][1][0]print("val_id:%d, ILSVRC_ID:%d, WIND:%s" % (val_id, ILSVRC_ID, WIND))# move val imagesoutput_dir = os.path.join(root, WIND)if os.path.isdir(output_dir):passelse:os.mkdir(output_dir)shutil.move(os.path.join(root, filename), os.path.join(output_dir, filename))if __name__ == '__main__':move_valimg()

到此,恭喜你已经完成了全部工作。

尾声

一些碎碎念念。博主一开始在官网下载不了数据集,在咸🐟上花几块钱买了百度网盘资源,先把资源下载在本地之后又通过FileZilla来把资源上传到云服务器上【因为网络传输的不稳定,FileZilla还经常传输失败】,花了好几天终于完成了数据集的下载与上传工作,结果处理val验证集成功之后发现他的1000个文件夹与train的1000个文件夹名有一些对不上【具体来说就是train文件夹中有两个文件夹是完全重复的一个是XXX.tar文件另外一个是XXX(1).tar文件,然后val中的最后一个文件,train中没有。】,博主的心情五味杂陈,这证明train文件有错,博主前面的工作都白费了那些资源根本用不了,咸鱼上的ImageNet的网盘资源大家还是不要随便相信了。

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

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

相关文章

OkHttp 与 Room 结合使用:构建高效的 Android 本地缓存策略

前言在现代 Android 应用开发中,网络请求与本地数据持久化是两大核心功能。OkHttp 作为强大的网络请求库,与 Jetpack Room 持久化库的结合使用,可以创建高效的数据缓存策略,提升应用性能和用户体验。本文将详细介绍如何将这两者完…

Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]

Nacos中feign.FeignException$BadGateway: [502 Bad Gateway] 文章目录Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]背景原因背景 Mac本地运行Nacos微服务项目,调用服务失败 原因 关闭本地代理clash或者其他,windows没发现问题&#x…

基于deepseek的LORA微调

LORA微调: 核心是:低秩转换,减少参数。冻结大部分,调节部分模块(注意力模块的Wq,Wk,Wv)。 调整过后得到一个lora.safetensors, 内部记录了(detail W: 即部分修改的W)。推理使用原权重和lora权重。 具体操…

Linux运维新手的修炼手扎之第22天

Tomcat服务1 java项目部署方式:war包部署、jar包部署、源代码部署2 Ubuntu环境部署Java - openjdk[熟练]:#安装软件rootubuntu24-13:~# apt update; apt list openjdk*rootubuntu24-13:~# apt install openjdk-11-jdk -y#检测效果rootubuntu24-13:~# whereis javaja…

Python爬虫实战:研究Genius库相关技术

1. 引言 在当今数字化时代,音乐数据的分析与挖掘成为了音乐学、计算机科学等领域的研究热点。歌词作为音乐的重要组成部分,蕴含着丰富的情感、文化和社会信息。通过对歌词数据的分析,可以揭示音乐风格的演变、流行趋势的变化以及社会情绪的波动等。 Genius 是一个专注于歌词…

内核协议栈源码阅读(一) ---驱动与内核交互

文章目录 一、硬中断 1.1 `e100_intr` 1.2 `__netif_rx_schedule` 1.3 补充: 二、软中断 2.1 net_rx_action 2.2 e100_poll 2.3 补充 三、非 NAPI 的软中断处理 3.1 netif_rx 3.2 backlog_dev->poll 3.3 补充 四、总结 以 e100_intr 为例: 一、硬中断 1.1 e100_intr 网卡…

Vue3 面试题及详细答案120道(61-75 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

ubuntulinux快捷键

1.复制文件使用cp命令。cp是复制的简写。语法也很简单。使用,cp后跟要复制的文件以及要将其移动到的目的地cp ~/Downloads/your-file.txt ~/Documents/2.复制文件夹为了复制文件夹及其内容,您将需要告诉cp命令以递归方式复制。使用-r标志就足够简单了。c…

将 `knife4j` 和 `springdoc-openapi` 集成到你的 Spring Boot 应用

集成 knife4j 和 springdoc-openapi 可以让你在 Spring Boot 应用中拥有更美观和功能丰富的 API 文档界面。knife4j 是基于 Swagger 的一个 UI 增强包,而 springdoc-openapi 则是用于生成 OpenAPI 3 文档的库。下面是如何将两者集成到你的 Spring Boot 项目中的步骤。 步骤 1…

split() 函数在 Java、JavaScript 和 Python 区别

split() 函数在 Java、JavaScript 和 Python 中均用于字符串分割,但在语法、参数设计和行为上存在显著差异。以下是三者的核心区别及使用示例:1. ​​语法与参数设计​​​​语言​​​​语法​​​​参数说明​​​​Java​​String.split(regex, limit…

zabbix基于GNS3监控部署

目录 一、配置 二、zabbix配置 一、配置 1.添加路由和主机 f2接口配置192.168.80.254 f3接口配置192.168.90.254 R2的f3接口配置192.168.33.200 2.配置虚拟机ip网关 web1 web2 3.测试三台主机zhijianshifoutongxin ping pc1 ping pc2 4.在R2网关中配置专业模式下设置共同体…

Java编程与GMSEC_API在UE4集成的笔试实战

本文还有配套的精品资源,点击获取 简介:本次4399游戏公司的Java笔试题主要针对应聘者的编程能力,特别强调了与游戏开发相关的技术知识。题目的核心内容是使用Java环境下的GMSEC_API与流行的游戏引擎Unreal Engine 4进行交互。这不仅考察了…

学习C++、QT---33(QT库中如何使用事件过滤器实现我们的放大缩小字体功能)

🌟 嗨,我是热爱嵌入式的涛涛同学!每日一言别害怕改变,走出舒适圈才能遇见更好的自己。实现完这个之后我们来接触一下事件过滤器来实现这个功能吧好的那么我们的这个事件过滤器的这个函数在QObject类里面这边也有相对应的代码案例进…

[每日随题15] 前缀和 - 拓扑排序 - 树状数组

整体概述 难度:1000 →\rightarrow→ 1500 →\rightarrow→ 2000 1567B. MEXor Mixup 标签:前缀和 前置知识:无 难度:Div.2.B 1000 题目描述: 输入格式: 输出格式: 样例输入: …

DDD领域驱动设计C++实现案例:订单管理系统

一、DDD核心概念简介 领域驱动设计(Domain-Driven Design)是一种软件开发方法论,强调将业务领域的概念和规则融入软件设计中。核心概念包括: 值对象(Value Object): 无唯一标识,基于属性值判断相等性实体(Entity): 有唯一标识,其生…

神经网络和机器学习的一些基本概念

记录一些基本概念,不涉及公式推导,因为数学不好,记了也没啥用,但是知道一些基本术语以及其中的关系,对神经网络训练有很大帮助。 可能有些概念不会讲得很详细,但是当你有了这个概念,你就知道往这个方向去获取更详细的信息,不至于连往哪走都不知道。 下面以多元线性回归…

MySQL(146) 如何迁移数据库到新服务器?

数据库迁移到新服务器是一项复杂而重要的任务,确保数据完整性和最小化停机时间至关重要。以下是一个详细的步骤指导,包括准备工作、数据备份、数据传输、数据恢复和验证的全过程。 一、准备工作 1. 确认服务器环境 源服务器:当前运行数据库的…

图论的整合

图 有若干个节点,有若干条边连接节点。(两个点之间不是必须相连) 比如: 有向图 可以理解为边上面有箭头的图,比如下面这张图: 在这张图中,点 111 可以通过这条有向边到达点 222&#xff0c…

电子设计大赛【C语言核心知识点】讲解

目录 前言 1. 基础语法 2. 流程控制 3. 函数 4. 数组与字符串 5. 指针(核心重点) 6. 内存管理 7. 结构体与联合体 8. 文件操作 9. 预处理器 10. 高级特性 内存布局图解 前言 在进行程序代码开发之前,需要掌握好C语言各个模块之间…

Numpy 库 矩阵数学运算,点积,文件读取和保存等

目录 1.数组(矩阵)的组合 2.数组(矩阵)的切割 3.数组的数学运算 4.数组的深拷贝和浅拷贝 5.随机模块 6.矩阵统计运算 7.矩阵的特有运算点积,求逆 8.文件读取和保存 1.数组(矩阵)的组合 水…