Télécharger, prétraiter et importer l'ensemble de données ImageNet

Ce document explique comment télécharger, prétraiter et importer l'ensemble de données ImageNet pour l'utiliser avec l'architecture de VM Cloud TPU.

ImageNet est une base de données dont les images sont organisées hiérarchiquement, chaque nœud de cette hiérarchie étant représenté par des centaines de milliers d'images.

Le temps nécessaire pour entraîner un modèle peut être très long en raison de la taille de la base de données ImageNet. Vous pouvez également utiliser une version de démonstration de l'ensemble de données, appelée fake_imagenet. Cette version de démonstration vous permet de tester le modèle sans les contraintes de stockage et de temps associées à l'utilisation de la base de données ImageNet complète.

Prétraiter l'intégralité de l'ensemble de données ImageNet

L'ensemble de données ImageNet se compose de trois parties : des données d'entraînement, des données de validation et des étiquettes d'image.

Les données d'entraînement contiennent 1 000 catégories et 1,2 million d'images qui sont empaquetées pour faciliter leur téléchargement. Les données de validation et de test ne figurent pas dans les données d'entraînement ImageNet (les doublons ont été supprimés).

Les données de validation et de test comprennent 150 000 photographies recueillies par Flickr et d'autres moteurs de recherche et étiquetées manuellement pour y indiquer la présence ou l'absence d'objets appartenant à 1 000 catégories. Les 1 000 catégories d'objets contiennent à la fois des nœuds internes et des nœuds feuilles d'ImageNet, mais elles ne se chevauchent pas. Un sous-ensemble aléatoire de 50 000 images étiquetées a été publié en tant que données de validation, accompagné d'une liste des 1 000 catégories. Les images restantes servent à l'évaluation et ont été publiées sans étiquettes.

Procédure de prétraitement de l'ensemble de données ImageNet complet

Pour préparer l'ensemble de données ImageNet complet qui sera utilisé par un modèle de machine learning, suivez les cinq étapes suivantes :

  1. Vérifiez que vous disposez d'un espace suffisant sur la cible de téléchargement.
  2. Configurez les répertoires cibles.
  3. Inscrivez-vous sur le site ImageNet et demandez l'autorisation de télécharger.
  4. Téléchargez l'ensemble de données sur le disque local ou l'instance de VM.

  5. Exécutez le script de prétraitement et d'importation.

Vérifier l'espace nécessaire

Que vous téléchargiez l'ensemble de données sur votre ordinateur local ou sur une instance de VM, vous devez disposer d'environ 300 Gio d'espace libre sur la cible de téléchargement.

L'allocation de disque par défaut pour une VM TPU est de 100 Gio. Puisque le téléchargement sur votre VM TPU nécessite 300 Gio, si vous souhaitez télécharger le fichier sur votre instance de VM TPU, vous devrez ajouter un volume de stockage de blocs durable offrant 200 Gio d'espace supplémentaire pour effectuer le téléchargement. Sur une VM TPU, vous pouvez vérifier l'espace de stockage disponible à l'aide de la commande df -ha. Pour en savoir plus sur le redimensionnement des disques associés, consultez Modifier les paramètres d'un volume Google Cloud Hyperdisk et Augmenter la taille d'un volume Persistent Disk.

Lorsque vous ajoutez un stockage de blocs durable, pensez à prendre note du répertoire dans lequel vous avez installé le disque. Exemple : /mnt/disks/mnt-dir.

Configurer les répertoires cibles

Sur votre ordinateur local ou votre instance de VM, configurez la structure de répertoires pour stocker les données téléchargées.

  1. Accédez au répertoire dans lequel vous souhaitez télécharger les données. Si vous utilisez un disque persistant, remplacez DATASET_ROOT_DIR par le répertoire dans lequel votre disque est installé, par exemple /mnt/disks/mnt-dir :

    cd DATASET_ROOT_DIR
  2. Créez un répertoire, par exemple imagenet, sur votre cible de téléchargement (machine locale ou VM TPU).

    mkdir imagenet
    
  3. Dans ce répertoire, créez deux sous-répertoires : train et validation.

    mkdir imagenet/train
    mkdir imagenet/validation
    
  4. Exportez le répertoire imagenet au format IMAGENET_HOME.

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

