当前位置:   article > 正文

下载、处理、加载ImageNet数据集(全网最详细)_imagenet数据集下载

imagenet数据集下载

1. 数据下载

1.1 方法一:[官网下载]

官网下载【ImageNet​www.image-net.org/】

在官方网站注册账号,注册时最好使用教育邮箱(.edu )之后。按照流程申请,收到邮件之后可以就可以在 Download界面里下数据啦~
推荐下载12年的数据,因为比较经典。不如果你如果凑巧财力雄厚,也可以考虑最顶上那个ImageNet21k,它相比12年的数据大的离谱。
在这里插入图片描述

点进去之后,下载如下三个压缩包(图片分类任务用这三个足够了)

在这里插入图片描述

1.2 方法二 [百度网盘下载]

如果你觉得这么下不方便/网速太慢容易断,可以在这个网址自行找12年的版本下载(别全下了呀)

第三方下载方式如下:
里面包含几乎所有常用的ImageNet的数据集以及标注文件。
【数据集下载地址】:https://pan.baidu.com/s/1MEjNh6evha2hcdrQXjNv8w?pwd=yzza

2. 数据解压

下载完毕后把 Development kit 留着备用,我们会得到训练集与验证集的两个压缩包,分别是 ILSVRC2012_img_train.tarILSVRC2012_img_val.tar

首先创建两个用于放训练集和测试集的文件夹,然后解压:

mkdir train
mkdir val
tar xvf ILSVRC2012_img_train.tar -C ./train
tar xvf ILSVRC2012_img_val.tar -C ./val
  • 1
  • 2
  • 3
  • 4

对于train的压缩包,解压之后其实还是1000个tar压缩包(对应1000个类别),需要再次解压,解压脚本unzip.sh如下(PS:可能需要自己改一下目录 dir ):

dir=./train 
for x in `ls $dir/*tar` do     
  filename=`basename $x .tar`     
  mkdir $dir/$filename     
  tar -xvf $x -C $dir/$filename 
done 
rm *.tar
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行脚本之后,我们就获得了1000个文件夹和对应的图片数据啦~截至目前,我们已经把所有的 JPEG 图片搞了出来。

3. 数据标签映射

【点击下载验证集标签】
对于训练集,不同类别的数据躺在不同的文件夹里,用起来很方便(同一文件夹的视为一类)。但是验证集没有对应的标签,需要额外处理。

验证集的标签在 Development kit (文件名为 ILSVRC2012_devkit_t12.tar.gz)中的ILSVRC2012_devkit_t12\data\ILSVRC2012_validation_ground_truth.txt 中:
在这里插入图片描述

但是新的问题又来了,那就是这个数字和文件夹的名字虽然是一一对应的,但还是需要额外的映射……好在映射关系储存在和txt文件同目录下的 meta.mat 文件中。我们希望验证集的文件结构长得和训练集一样,即 :

/val
/n01440764
images
/n01443537
images
  • 1
  • 2
  • 3
  • 4
  • 5

因此,我们首先解压 devkit 压缩包,把我们需要的东西取出来:

tar -xzf ILSVRC2012_devkit_t12.tar.gz
  • 1

之后,在imagenet目录(devkit和val的根目录下)创建并运行如下 python 脚本

from scipy import io
import os
import shutil
 
def 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) -> WIND
    organize like:
    /val
       /n01440764
           images
       /n01443537
           images
        .....
    """
    # load synset, val ground truth and val images list
    synset = 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 -> 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__':
    move_valimg()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

4. 用Pytorch加载

使用 torchvision.datasets.ImageFolder() 就可以直接加载处理好的数据集啦!


def load_ImageNet(ImageNet_PATH, batch_size=64, workers=3, pin_memory=True): 
    
    traindir = os.path.join(ImageNet_PATH, 'ILSVRC2012_img_train')
    valdir   = os.path.join(ImageNet_PATH, 'ILSVRC2012_img_val')
    print('traindir = ',traindir)
    print('valdir = ',valdir)
    
    normalizer = transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])

    train_dataset = datasets.ImageFolder(
        traindir,
        transforms.Compose([
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            normalizer
        ])
    )

    val_dataset = datasets.ImageFolder(
        valdir,
        transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            normalizer
        ])
    )
    print('train_dataset = ',len(train_dataset))
    print('val_dataset   = ',len(val_dataset))
    
    train_loader = torch.utils.data.DataLoader(
        train_dataset,
        batch_size=batch_size,
        shuffle=True,
        num_workers=workers,
        pin_memory=pin_memory,
        sampler=None
    )
    val_loader = torch.utils.data.DataLoader(
        val_dataset,
        batch_size=batch_size,
        shuffle=False,
        num_workers=workers,
        pin_memory=pin_memory
    )
    return train_loader, val_loader, train_dataset, val_dataset

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/344617
推荐阅读
相关标签
  

闽ICP备14008679号