使用windows批量解压和布局ImageNet ISLVRC2012数据集

avatar
作者
筋斗云
阅读量:1

使用的系统是windows,找到的解压命令很多都linux系统中的,为了能在windows系统下使用,因此下载Git这个软件,在其中的Git Bash中使用以下命令,因为Git Bash集成了很多linux的命令,方便我们的使用。

ImageNet 中目前共有 14,197,122 幅图像,总共分为 21,841 个类别(synsets),通常我们所说的 ImageNet 数据集其实是指 ISLVRC2012 比赛用的子数据集,其中 train 有 1,281,167 张照片和标签,共 1000 类,大概每类 1300 张图片,val 有 50,000 副图像,每类 50 个数据,test 有 100,000 副图片,每类 100 个数据。

比赛分为三个场景:图像分类(CLS)、目标定位(LOC)和目标检测(DET)。CLS:2010-2014 比赛中独立任务,2015 年与 LOC 合并,使用 top5。LOC:从 2011 年开始,2015 年与 CLS 合并为 CLS-LOC,单目标定位任务的数据与 CLS 任务包含相同的照片,照片数据手动标注图像是否存在 1000 个物体类别之一的实例,每张图片包含一个 gt 标签,该类别的每个实例都标注了边界框 bounding box,比赛中 IoU>0.5。

1.数据集下载:(一个大佬的链接)

2. 数据解压

我们会得到训练集与验证集的两个压缩包,分别是 ILSVRC2012_img_train.tar 和 ILSVRC2012_img_val.tar

数据集布局要求是:

/path/to/imagenet/   train/     class1/       img1.jpeg     class2/       img2.jpeg   val/     class1/       img3.jpeg     class2/       img4.jpeg 

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

(1)解压训练集

右键对训练集选择Git Bash Here

三行命令逐行输入进Git Bash Here窗口中:

mkdir train && mv ILSVRC2012_img_train.tar train/ && cd train tar -xvf ILSVRC2012_img_train.tar && rm -f ILSVRC2012_img_train.tar find . -name "*.tar" | while read NAME ; do mkdir -p "${NAME%.tar}"; tar -xvf "${NAME}" -C "${NAME%.tar}"; rm -f "${NAME}"; done cd ..  

结果如下:

(2)解压测试集
wget https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh  mkdir val && tar -xvf ILSVRC2012_img_val.tar -C val && mv valprep.sh val && cd val && bash valprep.sh 

下载的valprep.sh文件在外网(valprep.sh文件中保存的就是图片按类生成文件夹的布局),或者可以直接迅雷链接,将下载后的文件放入和验证集压缩包同一文件夹下,这样直接在Git Bash Here窗口使用第二个命令就可以完成解压。(也是一个大佬的链接)

链接:https://pan.xunlei.com/s/VMkus56ePQ4LMJUIXheBkhXSA1 提取码:k9ej
或者利用python解压测试集:

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

验证集的标签在 Development kit (文件名为 ILSVRC2012_devkit_t12.tar.gz)中的ILSVRC2012_devkit_t12\data\ILSVRC2012_validation_ground_truth.txt 中:

在映射关系储存在和txt文件同目录下的 meta.mat 文件中。我们希望验证集的文件结构长得和训练集一样,即 :

/val /n01440764 images /n01443537 images 

解压完压缩包后:新建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() 

3. 预处理Crop & Resize

数据集在扔给网络模型做训练前还需要统一尺寸处理,一方面是 CNN 需要统一尺寸的输入,另一方面是可以有数据增强的效果。一般来说有 crop 和 resize 两个过程。

其中 crop 的方法有 single crop 和 multiple crops 两种:

  • single crop:先将图像 resize 到某个尺度,例如:256 x N(短边为256),然后 centercrop 成 224x224 作为模型的输入;
  • multiple crops 的具体形式有多种,可自行指定,比如:1)10 crops:取(左上,左下,右上,右下,正中)以及它们的水平翻转,这 10 个 crops 作为 CNN 输入,最终取平均预测结果;2)144 crops:首先将图像 resize 到 4 个尺度:256xN,320xN,384xN,480xN,然后每个尺度上去取“最左”,“正中”,“最右”这 3 个位置的正方形区域,对每个正方形区域,取上述的 10 个 224x224 的 crops,则得到 4x3x10=120 个 crops,再对上述正方形区域直接 resize 到 224x224,以及做水平翻转,则又得到 4x3x2=24 个 crops,总共加起来就是 144 个 crops,输入到网络最后取平均预测结果

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  

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!