Tutoriel : Exécuter une inférence sur une table d'objets à l'aide d'un modèle de vecteur de caractéristiques

Ce tutoriel explique comment créer une table d'objets basée sur les images de l'ensemble de données sur les fleurs, puis comment exécuter une inférence sur cette table d'objets à l'aide du modèle MobileNet V3.

Modèle MobileNet V3

Le modèle MobileNet V3 analyse des fichiers image et renvoie un tableau de vecteurs de caractéristiques. Le tableau de vecteurs de caractéristiques est une liste d'éléments numériques qui décrivent les caractéristiques des images analysées. Chaque vecteur de caractéristiques décrit un espace de caractéristiques multidimensionnel et fournit les coordonnées de l'image dans cet espace. Vous pouvez utiliser les informations des vecteurs de caractéristiques sur une image pour affiner sa classification, par exemple en utilisant la similarité cosinus pour regrouper des images similaires.

L'entrée du modèle MobileNet V3 utilise un Tensor de DType tf.float32 sous la forme [-1, 224, 224, 3]. Le résultat est un tableau de Tensors de tf.float32 sous la forme [-1, 1024].

Autorisations requises

  • Pour créer l'ensemble de données, vous devez disposer de l'autorisation bigquery.datasets.create.
  • Pour créer la ressource de connexion, vous devez disposer des autorisations suivantes :

    • bigquery.connections.create
    • bigquery.connections.get
  • Pour accorder des autorisations au compte de service de la connexion, vous devez disposer de l'autorisation suivante :

    • resourcemanager.projects.setIamPolicy
  • Pour créer la table d'objets, vous devez disposer des autorisations suivantes :

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • Pour créer le bucket, vous devez disposer de l'autorisation storage.buckets.create.

  • Pour importer l'ensemble de données et le modèle dans Cloud Storage, vous devez disposer des autorisations storage.objects.create et storage.objects.get.

  • Pour charger le modèle dans BigQuery ML, vous devez disposer des autorisations suivantes :

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Pour exécuter une inférence, vous devez disposer des autorisations suivantes :

    • bigquery.tables.getData sur la table d'objets
    • bigquery.models.getData sur le modèle
    • bigquery.jobs.create

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • BigQuery : vous payez des frais de stockage pour la table d'objets que vous créez dans BigQuery.
  • BigQuery ML : vous payez des frais pour le modèle que vous créez et l'inférence que vous effectuez dans BigQuery ML.
  • Cloud Storage : des frais sont facturés pour les objets que vous stockez dans Cloud Storage.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Pour plus d'informations sur la tarification de stockage BigQuery, consultez les tarifs de stockage dans la documentation BigQuery.

Pour en savoir plus sur les tarifs de BigQuery ML, consultez la page Tarifs de BigQuery ML dans la documentation BigQuery.

Pour en savoir plus sur les tarifs de Cloud Storage, consultez la page Tarifs de Cloud Storage.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API BigQuery and BigQuery Connection API.

    Activer les API

  5. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activer les API BigQuery and BigQuery Connection API.

    Activer les API

Créer un ensemble de données

Créez un ensemble de données nommé mobilenet_inference_test :

SQL

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Éditeur, exécutez l'instruction SQL suivante :

    CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;
    

    en remplaçant PROJECT_ID par l'ID de votre projet :

bq

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

  2. Exécutez la commande bq mk pour créer l'ensemble de données :

    bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
    

    Remplacez PROJECT_ID par l'ID du projet.

Créer une connexion

Créez une connexion nommée lake-connection :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Cliquez sur  Ajouter des données, puis sur Source de données externe.

  3. Dans la liste Type de connexion, sélectionnez BigLake et fonctions distantes (ressource Cloud).

  4. Dans le champ ID de connexion, saisissez lake-connection.

  5. Cliquez sur Créer une connexion.

  6. Dans le volet Explorateur, développez votre projet, développez le nœud Connexions externes, puis sélectionnez la connexion us.lake-connection.

  7. Dans le volet Informations de connexion, copiez la valeur du champ ID du compte de service. Vous avez besoin de ces informations pour accorder une autorisation au compte de service de la connexion sur le bucket Cloud Storage que vous créez à l'étape suivante.

bq

  1. Dans Cloud Shell, exécutez la commande bq mk pour créer la connexion :

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. Exécutez la commande bq show pour récupérer les informations concernant la connexion :

    bq show --connection us.lake-connection
    
  3. Dans la colonne properties, copiez la valeur de la propriété serviceAccountId et enregistrez-la. Vous avez besoin de ces informations pour accorder des autorisations au compte de service de la connexion.

