ImageNet-1K是计算机视觉领域最常用的基准数据集之一,包含1000个类别的图像数据。本文将详细介绍如何下载、处理和加载ImageNet-1K数据集,帮助您快速开始深度学习模型的训练与测试。
1. 数据集下载
您可以通过以下百度网盘链接获取ImageNet-1K数据集:
链接:ImageNet-1K
提取码:abel
2. 数据集结构准备
下载完成后,请按照以下步骤组织数据集结构:
- 创建三个主要文件夹:
train
、val
和test
- 将对应的压缩包放入各自的文件夹中
- 解压各个压缩包文件
注意: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根目录(包含devkit
和val
的目录)中,创建并运行以下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 = 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_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)
|
总结
通过本指南,您已经学会了如何下载、处理和加载ImageNet-1K数据集。这个数据集是计算机视觉研究和应用的重要资源,掌握其使用方法将有助于您开展深度学习模型的训练与评估工作。