ImageNet数据集 & 下载_imagenet数据集下载-程序员宅基地

技术标签: 数据集  机器学习  深度学习  人工智能  

1. ImageNet 说明

ImageNet官网http://image-net.org/

ImageNet 由斯坦福李飞飞教授带领创建,ImageNet 本身有2万多个的类别,超过 1400 万张图片,其中超过 100 万张图片有明确类别标注和物体位置标注。

ImageNet 按照 WordNet 层级结构组织数据,首先介绍一下 WordNet。在 WordNet 中每一个概念(concept)都会由很多个词(word)或者短语(word phrase)来描述,就好比说 “动物 animal” 作为一个 concept,可以包含 “domestic animal 家畜”、“work animal 役畜” 等 work phrase,而 “domestic animal 家畜” 又可以继续细分为 “domestic dog”、“dog” 等。因此将每一个 concept 记作一个 “synonym set 或 synset”(同义词集合)。WordNet 中包含超过 100,000 个 synset,其中 80,000+ 是名词。WordNet 以 Synset 为基本单位来组织单词,可以认为 WordNet 是一个树状结构,从其根结点到叶子结点是一个不断细分的过程,并且每个结点都是一个 Synset。

ImageNet 包含 82,115 个 Synset(均为 WordNet 中的名词),平均在每个 Synset 上都设置了 1,000 张图像。

在这里插入图片描述
适用任务:图像分类,目标检测,目标定位、视频目标检测、场景分类

特别解释ILSVRC (ImageNet Large-Scale Visual Recognition Challenge) 是一个基于 ImageNet 的比赛,每年都会从ImageNet中抽取部分数据作为比赛数据集。ILSVRC 从 2010 年开始举行,每年一次,到 2017 年最后一届结束,因此 “ILSVRC+年份” 也用来特指某一年比赛的数据集(属于ImageNet的子集),基于 ILSVRC 比赛的子数据集也是各种论文中最常用的数据集。

2. ILSVRC2012 说明

很多论文都常用 ILSVRC2012 作为实验数据集,ILSVRC2012 包含1000个类别(ImageNet 的 1000 个 Synset),每个类别大约有1000张图片。其中测试集未公开标注信息,因此常用验证集来进行模型的测试。
在这里插入图片描述
ILSVRC2012 的类别编号和类别名称参考:类别名称对应表

ILSVRC2012 类别数 (Number of classes) 图片数 (Number of images) 文件大小 (Size on disk) 标注
训练集 1000类 约120万张图片 ~140GB 公开
验证集 1000类 5万张图片 ~6GB 公开
测试集 1000类 10万张图片 ~13GB 未公开

在官网下载ILSVRC2012时,可以看到训练数据集(Training images)被分为了 (Task1 & 2) 和 (Task 3),其中 (Task 1 & 2) 是用于图像识别任务的。
在这里插入图片描述
验证集(Validation images)对应的标注信息在Development kit (Task 1 & 2)中,下载压缩包后解压,找到ILSVRC2012_devkit_t12/data文件夹,里面的ILSVRC2012_validation_ground_truth.txt就是验证集对应的标注label。
在这里插入图片描述

3. ImageNet下载方式

ImageNet不可用于商业目的,因此需要认证edu邮箱,直接用学校邮箱认证的话请求会立马通过,如果用其他后缀的普通邮箱需要审核1~5天还不一定能审核通过。用学校邮箱认证之后会收到邮件,从邮件内提供的链接就可以进入数据的Download页面,ILSVRC下面按照年份分类,一般最常用的就是ILSVRC 2012,可以根据自己的需要选择年份。进入之后在Images条目下就是Train/Val/Test数据。

step1:进入Download页面 - 按需选择ILSVRC年份:
在这里插入图片描述
step2:在Images部分就是训练/验证/测试数据集
在这里插入图片描述
关于下载方式,如果不方便从官网下载,可以选择以下备用方案:

4. ImageNet数据组织与使用

仍以 ILSVRC 2012 为例,在这里能够下载到关于 ILSVRC 2012 的所有数据文件。其中,带有 bbox 标识的用于目标检测任务,包括以下 4 个文件:
在这里插入图片描述
用于图像分类任务的包含以下 4 个文件:其中 train 分为了 traintrain_t3,分别对应着 task 1&2task 3
在这里插入图片描述
devkit 工具包包含以下 2 个文件:
在这里插入图片描述
训练集 ILSVRC2012_img_train 下包含两级目录,第一级目录包含 1000 个子文件夹,对应 1000 个类别。每个二级目录包含 1300 张图片,表示每个类别提供了 1300 个样本。每个子文件夹的名称为 n******,其下对应的图片名称也以文件夹名称为前缀,其后为图片序号。
在这里插入图片描述
在这里插入图片描述
验证集 ILSVRC2012_img_val 下包含 50K 张图片,可以看到验证集图片名称前缀没有类别信息。要获取验证集标签信息,需要从 ILSVRC2012_devkit_t12/data 中的 ILSVRC2012_validation_ground_truth.txt 得到。
在这里插入图片描述
1. 解压 train 和 val 数据,由于 test 数据未提供标签,因此这里不使用。

