下载、预处理和上传 ImageNet 数据集

本主题介绍如何下载、预处理和上传用于 Cloud TPU 的 ImageNet 数据集。使用 ImageNet 数据集的机器学习模型包括:

  • ResNet
  • AmoebaNet
  • EfficientNet
  • MNASNet
ImageNet 是一个图像数据库。数据库中的图像被整理为一个层次结构,该层次结构中的每个节点由成百上千个图像进行描述。

ImageNet 数据库的大小意味着训练模型需要相当长的时间。另一种方法是使用演示版的数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试模型,同时降低通常与使用完整 ImageNet 数据集相关的存储空间和时间要求。

预处理完整的 ImageNet 数据集

ImageNet 数据集包括三个部分:训练数据、验证数据和图片标签。

训练数据包含 1000 个类别和 120 万张图片,已打包好以便可以轻松下载。验证数据和测试数据不包含在 ImageNet 训练数据中(重复项已移除)。

验证数据和测试数据由 15 万张照片组成,这些照片是通过 Flickr 和其他搜索引擎收集而来,并标记是否存在 1000 个对象类别。1000 个对象类别同时包含 ImageNet 的内部节点和叶节点,但彼此不重叠。发布了带有标签的 50000 个寻机图片子集作为验证数据,以及包含 1000 个类别的列表。 其余图片用于评估,并已发布且不带标签。

预处理完整的 ImageNet 数据集的步骤

准备完整的 ImageNet 数据集以供机器学习模型使用,这个过程分为五个步骤:

  1. 验证下载目标上是否有空间。
  2. 设置目标目录。
  3. 在 ImageNet 网站上注册并申请下载权限。
  4. 将数据集下载到本地磁盘或 Compute Engine 虚拟机。

  5. 运行预处理并上传脚本。

验证空间要求

无论您是将数据集下载到本地机器还是下载到 Compute Engine 虚拟机,下载目标都需要大约 300GB 的空间。在虚拟机上,您可以使用 df -ha 命令检查可用存储空间。

您可以使用以下任一方法来增加虚拟机磁盘的大小:

  • 使用要分配的大小(以 GB 为单位)在 ctpu up 命令行上指定 --disk-size-gb 标志。
  • 按照 Compute Engine 指南向您的虚拟机添加磁盘
    • 删除实例时设置为删除磁盘,以确保在您移除虚拟机后,相应磁盘也会一并移除。
    • 记下新磁盘的路径,例如:/mnt/disks/mnt-dir

设置目标目录

在本地机器或 Compute Engine 虚拟机上,设置目录结构来存储下载的数据。

  • 创建并导出 ImageNet 数据集的主目录。

    在本地机器或虚拟机上的主目录下创建一个目录,例如 imagenet。在此目录下,创建两个子目录:trainvalidation。将主目录导出为 IMAGENET_HOME:

    export IMAGENET_HOME=~/imagenet
    

注册并申请下载数据集的权限

  • Imagenet 网站上注册。在 ImageNet 确认您已注册并向您发送确认电子邮件之后,您才能下载数据集。如果您在几天内未收到确认电子邮件,请与 ImageNet 支持团队联系,以了解您的注册为何未被确认。您的注册被确认后,请转到下载网站

下载 ImageNet 数据集

  1. 下载网站中,转到页面上的“图片”部分,然后右键点击“训练图片(任务 1 和 2)”。这样,您就能够获取下载训练集的最大部分所需的网址。保存网址。

    右键点击“训练图片(任务 3)”以获取第二个训练集的网址。保存网址。

    右键点击“验证图片(所有任务)”,获取验证数据集的网址。保存网址。

    如果将 ImageNet 文件下载到本地机器,则下载完成后,需要将本地机器上的目录复制到 Compute Engine 虚拟机上的相应 $IMAGENET_HOME 目录。 将 ImageNet 数据集从本地主机复制到虚拟机大约需要 13 个小时。

    例如,运行以下命令以将本地机器上 $IMAGENET_HOME 下的所有文件复制到显示 Shell 提示符 username@vm-name 的虚拟机:

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
    
  2. 在 $IMAGENET_HOME 中,使用 wget 从保存的网址下载训练和验证文件。

    “训练图片(任务 1 和 2)”文件是大型训练集。大小为 138GB,如果您使用 Cloud Shell 将其下载到 Compute Engine 虚拟机,则预计下载时间大约为 40 个小时。对于这种特别大的文件,您可以在命令前面添加 nohup,或使用筛选以避免在 Cloud Shell 断开连接时终止下载。

    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
    

    “训练图片(任务 3)”文件为 728 MB,下载只需几分钟时间,因此您无需采取预防措施以避免中断 Cloud Shell 连接。

    下载此文件时,它会将各个训练目录提取到现有 $IMAGENET_HOME/train 目录中。

    wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train_t3.tar
    

    “验证图片(所有任务)”文件为 6GB,因此您可能希望使用 nohup筛选来避免在断开 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 APIsynset_labels.txt 文件中显示了 WordNet ID 与其相关联的验证标签之间的映射。此上下文中的同义词集是视觉上类似的一组图片。

处理 Imagenet 数据集,并视情况将其上传到 Cloud Storage

  1. 从 GitHub 下载 imagenet_to_gcs.py 脚本:

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  2. 如果要将数据集上传到 Cloud Storage,请指定存储分区位置来上传 ImageNet 数据集:

    export STORAGE_BUCKET=gs://bucket-name
    
  3. 如果要将数据集上传到 Cloud Storage,请指定存储分区目录以保存数据集:

    (vm)$ export DATA_DIR=$STORAGE_BUCKET/dataset-directory
    
  4. 运行脚本,将原始数据集作为 TFRecord 进行预处理,并使用下列命令将其上传到 Cloud Storage:

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$DATA_DIR  \
      --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}