Créer un bucket Cloud Storage

  1. Créez un bucket Cloud Storage.
  2. Créez deux dossiers dans le bucket, l'un nommé mobilenet pour les fichiers du modèle et l'autre nommé flowers pour l'ensemble de données.

Accorder des autorisations au compte de service de la connexion

Console

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

    La boîte de dialogue Ajouter des comptes principaux s'ouvre.

  3. Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.

  4. Dans le champ Sélectionner un rôle, sélectionnez Cloud Storage, puis Lecteur des objets Storage.

  5. Cliquez sur Enregistrer.

gsutil

Dans Cloud Shell, exécutez la commande gsutil iam ch :

gsutil iam ch serviceAccount:MEMBER:objectViewer gs://BUCKET_NAME

Remplacez MEMBER par l'ID du compte de service que vous avez copié précédemment. Remplacez BUCKET_NAME par le nom du bucket que vous venez de créer.

Pour plus d'informations, consultez la section Ajouter un compte principal à une stratégie au niveau du bucket.

Importer l'ensemble de données dans Cloud Storage

Récupérez les fichiers de l'ensemble de données et rendez-les disponibles dans Cloud Storage :

  1. Téléchargez l'ensemble de données sur les fleurs sur votre ordinateur local.
  2. Décompressez le fichier flower_photos.tgz.
  3. Importez le dossier flower_photos dans le dossier flowers du bucket que vous avez créé précédemment.
  4. Une fois l'importation terminée, supprimez le fichier LICENSE.txt du dossier flower_photos.

Créer une table d'objets

Créez une table d'objets nommée sample_images basée sur l'ensemble de données sur les fleurs que vous avez importé :

SQL

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Éditeur, exécutez l'instruction SQL suivante :

    CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/flowers/*']);
    

    Remplacez BUCKET_NAME par le nom du bucket que vous avez créé précédemment.

bq

Dans Cloud Shell, exécutez la commande bq mk pour créer la connexion :

bq mk --table \
--external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \
--object_metadata=SIMPLE \
mobilenet_inference_test.sample_images

Remplacez BUCKET_NAME par le nom du bucket que vous avez créé précédemment.

Importer le modèle dans Cloud Storage

Récupérez les fichiers du modèle et rendez-les disponibles dans Cloud Storage :

  1. Téléchargez le modèle MobileNet V3 sur votre ordinateur local. Vous obtenez ainsi un fichier saved_model.pb et un dossier variables pour le modèle.
  2. Importez le fichier saved_model.pb et le dossier variables dans le dossier mobilenet du bucket que vous avez créé précédemment.

Charger le modèle dans BigQuery ML

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Éditeur, exécutez l'instruction SQL suivante :

    CREATE MODEL `mobilenet_inference_test.mobilenet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/mobilenet/*');
    

    Remplacez BUCKET_NAME par le nom du bucket que vous avez créé précédemment.

Inspecter le modèle

Inspectez le modèle importé pour afficher ses champs d'entrée et de sortie :

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, développez votre projet, l'ensemble de données mobilenet_inference_test, puis le nœud Modèles.

  3. Cliquez sur le modèle mobilenet.

  4. Dans le volet du modèle qui s'affiche, cliquez sur l'onglet Schéma.

  5. Consultez la section Étiquettes. Cela permet d'identifier les champs générés par le modèle. Dans le cas présent, la valeur du nom de champ est feature_vector.

  6. Examinez la section Caractéristiques. Cela permet d'identifier les champs qui doivent être saisis dans le modèle. Vous les référencez dans l'instruction SELECT pour la fonction ML.DECODE_IMAGE. Dans le cas présent, la valeur du nom de champ est inputs.

Exécuter une inférence

Exécutez l'inférence sur la table d'objets sample_images à l'aide du modèle mobilenet :

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Éditeur, exécutez l'instruction SQL suivante :

    SELECT *
    FROM ML.PREDICT(
      MODEL `mobilenet_inference_test.mobilenet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs
      FROM mobilenet_inference_test.sample_images)
    );
    

    Le résultat doit ressembler à ce qui suit :

    --------------------------------------------------------------------------------------------------------------
    | feature_vector         | uri                                                        | inputs               |
    —-------------------------------------------------------------------------------------------------------------
    | 0.850297749042511      | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg  | 0.29019609093666077  |
    —-------------------------------------------------------------------------------------------------------------
    | -0.27427938580513      |                                                            | 0.31372550129890442  |
    —-------------------------                                                            ------------------------
    | -0.23189745843410492   |                                                            | 0.039215687662363052 |
    —-------------------------                                                            ------------------------
    | -0.058292809873819351  |                                                            | 0.29985997080802917  |
    —-------------------------------------------------------------------------------------------------------------
    

Effectuer un nettoyage

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.