本文主要涉及 ImageNet 数据集的简要介绍以及手把手教你从下载、预处理以及使用的全教程,欢迎交流。
什么是 ImageNet?
ImageNet 是一个计算机视觉系统识别项目,是目前世界上最大的图像识别数据库。此项目由斯坦福大学李飞飞等教授于 2009 年发起,当时在 CVPR2009 上发表了一篇名为「ImageNet:A Large-Scale Hierarchical Image Database」的论文,之后从 2010 至 2017 年举行了基于 ImageNet 数据集的比赛。
ImageNet 通过类似于 WordNet 层次结构组织图像数据。什么是 WordNet?WordNet 根据词条的意义将它们分组,每一个具有相同意义的字条组称为一个 synset,即同义词集合,WordNet 为每一个 synset 提供了简短概要的定义,并记录不同 synset 之间的语义关系。而 ImageNet 是一个基于 WordNet 主干结构的大规模图片库,ImageNet 旨在用平均 500 到 1000 张清晰分辨率的图片来说明 WordNet 中大多数同义词集合。
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。
数据预处理
数据预处理主要分为两个主要步骤:
- 下载数据和我的数据预处理项目代码,将数据压缩包放置到下载好的项目指定目录下;
- 解压数据和按类别整理数据;
关于下载数据,目前 ImageNet 官网已停止免费下载数据,但我已经将 ILSVRC2012 数据集整理到百度云,链接如下:
- 训练集:ILSVRC2012_img_train.tar.gz,提取码:yoos;
- 验证集:ILSVRC2012_img_val.tar.gz,提取码:yl8m;
- 测试集:ILSVRC2012_img_test.tar.gz,提取码:jumt;
- 任务 1&2 的 devkit:ILSVRC2012_devkit_t12.tar,提取码:dw6i;
下载好数据和 devkit 后,便可开始数据预处理,详细代码可见我的 github repo:ImageNet_Pretrained,项目 clone 到本地之后,将上面下载好的四个压缩文件放置于 /database 目录下。
至于解压数据,请在 /database 目录下打开命令行,首先执行以下四条命令分别解压四个文件:
# mkdir train && cp ILSVRC2012_img_train.tar.gz train && cd train && tar -xvf *.gz && rm -rf *.gz && cd .. # mkdir val && cp ILSVRC2012_img_val.tar.gz val && cd val && tar -xvf *.gz && rm -rf *.gz && cd .. # mkdir test && cp ILSVRC2012_img_test.tar.gz test && cd test && tar -xvf *.gz && rm -rf *.gz && cd .. # tar -xvf ILSVRC2012_devkit_t12.tar
按上述步骤解压完后,在 /database 目录下将得到以下目录结构:
# --- /database # |--- ILSVRC2012_devkit_t12/ # |--- test/ # |--- train/ # | |--- n01440764.tar # | |--- n01443537.tar # | |--- ... # |--- val/ # | |--- ILSVRC2012_val_00000001.JPEG # | |--- ILSVRC2012_val_00000002.JPEG # | |--- ... # |--- ILSVRC2012_devkit_t12.tar # |--- ILSVRC2012_img_test.tar.gz # |--- ILSVRC2012_img_train.tar.gz # |--- ILSVRC2012_img_val.tar.gz
可见在 train/ 目录下还有待解压的文件,而 val/ 下的图片也需要进一步按类别建立文件夹管理:
# python3 preprocess_ilsvrc2012.py
之所以要处理成按类别建文件夹的形式,是因为后续使用 Pytorch 的 ImageFolder 加载数据时,ImageFolder 默认假设所有的文件按文件夹保存,每个文件夹下储存同一个类别的图片,文件夹名为类别名。
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,输入到网络最后取平均预测结果;
测试时:
Ref:
<https://www.jiqizhixin.com/graph/technologies/f3400606-ef61-441c-8bc3-dd5663313fb9>