# 解压trian数据
tar -xvf ILSVRC2012_img_train.tar
# 解压val数据
mkdir ILSVRC2012_img_val
tar -xvf ILSVRC2012_img_val.tar -C ILSVRC2012_img_val
# 解压devkit
tar -xzvf ILSVRC2012_devkit_t12.tar.gz

2. 重新组织 val 数据,按照 train 数据的组织方式,对 val 数据进行处理,方便后续训练验证时对数据的加载。

def imagenet_val_process(images_dir, devkit_dir):
  """
  move val images to correspongding class folders.
  """
  # load synset, val ground truth and val images list
  synset = scipy.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(images_dir))
  for filename in filenames:
      # val image name -> ILSVRC ID -> WIND
      val_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 images
      output_dir = os.path.join(root, WIND)
      if os.path.isdir(output_dir):
          pass
      else:
          os.mkdir(output_dir)
      shutil.move(os.path.join(root, filename), os.path.join(output_dir, filename))

if __name__ == '__main__':
    img_dir = "/data/imagenet/ILSVRC2012_img_val"
    dev_dir = "/data/imagenet/ILSVRC2012_devkit_t12"
    imagenet_val_process(img_dir, dev_dir)

重新组织后的 val 数据与 train 数据的组织方式相同,按照二级目录的方式,包含 1000 个子文件夹(类别),每个子文件夹下包含 50 张用于验证的图片。
在这里插入图片描述

3. ImageNet 数据读取(PyTorch)

一种比较简单的读取方式是,使用 PyTorch 中自带的库 ImageFolder。ImageFolder 适合读取数据组织结构如下的数据集:

--| root
----| class1
------| img1.png
------| img2.png
------| ...
----| class2
------| ...
----| class3
------| ...

即数据按照两级目录组织,第一级目录是类别,第二级是每个类别对应的所有样本。

import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFolder

data_transform = transforms.Compose([
       transforms.Resize(299),
       transforms.CenterCrop(299),
       transforms.ToTensor(),
       transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
   ])

# 使用ImageFolder读取
train_dataset = ImageFolder(root='/data/imagenet/ILSVRC2012_img_train',transform=data_transform)
train_dataset_loader = DataLoader(train_dataset, batch_size=4, shuffle=False, num_workers=4)

print(train_dataset.imgs == train_dataset.samples)  # True
for i, (images, labels) in enumerate(train_dataset_loader):
	print(images.size())
	print(labels.size())

通过 ImageFolder 读取的结果,可以看到包含以下内容:
在这里插入图片描述

其中:

  • class:List,包含 1000 个类别名称
  • class_to_idx:Dict,每个类别名称字符串与其对应的类别序号
  • imgssamples:List,每个 List 元素为 Tuple,为每张图片的路径和其对应的类别序号
  • targets:List,每张图片对应的类别序号

施工中…

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31347869/article/details/125560632

智能推荐

进程间的几种通信方式_break shmget-程序员宅基地

文章浏览阅读131次。无名管道int pipe(int pipefd[2]);例:#include<sys/types.h>#include<unistd.h>#include<string.h>#include<stdio.h>#include<sys/wait.h>#include<stdlib.h>int main(){ int fd[2]; char buf[128]; pid_t pid; if(pipe(fd) == -_break shmget

gbq6的文件能转换成gbq5_pdf怎么转换成word?这些方法转换效果更佳-程序员宅基地

文章浏览阅读4.4k次。最近,不少朋友们给我留言,问题大概是如下这些:pdf怎么转换成word?如何把PDF文件转换为PPT?如何取出PDF文档中的某几页?如何把几个PDF文档合并成一个?排在首位最多人问的就是PDF转Word文档问题,由于PDF文件自身的一些性质,需要一些特殊的操作才能将其转换成Word格式,但很多普通转换的效果就没有我们想象的那么好了,但我们可以一步步找到最好的转换方法。复制粘贴法有些PDF文件是可以..._gbq6的文件怎么转换成word

