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

本文档介绍了如何下载、预处理和上传 ImageNet 数据集,以便与 Cloud TPU 虚拟机架构搭配使用。

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

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

预处理完整的 ImageNet 数据集

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

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

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

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

准备供机器使用的完整 ImageNet 数据集有五个步骤 机器学习模型:

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

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

验证空间要求

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

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 目录中,如以下脚本所示:

    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 目录中,如以下脚本所示:

    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 API 显示了 WordNet ID 与其关联的验证标签的映射, synset_labels.txt 文件。此上下文中的同义词集是视觉上类似的一组图片。

处理 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}