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

本文档介绍如何下载、预处理和上传用于 Cloud TPU 虚拟机架构的 ImageNet 数据集。

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

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

预处理完整的 ImageNet 数据集

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

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

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

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

准备机器学习模型使用的完整 ImageNet 数据集需要执行五个步骤:

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

  5. 运行预处理和上传脚本

验证空间要求

无论您是将数据集下载到本地机器还是虚拟机实例,都需要约 300 GB 的可用空间供下载目标使用。

TPU 虚拟机的默认磁盘分配为 100 GB。由于下载到 TPU 虚拟机需要 300 GB,因此,如果要下载到 TPU 虚拟机实例,则需要添加永久性磁盘和 200 GB 的额外空间才能完成下载。在 TPU 虚拟机上,您可以使用 df -ha 命令检查可用存储空间。

添加永久性磁盘时,请务必:

  • 删除实例时设置为删除磁盘,以确保在您删除虚拟机后,相应磁盘也会一并删除。
  • 记下新磁盘的路径,例如:/mnt/disks/mnt-dir

设置目标目录

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

  1. 在下载目标(本地机器或 TPU 虚拟机)的主目录下创建一个目录,例如 imagenet

    mkdir imagenet
    
  2. 在此目录下,创建两个子目录:trainvalidation

    mkdir imagenet/train
    mkdir imagenet/validation
    
  3. imagenet 目录导出为 IMAGENET_HOME

    export IMAGENET_HOME=~/imagenet
    

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

Imagenet 网站上注册。在 ImageNet 确认您的注册并向您发送确认电子邮件之前,您无法下载数据集。如果您一两天内都没有收到确认电子邮件,请与 ImageNet 支持团队联系,了解您的注册未经确认的原因。确认注册后,您就可以下载数据集。使用 ImageNet 数据集的 Cloud TPU 教程使用了 ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012) 中的图片。

下载 ImageNet 数据集

  1. LSRVC 2012 下载网站中,转到页面上的“图片”部分,然后右键点击“训练图片(任务 1 和 2)”。用于下载训练集最大部分的网址。保存网址。

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

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

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

    在将 ImageNet 数据集复制到 TPU 虚拟机之前,您需要标识 TPU 虚拟机实例的名称。为此,请使用 SSH 连接到您的 TPU 虚拟机。命令提示符中的 @ 符号后面会显示虚拟机实例名称。

    使用以下命令将本地机器上 ~/imagenet 下的文件复制到虚拟机上的 $IMAGENET_HOME

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
    
  2. $IMAGENET_HOME 中,使用保存的网址下载“训练图片(任务 1 和 2)”文件。

    “训练图片(任务 1 和 2)”文件是大型训练集。此容量为 138 GB,如果您使用 Cloud Shell 下载到 TPU 虚拟机,则下载大约需要 40 小时。如果 Cloud Shell 与虚拟机的连接中断,您可以在命令前面添加 nohup 或使用筛选

    cd $IMAGENET_HOME \
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar
    

    将该网址替换为您之前为“训练图片(任务 1 和 2)”保存的网址,因为该网址可能已发生变化。

  3. 使用以下命令将各个训练目录提取到 $IMAGENET_HOME/train 目录中。提取过程需要 1-3 个小时。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train
    

    提取 $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 文件后,删除这些文件以释放磁盘空间。

  4. $IMAGENET_HOME 中,使用保存的网址下载“训练图片(任务 3)”文件。

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

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar
    

    将该网址替换为您之前为“训练图片(任务 3)”保存的网址,因为该网址可能已发生变化。

  5. 使用以下命令将各个训练目录提取到 $IMAGENET_HOME/train 目录中。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train
    

    提取 $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 文件后,删除这些文件以释放磁盘空间。

  6. $IMAGENET_HOME 中,使用保存的网址下载“验证图片(所有任务)”文件。

    下载“验证图片(所有任务)”文件时,您的 Cloud Shell 可能会断开连接。您可以使用 nohupscreen 防止 Cloud Shell 断开连接。

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar
    

    将网址替换为您之前为“验证图片(所有任务)”保存的网址,因为该网址可能已发生变化。

    下载过程大约需要 30 分钟。

  7. 使用以下命令将各个验证文件提取到 $IMAGENET_HOME/validation 目录中。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation
    

    如果您已将验证文件下载到本地机器,则需要将本地机器上的 $IMAGENET_HOME/validation 目录复制到虚拟机实例上的 $IMAGENET_HOME/validation 目录。此复制操作大约需要 30 分钟。

  8. 下载标签文件。

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt
    

    如果您已将标签文件下载到本地机器,则需要将其复制到本地机器上的 $IMAGENET_HOME 目录到虚拟机实例上的 $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. 如果要将数据集上传到本地机器或虚拟机,请指定一个数据目录来保存数据集:

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
    
  4. 在您的机器或虚拟环境中安装以下库:

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. 运行脚本,将原始数据集作为 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
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

将数据上传到您的 Cloud 存储桶后,请运行模型并设置 --data_dir=${DATA_DIR}