Jmeter插件开发实现对mongo数据库的操作_jmeter mongodb返回dbcursor{collection=dbcollection{d-程序员宅基地

文章浏览阅读1.7k次。背景:使用JMeter做接口自动化,用例执行前需要清除一些数据,操作完后校验mongo数据。因为Jmeter3没有对Mongo数据库的支持,所以自己开发java请求实现对mongo的操作。1.eclipse新建java工程,依赖jar包如下2.写一个类实现连接mongo数据库,返回要操作的collection对象public DBCollection ConnectionMongoClient(S..._jmeter mongodb返回dbcursor{collection=dbcollection{database=db{name=''}}}

贪心之最小新整数_请编程完成以下任务: 1.从文件中读取闭区间的个数及它们的描述; 2.找到一个含元素-程序员宅基地

文章浏览阅读187次。贪心水题,每次把山峰删去,如果不存在山峰,则删去最后k个数字#include#includechar s[12];int main(){ int n; scanf("%d",&n); for(int q=0;q

java练习 二、判断语句 if--else语句_输入一个整数,如果此数为0,则输出”石头”,如果此数为1,则输出”剪刀”,如-程序员宅基地

文章浏览阅读2.5k次。1)接java练习 一、HelloWorld,地址:http://blog.csdn.net/u013871927/article/details/700576152)在src文件夹内创建IfPractice.java文件3)打开IfPractice.java,在里面编辑以下代码:public class IfPractice{public String practice(int_输入一个整数,如果此数为0,则输出”石头”,如果此数为1,则输出”剪刀”,如

Unity 中的4X4矩阵_坐标空间变换为什么有4维-程序员宅基地

文章浏览阅读393次。1:为什么模型的变换是4X4而不是3X3的矩阵变换? 我们知道,在空间里的点的坐标是vector3类型的,即是三维的,那为什么要用4维矩阵才能进行旋转平移和缩放呢?要解决这个问题就要从变换的本质来谈起。我们知道,在变换里分为线性变换和非线性变换,比如:我们対模型进行缩放,那么缩放后的点坐标是Pn=aPo (Po是以前的坐标空间,Pn是新的坐标空间,a是缩放比例)好的,现在缩放..._坐标空间变换为什么有4维

随便推点

分布式数据库汇总_分布式数据库有哪些-程序员宅基地

文章浏览阅读4.1k次。1、 Apache HBase HBase :就是bigTable 支持数十亿列 Apache HBase是一个使用Java语言编写的、 以谷歌BigTable技术为基础的开源非关系型列式分布数据库, 可运行在HDFS文件系统之上。HBase提供了很好的存储容错能力和快速访问大量稀疏文件的能力。HBase遵循Apache 2许可证。Hbase的优点:1 列的可以动态增加, 并且列为空就..._分布式数据库有哪些

Mybatis-使用Maven建立Mybatis工程 (IDEA)_使用maven创建一个mybatis-程序员宅基地

文章浏览阅读4k次,点赞3次,收藏8次。使用IDEA创建Mybatis项目Mybatis应用的搭建流程 1. 创建一个maven项目 2. 添加Mybatis,MySQL驱动,junit依赖 3. 构建 4. 在src/main/resources添加一个mybatis-config.xml 5. 编写实体类,放在entity,实体类是跟我们数据库表对应的类 6. 编写映射,mapper包中,定一个m..._使用maven创建一个mybatis

Android毕设项目功能:商城列表与购物车展示(二)_搭构购物车列表条目android-程序员宅基地

文章浏览阅读2.8k次。在上一篇博客中,为大家展示了最终完成效果图,并且分析了界面之间的关系,以及每个界面布局结构中包含的控件信息,对于总体功能数据源进行了封装和介绍。并且重点说明了第一个界面商品分类界面的实现方法。在本篇博客中我们继续操作,完成具体分类的商品信息列表界面的展示。效果图如下:需求分析:此界面的布局结构为上中下结构,可使用线性布局进行排列,上半部分为标题栏,左右两个图标都具备点击功能,左边点击后..._搭构购物车列表条目android

R语言画图表_r语言图表-程序员宅基地

文章浏览阅读3.3k次。R 编程语言中有许多库用来创建图表,主要有6种图表1. 条形图条形图表示矩形条中的数据,其长度与变量的值成比例。R 使用 barplot()函数来创建条形图。R 可以在条形图中绘制垂直和水平条。在条形图中,每个条可以被赋予不同的颜色。语法使用 R 创建条形图的基本语法是barplot(H, xlab, ylab, main, names.arg, col)以下是使用的参数的描述:H..._r语言图表

Netty之线程唤醒wakeup [续]_netty wakeup-程序员宅基地

文章浏览阅读268次。在之前的Netty之线程唤醒wakeup文章中, 介绍了如何唤醒Netty中的监听线程. 接下来我们通过源码的角度,结合一些命令,看一下它的实现.// WakeUp.javaimport java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java._netty wakeup

java encodeuricomponent 编码_encodeURIComponent编码与解码-程序员宅基地

文章浏览阅读1.3w次。问题:JavaScript用encodeURIComponentt编码后无法再后台解码的问题。目前写法:window.self.location="list.jsp?searchtext="+encodeURIComponent(seartext);java处理的代码为:searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");咋一看觉的没..._java encodeuricomponent

推荐文章

热门文章

相关标签