Convertir un ensemble de données de classification d'images à utiliser avec Cloud TPU

Ce tutoriel explique comment utiliser le script d'exemple de convertisseur de données de classification d'images pour convertir un ensemble de données brut pour la classification d'images au format TFRecord utilisé par les modèles Tensorflow de Cloud TPU. Le [dépôt de classification d'images](https://github.com/tensorflow/tpu/tree/master/tools/data_converter) sur GitHub contient le script converter, image_classification_data.py et un exemple de mise en œuvre, simple_example.py, que vous pouvez copier et modifier pour effectuer votre propre conversion de données.

L'exemple de conversion de données de classification d'images définit deux classes, ImageClassificationConfig et ImageClassificationBuilder. Ces classes sont définies dans tpu/tools/data_converter/image_classification_data.py.

ImageClassificationConfig est une classe de base abstraite. Vous sous-classez ImageClassificationConfig pour définir la configuration nécessaire pour instancier un ImageClassificationBuilder.

ImageClassificationBuilder est un compilateur d'ensembles de données Tensorflow pour les ensembles de données de classification d'images. Il s'agit d'une sous-classe de tdfs.core.GeneratorBasedBuilder. Il extrait des exemples de données de votre ensemble de données et les convertit en fichiers TFRecord. Les fichiers TFRecord sont écrits dans un chemin spécifié par le paramètre data_dir vers la méthode __init__ de ImageClassificationBuilder.

Dans simple_example.py, SimpleDatasetConfig sous-classe ImageClassificationConfig tout en mettant en œuvre des propriétés pour définir les modes compatibles, le nombre de classes d'images et un générateur d'exemples dont le rôle est de fournir un dictionnaire contenant des données d'images et une classe d'images pour chaque exemple de l'ensemble de données.

La fonction main() crée un ensemble de données composé de données d'image générées de manière aléatoire et instancie un objet SimpleDatasetConfig spécifiant le nombre de classes et le chemin d'accès à l'ensemble de données sur le disque. main() instancie ensuite un objet ImageClassificationBuilder en transmettant l'instance SimpleDatasetConfig. Enfin, main() appelle download_and_prepare(). Lorsque cette méthode est appelée, l'instance ImageClassificationBuilder utilise l'exemple de générateur de données mis en œuvre par SimpleDatasetConfig pour charger chaque exemple et les enregistre dans une série de fichiers TFRecord.

Pour obtenir des explications plus détaillées, consultez la documentation sur le convertisseur de classification.

Modifier l'exemple de conversion de données pour charger votre ensemble de données

Pour convertir votre ensemble de données au format TFRecord, sous-classez la classe ImageClassificationConfig en définissant les propriétés suivantes :

  • num_labels : affiche le nombre de classes d'image.
  • supports_modes : affiche une liste des modes acceptés par votre ensemble de données (par exemple, test, entraînement et validation).
  • text_label_map : affiche un dictionnaire modélisant le mappage entre un libellé de classe de texte et un libellé de classe d'entier. SimpleDatasetConfig n'utilise pas cette propriété, car elle ne nécessite pas de mappage.
  • download_path : chemin d'accès à partir duquel télécharger votre ensemble de données (SimpleDatasetConfig n'utilise pas cette propriété, example_generator charge les données du disque)

Mettez en œuvre la fonction de générateur example_generator. Cette méthode doit générer un dictionnaire contenant les données d'image et le nom de classe de chaque exemple. ImageClassificationBuilder utilise la fonction example_generator() pour récupérer chaque exemple et les écrire sur le disque au format TFRecord.

Exécuter l'exemple de conversion des données

  1. Créez un bucket Cloud Storage à l'aide de la commande suivante :

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 -b on gs://bucket-name
    
  2. Créez la VM à l'aide de la commande ctpu :

    ctpu up --vm-only \
      --zone=us-central1-b \
      --name=img-class-converter \
      --tf-version=2.2
    
    gcloud compute ssh img-class-converter --zone=us-central1-b 

    À partir de là, le préfixe (vm)$ signifie que vous devez exécuter la commande sur l'instance de VM Compute Engine.

  3. Installez les packages requis.

    (vm)$ pip3 install opencv-python-headless pillow
    
  4. Créez les variables d'environnement suivantes utilisées par le script.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export CONVERTED_DIR=$HOME/tfrecords
    (vm)$ export GENERATED_DATA=$HOME/data
    (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords
    (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  5. Accédez au répertoire data_converter.

    (vm)$ cd /usr/share/tpu/tools/data_converter
    

Exécuter le convertisseur de données sur un ensemble de données fictif

Le script simple_example.py se trouve dans le dossier image_classification de l'exemple de convertisseur de données. L'exécution du script avec les paramètres suivants génère un ensemble d'images fictives et les convertit en enregistrements TFRecord.

(vm)$ python3 image_classification/simple_example.py \
  --num_classes=1000 \
  --data_path=$GENERATED_DATA \
  --generate=True \
  --num_examples_per_class_low=10 \
  --num_examples_per_class_high=11 \
  --save_dir=$CONVERTED_DIR

Exécuter le convertisseur de données sur l'un de nos ensembles de données bruts

  1. Créez une variable d'environnement pour l'emplacement des données brutes.

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
    
  2. Exécutez le script simple_example.py.

    (vm)$ python3 image_classification/simple_example.py \
    --num_classes=1000 \
    --data_path=$GCS_RAW \
    --generate=False \
    --save_dir=$CONVERTED_DIR
    

Le script simple_example.py utilise les paramètres suivants :

  • num_classes fait référence au nombre de classes de l'ensemble de données. Nous utilisons ici 1 000 pour correspondre au format ImageNet
  • generate détermine si les données brutes doivent être générées ou non.
  • data_path fait référence au chemin où les données doivent être générées si generate=True, ou au chemin où les données brutes sont stockées si generate=False.
  • num_examples_per_class_low et num_examples_per_class_high déterminent le nombre d'exemples par classe à générer. Le script génère un nombre aléatoire d'exemples dans cette plage.
  • save_dir correspond à l'emplacement où les fichiers TFRecord doivent être enregistrés. Pour entraîner un modèle sur Cloud TPU, les données doivent être stockées sur Cloud Storage. Il peut s'agir d'un stockage sur Cloud Storage ou sur la VM.

Renommer et déplacer les enregistrements TFRecord dans Cloud Storage

L'exemple suivant utilise les données converties avec le modèle ResNet TF 1.x.

  1. Renommez les enregistrements TFRecord avec le même format que les enregistrements TFRecord ImageNet :

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. Copiez les enregistrements TFRecord dans Cloud Storage :

    (vm)$ gsutil -m cp train* $GCS_CONVERTED
    (vm)$ gsutil -m cp validation* $GCS_CONVERTED

Exécuter ResNet sur l'ensemble de données généré

  1. Créez le TPU :

    (vm)$ export TPU_NAME=imageclassificationconverter
    (vm)$ ctpu up --zone=us-central1-b 
    --tpu-only
    --tpu-size=v2-8
    --name=${TPU_NAME}

  2. Créez une variable d'environnement pour le répertoire de bucket de stockage contenant le modèle.

    (vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/image_classification_converter
    
  3. Exécutez le modèle.

    (vm)$ cd /usr/share/tpu/models/official/resnet
    (vm)$ python3 resnet_main.py --tpu=${TPU_NAME} 
    --data_dir=${GCS_CONVERTED}
    --config_file=configs/cloud/v3-8.yaml
    --model_dir=${MODEL_BUCKET}
    --num_train_images=10000
    --num_eval_images=10000