下載、預先處理及上傳 ImageNet 資料集

本文說明如何下載、預先處理及上傳 ImageNet 資料集,以與 Cloud TPU VM 架構搭配使用。

ImageNet 是圖片資料庫。這個資料庫中的圖片是以階層來分類的,階層結構中每個節點都代表千百張圖片。

ImageNet 資料庫的大小表示訓練模型可能需要花費相當長的時間。替代方法是使用資料集的示範版本,稱為「fake_imagenet」。這個示範版本可讓您測試模型,且與使用完整 ImageNet 資料庫相較,一般來說所需的儲存空間與時間較低。

預先處理完整的 ImageNet 資料集

ImageNet 資料集包含三個部分:訓練資料、驗證資料和圖片標籤。

訓練資料包含 1000 個類別和 120 萬張圖片,並已封裝供下載。驗證和測試資料不包含在 ImageNet 訓練資料中 (已移除重複項目)。

驗證和測試資料包含 15 萬張相片,這些相片是從 Flickr 和其他搜尋引擎收集而來,並手動標示 1000 個物件類別是否存在。這 1000 個物件類別包含 ImageNet 的內部節點和葉節點,但彼此不會重疊。我們已發布 50,000 張隨機選取的圖片 (附有標籤) 做為驗證資料,以及 1,000 個類別的清單。其餘圖片則用於評估,並已發布,但未加上標籤。

預先處理完整 ImageNet 資料集的步驟

準備完整的 ImageNet 資料集以供機器學習模型使用,需要五個步驟:

  1. 確認下載目標位置有足夠空間
  2. 設定目標目錄
  3. 在 ImageNet 網站上註冊,並要求下載權限
  4. 將資料集下載至本機磁碟或 VM 執行個體

  5. 執行預先處理和上傳指令碼

確認儲存空間符合條件

無論是將資料集下載至本機電腦或 VM 執行個體,下載目標都需要約 300 GiB 的可用空間。

TPU VM 的預設磁碟配置為 10 GB。由於下載至 TPU VM 需要 300 GiB,因此如要下載至 TPU VM 執行個體,您必須新增具有額外空間的永久區塊儲存空間磁碟區,才能完成下載,或是增加 TPU 的開機磁碟大小。在 TPU VM 上,您可以使用 df -ha 指令查看可用儲存空間。如要進一步瞭解如何調整磁碟大小,請參閱「修改 Hyperdisk 磁碟區的大小和佈建效能」和「修改 Persistent Disk 磁碟區的大小」。

新增持久性區塊儲存空間時,請務必記下磁碟的掛接目錄。例如:/mnt/disks/mnt-dir

設定目標目錄

在本機電腦或 VM 執行個體上,設定目錄結構來儲存下載的資料。

  1. 切換至要下載資料的目錄。如果您使用永久磁碟,請將 DATASET_ROOT_DIR 替換為磁碟的掛接目錄,例如 /mnt/disks/mnt-dir

    cd DATASET_ROOT_DIR
  2. 在下載目標 (本機或 TPU VM) 上建立目錄,例如 imagenet

    mkdir imagenet
    
  3. 在這個目錄下,建立兩個子目錄:trainvalidation

    mkdir imagenet/train
    mkdir imagenet/validation
    
  4. imagenet 目錄匯出為 IMAGENET_HOME

    export IMAGENET_HOME=DATASET_ROOT_DIR/imagenet
    sudo chown ${USER} ${IMAGENET_HOME}

註冊並要求下載資料集的權限

Imagenet 網站上註冊。ImageNet 確認您的註冊並傳送確認電子郵件後,您才能下載資料集。如果幾天後仍未收到確認電子郵件,請與 ImageNet 支援團隊聯絡,瞭解註冊未獲確認的原因。註冊確認後,您即可下載資料集。使用 ImageNet 資料集的 Cloud TPU 教學課程會使用 ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012) 的圖片。

下載 ImageNet 資料集

  1. 前往 LSRVC 2012 下載網站,然後在頁面的「Images」部分中,按一下滑鼠右鍵「Training images (Task 1 & 2)」,可下載訓練集最大部分的網址。儲存網址。

    在「訓練圖片 (工作 3)」上按一下滑鼠右鍵,取得第二個訓練集的網址。儲存網址。

    在「Validation images (all tasks)」上按一下滑鼠右鍵,即可取得驗證資料集的網址。儲存網址。

    如果將 ImageNet 檔案下載到本機電腦,您需要將本機電腦上的目錄複製到 VM 執行個體上對應的 $IMAGENET_HOME 目錄。將 ImageNet 資料集從本機主機複製到 VM 執行個體,大約需要 13 小時。

    將 ImageNet 資料集複製到 TPU VM 前,請先找出 TPU VM 執行個體的名稱。如要這麼做,請使用 SSH 連線至 TPU VM。 VM 執行個體名稱會顯示在命令提示字元中,位於 @ 符號後方。

    使用下列指令,將本機電腦上 ~/imagenet 下的檔案複製到 VM 上的 $IMAGENET_HOME

    gcloud compute scp --recurse $IMAGENET_HOME USERNAME@VM_INSTANCE_NAME:~/imagenet
  2. $IMAGENET_HOME 下載「訓練圖片 (工作 1 和 2)」檔案, 請使用儲存的網址。

    「訓練圖片 (工作 1 和 2)」檔案是大型訓練集。這個資料集的大小為 138 GiB,如果使用 Cloud Shell 下載到 TPU VM,大約需要 40 小時。如果 Cloud Shell 與 VM 失去連線,您可以在指令前加上 nohup,或使用 screen

    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 目錄複製到 VM 執行個體上的 $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 目錄,然後複製到 VM 執行個體的 $IMAGENET_HOME 目錄。這項複製作業只需要幾秒鐘。

    訓練子目錄名稱 (例如「n03062245」) 是「WordNet ID」(wnid)。ImageNet API 會在 synset_labels.txt 檔案中顯示 WordNet ID 與相關驗證標籤之間的對應。在這種情況下,「synset」(同義詞組) 是指視覺上相似的圖片。

處理 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,請按照下列步驟操作:

    1. 使用現有值區,或按照「建立值區」一文中的操作說明建立新值區。

    2. 指定儲存空間 bucket 位置,以上傳 ImageNet 資料集:

      export STORAGE_BUCKET=gs://BUCKET_NAME
  3. 如要將資料集上傳至本機電腦或 VM,請指定資料目錄來存放資料集:

    (vm)$ export DATA_DIR=$IMAGENET_HOME/DATASET_DIRECTORY
  4. 在電腦或虛擬環境中安裝下列程式庫:

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. 執行指令碼,將原始資料集預先處理為 TFRecords,並使用下列指令上傳至 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}