ImageNet-1K数据集的准备与导入指南

ImageNet-1K是计算机视觉领域最常用的基准数据集之一,包含1000个类别的图像数据。本文将详细介绍如何下载、处理和加载ImageNet-1K数据集,帮助您快速开始深度学习模型的训练与测试。

1. 数据集下载

您可以通过以下百度网盘链接获取ImageNet-1K数据集:

链接ImageNet-1K

提取码abel

2. 数据集结构准备

下载完成后,请按照以下步骤组织数据集结构:

  1. 创建三个主要文件夹:trainvaltest
  2. 将对应的压缩包放入各自的文件夹中
  3. 解压各个压缩包文件

注意train压缩包解压后会产生1000个子压缩包,这些子压缩包对应ImageNet-1K的1000个类别。

3. 批量解压训练数据

解压完主压缩包后,需要批量解压train文件夹中的1000个子压缩包。请在train文件夹中执行以下Shell命令:

1
for f in *.tar; do [ -f "$f" ] && mkdir -p "${f%.tar}" && tar -xf "$f" -C "${f%.tar}"; done && rm *.rar

执行上述脚本后,您将在train文件夹下获得1000个子文件夹,每个文件夹包含对应类别的图片数据。

4. 验证集数据处理

验证集(val)的图片默认是平铺的,需要按类别组织到对应的文件夹中。请按照以下步骤操作:

4.1 解压开发工具包

首先,解压ImageNet开发工具包:

1
tar -xzf ILSVRC2012_devkit_t12.tar.gz

4.2 组织验证集图片

在ImageNet根目录(包含devkitval的目录)中,创建并运行以下Python脚本:

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
from scipy import io
import os
import shutil

def move_valimg(val_dir='./val', devkit_dir='./ILSVRC2012_devkit_t12'):
"""
将验证集图片移动到对应类别的文件夹中
val_id(从1开始) -> ILSVRC_ID(从1开始) -> WIND
组织结构如下:
/val
/n01440764
images
/n01443537
images
...
"""
# 加载synset、验证集真值和验证集图片列表
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:
# 验证集图片名称 -> 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))

# 移动验证集图片到对应类别文件夹
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()

运行此脚本后,验证集图片将被组织到各自类别的文件夹中,便于后续使用。

5. 使用PyTorch加载数据集

完成上述准备工作后,您可以使用PyTorch的torchvision.datasets.ImageFolder轻松加载ImageNet-1K数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os
import torch
import torchvision.datasets as datasets

def get_imagenet(root='data/imagenet', train=True, transform=None, target_transform=None):
"""
加载ImageNet-1K数据集

参数:
root: 数据集根目录
train: 是否加载训练集
transform: 图像变换
target_transform: 标签变换

返回:
ImageFolder数据集对象
"""
if train:
root = os.path.join(root, 'train')
else:
root = os.path.join(root, 'val')
return datasets.ImageFolder(root=root,
transform=transform,
target_transform=target_transform)

6. 数据集使用示例

以下是一个完整的示例,展示如何使用PyTorch加载并预处理ImageNet-1K数据集:

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
import torch
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 定义数据变换
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

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

# 加载数据集
train_dataset = get_imagenet(root='data/imagenet', train=True, transform=train_transform)
val_dataset = get_imagenet(root='data/imagenet', train=False, transform=val_transform)

# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=256, shuffle=True, num_workers=8, pin_memory=True)
val_loader = DataLoader(val_dataset, batch_size=256, shuffle=False, num_workers=8, pin_memory=True)

# 现在您可以使用train_loader和val_loader进行模型训练和验证

总结

通过本指南,您已经学会了如何下载、处理和加载ImageNet-1K数据集。这个数据集是计算机视觉研究和应用的重要资源,掌握其使用方法将有助于您开展深度学习模型的训练与评估工作。