下载、预处理和上传 ImageNet 数据集
本主题介绍如何下载、预处理和上传用于 Cloud TPU 的 ImageNet 数据集。使用 ImageNet 数据集的机器学习模型包括:
- ResNet
- AmoebaNet
- EfficientNet
- MNASNet
ImageNet 数据库的大小意味着训练模型需要相当长的时间。另一种方法是使用演示版的数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试模型,同时降低通常与使用完整 ImageNet 数据库相关的存储空间和时间要求。
预处理完整的 ImageNet 数据集
ImageNet 数据集包括三个部分:训练数据、验证数据和图片标签。
训练数据包含 1000 个类别和 120 万张图片,已打包好以便可以轻松下载。验证数据和测试数据不包含在 ImageNet 训练数据中(重复项已移除)。
验证数据和测试数据由 15 万张照片组成,这些照片是通过 Flickr 和其他搜索引擎收集而来,并手动标记是否存在 1000 个对象类别。1000 个对象类别同时包含 ImageNet 的内部节点和叶节点,但彼此不重叠。发布了带有标签的 50000 个寻机图片子集作为验证数据,以及包含 1000 个类别的列表。其余图片用于评估,并已发布且不带标签。
预处理完整的 ImageNet 数据集的步骤
准备完整的 ImageNet 数据集以供机器学习模型使用,这个过程分为五个步骤:
- 验证下载目标上是否有空间。
- 设置目标目录。
- 在 ImageNet 网站上注册并申请下载权限。
将数据集下载到本地磁盘或 Compute Engine 虚拟机。
运行预处理并上传脚本。
验证空间要求
无论您是将数据集下载到本地机器还是下载到 Compute Engine 虚拟机,下载目标都需要大约 300GB 的空间。在虚拟机上,您可以使用 df -ha
命令检查可用存储空间。
您可以使用以下任一方法来增加虚拟机磁盘的大小:
- 使用要分配的大小(以 GB 为单位)在
gcloud compute
命令行上指定--disk-size
标志。 - 按照 Compute Engine 指南向您的虚拟机添加磁盘。
- 将删除实例时设置为删除磁盘,以确保在您移除虚拟机后,相应磁盘也会一并移除。
- 记下新磁盘的路径,例如:
/mnt/disks/mnt-dir
。
设置目标目录
在本地机器或 Compute Engine 虚拟机上,设置目录结构来存储下载的数据。
创建并导出 ImageNet 数据集的主目录。
在本地机器或虚拟机上的主目录下创建一个目录,例如
imagenet
。在此目录下,创建两个子目录:train
和validation
。将主目录导出为 IMAGENET_HOME:export IMAGENET_HOME=~/imagenet
注册并申请下载数据集的权限
- 在 Imagenet 网站上注册。在 ImageNet 确认您已注册并向您发送确认电子邮件之后,您才能下载数据集。如果您在几天内未收到确认电子邮件,请与 ImageNet 支持团队联系,以了解您的注册为何未被确认。确认您的注册后,您就可以下载数据集了。使用 ImageNet 数据集的 Cloud TPU 教程使用 ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012) 中的图片。
下载 ImageNet 数据集
在 LSRVC 2012 下载网站中,转到页面上的“图片”部分,然后右键点击“训练图片(任务 1 和 2)”。用于下载训练集最大部分的网址。保存网址。
右键点击“训练图片(任务 3)”以获取第二个训练集的网址。保存网址。
右键点击“验证图片(所有任务)”以获取验证数据集的网址。保存网址。
如果将 ImageNet 文件下载到本地机器,则需要将本地机器上的目录复制到 Compute Engine 虚拟机上的相应
$IMAGENET_HOME
目录。将 ImageNet 数据集从本地主机复制到虚拟机大约需要 13 个小时。以下命令将本地机器上 $IMAGENET_HOME 下的文件复制到虚拟机 ~/imagenet (username@vm-name):
gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
在 $IMAGENET_HOME 中,使用
wget
从保存的网址下载训练和验证文件。“训练图片(任务 1 和 2)”文件是大型训练集。大小为 138 GB,如果您使用 Cloud Shell 下载到 Compute Engine 虚拟机,则下载大约需要 40 小时。如果 Cloud Shell 与虚拟机的连接中断,您可以在命令前面添加
nohup
或使用筛选。cd $IMAGENET_HOME \ nohup wget http://image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train.tar
此命令会下载大型 tar 文件:ILSVRC2012_img_train.tar。
从虚拟机上的 $IMAGENET_HOME 中,使用以下命令将各个训练目录提取到
$IMAGENET_HOME/train
目录中。提取过程需要 1 到 3 小时。tar xf ILSVRC2012_img_train.tar
提取位于 $IMAGENET_HOME/train 目录中的各个训练 tar 文件,如以下脚本所示:
cd $IMAGENET_HOME/train for f in *.tar; do d=`basename $f .tar` mkdir $d tar xf $f -C $d done
解压解压文件后,请删除 tar 文件以释放磁盘空间。
“训练图片(任务 3)”文件为 728 MB,下载只需几分钟时间,因此您无需采取预防措施以避免中断 Cloud Shell 连接。
下载此文件时,它会将各个训练目录提取到现有
$IMAGENET_HOME/train
目录中。wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train_t3.tar
下载“验证映像(所有任务)”文件时,您的 Cloud Shell 可能会断开连接。您可以使用
nohup
或 screen 来防止 Cloud Shell 断开连接。wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_val.tar
此下载过程大约需要 30 分钟。当您下载此文件时,会将各个验证目录提取到
$IMAGENET_HOME/validation
目录中。如果已将验证文件下载到本地机器,则需要将本地机器上的
$IMAGENET_HOME/validation
目录复制到 Compute Engine 虚拟机上的$IMAGENET_HOME/validation
目录。此复制操作大约需要 30 分钟。下载标签文件。
wget -O $IMAGENET_HOME/synset_labels.txt \ https://raw.githubusercontent.com/tensorflow/models/master/research/inception/inception/data/imagenet_2012_validation_synset_labels.txt
如果已将标签文件下载到本地机器,则需要将其复制到本地机器上的
$IMAGENET_HOME
目录,然后复制到 Compute Engine 虚拟机上的$IMAGENET_HOME
目录。此复制操作需要几秒钟的时间。训练子目录名称(例如,n03062245)是“WordNet ID”(wnid)。ImageNet API 在
synset_labels.txt
文件中显示了 WordNet ID 与其相关联的验证标签之间的映射。此上下文中的同义词集是视觉上类似的一组图片。
处理 Imagenet 数据集,并视情况将其上传到 Cloud Storage
从 GitHub 下载
imagenet_to_gcs.py
脚本:wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
如果要将数据集上传到 Cloud Storage,请指定存储桶位置来上传 ImageNet 数据集:
export STORAGE_BUCKET=gs://bucket-name
如果要将数据集上传到本地机器或虚拟机,请指定一个数据目录来保存数据集:
(vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
运行脚本,将原始数据集作为 TFRecord 进行预处理,并使用下列命令将其上传到 Cloud Storage:
python3 imagenet_to_gcs.py \ --project=$PROJECT \ --gcs_output_path=$STORAGE_BUCKET \ --raw_data_dir=$IMAGENET_HOME \ --local_scratch_dir=$IMAGENET_HOME/tf_records
该脚本会生成一组以下形式的目录(用于存储训练和验证数据):
${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024
和
${DATA_DIR}/validation-00000-of-00128
S{DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128
将数据上传到您的 Cloud 存储桶后,请运行模型并设置 --data_dir=${DATA_DIR}
。