S'inscrire et demander l'autorisation de télécharger l'ensemble de données

Inscrivez-vous sur le site Web d'ImageNet. Vous ne pouvez pas télécharger l'ensemble de données tant que ImageNet n'a pas confirmé votre inscription et ne vous a pas envoyé d'e-mail de confirmation. Si vous n'avez pas reçu d'e-mail de confirmation dans les jours qui suivent, contactez l'assistance ImageNet pour savoir pourquoi votre inscription n'a pas été confirmée. Une fois votre inscription confirmée, vous pouvez télécharger l'ensemble de données. Les tutoriels Cloud TPU qui utilisent l'ensemble de données ImageNet exploitent les images de l'édition 2012 de l'ImageNet Large Scale Visual Recognition Challenge (ILSVRC2012).

Télécharger l'ensemble de données ImageNet

  1. Sur le site de téléchargement du LSRVC 2012, accédez à la section "Images" de la page et effectuez un clic droit sur "Training Images (Task 1 & 2)" (Images d'entraînement (tâches 1 et 2))" pour obtenir l'URL permettant de télécharger la plus grande partie de l'ensemble d'entraînement. Enregistrez l'URL.

    Effectuez un clic droit sur "Training images (Task 3)" (Images d'entraînement (tâche 3)) pour obtenir l'URL du deuxième ensemble d'entraînement. Enregistrez l'URL.

    Effectuez un clic droit sur "Validation images (all tasks)" (Images de validation (toutes les tâches)) pour obtenir l'URL de l'ensemble de données de validation. Enregistrez l'URL.

    Si vous téléchargez les fichiers ImageNet sur votre ordinateur local, vous devez copier les répertoires de votre ordinateur local dans le répertoire $IMAGENET_HOME correspondant sur votre instance de VM. La copie de l'ensemble de données ImageNet de l'hôte local sur votre VM prend environ 13 heures.

    Avant de copier l'ensemble de données ImageNet sur votre VM TPU, vous devez identifier le nom de votre instance de VM TPU. Pour ce faire, connectez-vous à votre VM TPU via SSH. Le nom de l'instance de VM s'affiche dans l'invite de commande après le symbole @.

    Utilisez la commande suivante pour copier les fichiers actuellement sous ~/imagenet sur votre ordinateur local vers $IMAGENET_HOME sur votre VM.

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
  2. Dans $IMAGENET_HOME, téléchargez les fichiers "Training Images (tâches 1 et 2)" (Images d'entraînement (tâches 1 et 2)) à l'aide de l'URL enregistrée.

    Le fichier "Training images (Task 1 & 2)" (Images d'entraînement (tâches 1 et 2)) est l'ensemble d'entraînement volumineux. Sa taille est de 138 Gio. Si vous le téléchargez sur votre VM TPU à l'aide de Cloud Shell, le téléchargement prend environ 40 heures. Si Cloud Shell perd sa connexion à la VM, vous pouvez ajouter nohup à la commande ou utiliser screen.

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

    Remplacez l'URL par celle que vous avez enregistrée précédemment pour "Training images (Task 1 & 2)" (Images d'entraînement (tâches 1 et 2)), car elle peut avoir changé.

  3. Extrayez les répertoires d'entraînement individuels dans le répertoire $IMAGENET_HOME/train à l'aide de la commande suivante. L'extraction prend entre 1 et 3 heures.

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

    Extrayez les fichiers tar d'entraînement individuels situés dans le répertoire $IMAGENET_HOME/train, comme indiqué dans le script suivant :

    cd $IMAGENET_HOME/train

    for f in *.tar; do d=basename $f .tar mkdir $d tar xf $f -C $d done

    Pour libérer de l'espace disque, supprimez les fichiers tar une fois extraits.

  4. Dans $IMAGENET_HOME, téléchargez les fichiers "Training images (Task 3)" (Images d'entraînement (tâche 3)) à l'aide de l'URL enregistrée.

    La taille du fichier "Training images (Task 3)" (Images d'entraînement (tâche 3)) est de 728 Mo et son téléchargement ne prend que quelques minutes. Vous n'avez donc pas besoin de prendre de précautions contre une perte de connexion de Cloud Shell.

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

    Remplacez l'URL par celle que vous avez enregistrée précédemment pour "Training images (Task 3)" (Images d'entraînement (tâche 3)), car elle peut avoir changé.

  5. Extrayez les répertoires d'entraînement individuels dans le répertoire $IMAGENET_HOME/train à l'aide de la commande suivante.

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

    Extrayez les fichiers tar d'entraînement individuels situés dans le répertoire $IMAGENET_HOME/train, comme indiqué dans le script suivant :

    cd ${IMAGENET_HOME}/train
    
    for f in *.tar; do
        d=`basename $f .tar`
        mkdir $d
        tar xf $f -C $d
    done

    Pour libérer de l'espace disque, supprimez les fichiers tar une fois extraits.

  6. Dans $IMAGENET_HOME, téléchargez les fichiers "Validation images (all tasks)" (Images de validation (toutes les tâches)) à l'aide de l'URL enregistrée.

    Lors du téléchargement du fichier "Validation Images (all tasks)" (Images de validation (toutes les tâches)), il est possible que votre Cloud Shell se déconnecte. Pour éviter un tel cas de figure, utilisez nohup ou screen.

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

    Remplacez l'URL par celle que vous avez enregistrée précédemment pour "Validation images (all tasks)" (Images de validation (toutes les tâches)), car elle peut avoir changé.

    Ce téléchargement prend environ 30 minutes.

  7. Extrayez les fichiers de validation individuels dans le répertoire $IMAGENET_HOME/validation à l'aide de la commande suivante :

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

    Si vous avez téléchargé les fichiers de validation sur votre ordinateur local, vous devez copier le répertoire $IMAGENET_HOME/validation de votre ordinateur dans le répertoire $IMAGENET_HOME/validation de votre instance de VM. Cette opération prend environ 30 minutes.

  8. Téléchargez le fichier des étiquettes.

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

    Si vous avez téléchargé le fichier des étiquettes sur votre ordinateur local, vous devez le copier du répertoire $IMAGENET_HOME de votre ordinateur local vers le répertoire $IMAGENET_HOME de votre instance de VM. Cette opération prend quelques secondes.

    Les noms de sous-répertoires d'entraînement (par exemple, n03062245) sont des "identifiants WordNet" (wnid). L'API ImageNet affiche le mappage des identifiants WordNet sur les étiquettes de validation associées dans le fichier synset_labels.txt. Dans ce contexte, un "synset" est un groupe d'images visuellement similaires.

Traiter l'ensemble de données ImageNet et l'importer éventuellement dans Cloud Storage

  1. Téléchargez le script imagenet_to_gcs.py à partir de GitHub comme suit :

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
  2. Si vous importez l'ensemble de données dans Cloud Storage :

    1. Utilisez un bucket existant ou créez-en un en suivant les instructions figurant dans Créer des buckets.

    2. Spécifiez l'emplacement du bucket de stockage où importer l'ensemble de données ImageNet :

      export STORAGE_BUCKET=gs://bucket-name
  3. Si vous importez l'ensemble de données sur votre ordinateur local ou votre VM, spécifiez un répertoire de données où stocker l'ensemble de données :

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
  4. Installez les bibliothèques suivantes sur votre ordinateur ou dans un environnement virtuel :

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. Exécutez le script pour prétraiter l'ensemble de données brut en tant que TFRecords, puis importez-le dans Cloud Storage à l'aide de la commande suivante :

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records

Le script génère un ensemble de répertoires (à la fois pour l'entraînement et la validation) aux formats suivants :

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024

et

${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

Une fois les données importées dans votre bucket Cloud, exécutez votre modèle et définissez --data_dir=${DATA_DIR}.