Intégrer l'API Vision à Dialogflow

1. Avant de commencer

Dans cet atelier de programmation, vous allez intégrer l'API Vision à Dialogflow pour fournir des réponses riches et dynamiques basées sur le machine learning aux entrées d'images fournies par l'utilisateur. Vous allez créer une application de chatbot qui reçoit une image en entrée, la traite dans l'API Vision et renvoie un point de repère identifié à l'utilisateur. Par exemple, si l'utilisateur importe une image du Taj Mahal, le chatbot renvoie le Taj Mahal comme réponse.

Cette fonctionnalité est très utile, car elle vous permet d'analyser les éléments présents sur l'image et de prendre des mesures en fonction des informations ainsi obtenues. Vous pouvez également mettre en place un système de traitement des remboursements pour aider les utilisateurs à importer des reçus, à extraire la date d'achat sur le reçu et à traiter le remboursement le cas échéant.

Examinez l'exemple de boîte de dialogue suivant:

Utilisateur: Bonjour

Chatbot: Bonjour ! Vous pouvez importer une photo pour explorer des monuments

Utilisateur: Importez une image montrant le Taj Mahal.

Chatbot: Le fichier est en cours de traitement. Voici les résultats: Taj Mahal, Taj Mahal Garden, Taj Mahal.

15a4243e453415ca.png

Prérequis

Avant de continuer, vous devez suivre les ateliers de programmation suivants:

  1. Créer un planificateur de rendez-vous avec Dialogflow
  2. Intégrer un chatbot Dialogflow à Actions on Google
  3. Comprendre les entités dans Dialogflow
  4. Créer un client Django frontend pour une application Dialogflow

Vous devez également comprendre les concepts et les constructions de base de Dialogflow, que vous pouvez glaner dans les vidéos suivantes du parcours Créer un chatbot avec Dialogflow:

Points abordés

  • Créer un agent Dialogflow
  • Mettre à jour un agent Dialogflow pour importer des fichiers
  • Configurer la connexion à l'API Vision avec le fulfillment Dialogflow
  • Configurer et exécuter une application d'interface Django pour Dialogflow
  • Déployer l'application d'interface Django dans Google Cloud sur App Engine
  • Tester l'application Dialogflow à partir d'une interface personnalisée

Ce que vous allez faire

  • Créer un agent Dialogflow
  • Implémenter une interface Django pour importer un fichier
  • Implémenter un fulfillment Dialogflow pour appeler l'API Vision sur l'image importée

Prérequis

  • Connaissances de base de Python
  • Connaissances de base de Dialogflow
  • Connaissances de base de l'API Vision

2. Présentation de l'architecture

Vous allez créer une expérience de conversation avec une interface Django personnalisée et l'étendre pour l'intégrer à l'API Vision. Vous allez créer l'interface avec l'environnement logiciel Django, l'exécuter et la tester localement, puis la déployer sur App Engine. L'interface se présente comme suit:

5b07e09dc4b84646.png

Le flux de requêtes fonctionnera comme ceci, comme illustré dans l'image suivante:

  1. L'utilisateur envoie une requête via l'interface.
  2. Cette opération déclenche un appel à l'API Dialogflow DetectIntent pour mapper l'énoncé de l'utilisateur avec l'intent approprié.
  3. Une fois l'intent de point de repère d'exploration détecté, le fulfillment Dialogflow envoie une requête à l'API Vision, reçoit une réponse et l'envoie à l'utilisateur.

153725eb50e008d4.png

Voici à quoi ressemblera l'architecture globale.

a2fcea32222a9cb4.png

3. Qu'est-ce que l'API Vision ?

L'API Vision est un modèle de ML pré-entraîné qui dégage des insights à partir d'images. Il peut vous fournir de nombreuses informations, y compris l'étiquetage d'images, la détection de visages et de points de repère, la reconnaissance optique des caractères et l'ajout de tags au contenu explicite. Pour en savoir plus, consultez Vision AI.

4. Créer un agent Dialogflow

  1. Accédez à la console Dialogflow.
  2. Connectez-vous. (Si vous êtes un nouvel utilisateur, utilisez votre adresse e-mail pour vous inscrire.)
  3. Acceptez les conditions d'utilisation pour accéder à la console.
  4. Cliquez sur d9e90c93fc779808.png, faites défiler la page jusqu'en bas, puis cliquez sur Create new agent (Créer un agent). 3b3f9677e2a26d93.png
  5. Entrez "VisionAPI" dans le champ Agent name (Nom de l'agent).
  6. Cliquez sur Créer.

Dialogflow crée les deux intents par défaut suivants dans l'agent:

  1. L'intent d'accueil par défaut accueille vos utilisateurs.
  2. L'intent de remplacement par défaut capture toutes les questions que votre bot ne comprend pas.

À ce stade, vous disposez d'un bot fonctionnel qui accueille les utilisateurs, mais vous devez le mettre à jour pour indiquer aux utilisateurs qu'ils peuvent importer une image pour explorer des points de repère.

Modifier l'intent d'accueil par défaut pour demander à l'utilisateur d'importer une image

  1. Cliquez sur Default Welcome Intent (Intent d'accueil par défaut).
  2. Accédez à Réponses > Par défaut > Texte ou réponse SSML, puis saisissez "Hi! Vous pouvez importer une photo pour explorer des monuments."

f9cd9ba6917a7aa9.png

Créer une entité

  1. Cliquez sur Entities (Entités).

432fff294b666c93.png

  1. Cliquez sur Créer une entité, nommez-la "nom de fichier". et cliquez sur Enregistrer.

602d001d684485de.png

Créer un intent

  1. Cliquez sur Intents > Créer un intent.
  2. Saisissez "Explorer l'image importée" dans le champ Intent name (Nom de l'intent).
  3. Cliquez sur Training phrases (Phrases d'entraînement) > Ajoutez des phrases d'entraînement et saisissez "le fichier est demo.jpg" et "fichier est taj.jpeg" en tant qu'expressions utilisateur avec @filename comme entité.

dd54ebda59c6b896.png

  1. Cliquez sur Réponses > Ajouter une réponse > Par défaut > Texte ou réponse SSML. Saisissez "Assessing file" (Évaluation du fichier). et cliquez sur Add Responses (Ajouter des réponses).
  2. Cliquez sur Fulfillment > Enable fulfillment (Activer le fulfillment) et cochez Enable webhook call for this intent (Activer l'appel webhook pour cet intent).

b32b7ac054fcc938.png

5. Configurer le fulfillment pour l'intégration à l'API Vision

  1. Cliquez sur Fulfillment.
  2. Activez l'éditeur intégré.

c8574c6ef899393f.png

  1. Mettez à jour index.js avec le code suivant et remplacez YOUR-BUCKET-NAME par le nom de votre bucket Cloud Storage.
'use strict';

const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');
const vision = require('@google-cloud/vision');
  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
const bucketName = 'YOUR-BUCKET-NAME';
const timeZone = 'America/Los_Angeles';
const timeZoneOffset = '-07:00';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log("Parameters", agent.parameters);

  function applyML(agent){
    const filename = agent.parameters.filename;
    console.log("filename is: ", filename);

    // call vision API to detect text
    return callVisionApi(agent, bucketName, filename).then(result => {
                      console.log(`result is ${result}`);
                      agent.add(`file is being processed, here are the results:  ${result}`);
            //agent.add(`file is being processed ${result}`);
        }).catch((error)=> {
            agent.add(`error occurred at apply ml function`  + error);
        });
  }

  let intentMap = new Map();
  intentMap.set('Explore uploaded image', applyML);
  agent.handleRequest(intentMap);
});


async function callVisionApi(agent, bucketName, fileName){
    // [START vision_text_detection_gcs]
  // Imports the Google Cloud client libraries
  // Creates a client
  
  const client = new vision.ImageAnnotatorClient();
    try {
        // Performs text detection on the gcs file
        const [result] = await client.landmarkDetection(`gs://${bucketName}/${fileName}`);
        const detections = result.landmarkAnnotations;
        var detected = [];
        detections.forEach(text => {
            console.log(text.description);
            detected.push(text.description);
        });
        return detected;
    }
    catch(error) {
        console.log('fetch failed', error);
        return [];
    }
}
  1. Collez le code suivant dans package.json pour remplacer son contenu.
{
  "name": "dialogflowFirebaseFulfillment",
  "description": "Dialogflow fulfillment for the bike shop sample",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "6"
  },
  "scripts": {
    "lint": "semistandard --fix \"**/*.js\"",
    "start": "firebase deploy --only functions",
    "deploy": "firebase deploy --only functions"
  },
  "dependencies": {
    "firebase-functions": "2.0.2",
    "firebase-admin": "^5.13.1",
    "actions-on-google": "2.2.0", 
    "googleapis": "^27.0.0",
    "dialogflow-fulfillment": "^0.6.1",
    "@google-cloud/bigquery": "^1.3.0",
    "@google-cloud/storage": "^2.0.0",
    "@google-cloud/vision": "^0.25.0"
  }
}
  1. Cliquez sur Enregistrer.

6. Télécharger et exécuter l'application d'interface

  1. Clonez ce dépôt sur votre ordinateur local:
https://github.com/priyankavergadia/visionapi-dialogflow.git
  1. Accédez au répertoire qui contient le code. Vous pouvez également télécharger l'exemple sous forme de fichier ZIP et l'extraire.
cd visionapi-dialogflow

7. Configurer votre environnement local

Une fois déployée, votre application communique avec votre instance Cloud SQL à l'aide du proxy Cloud SQL intégré à l'environnement standard App Engine. Toutefois, pour tester votre application en local, vous devez installer et utiliser une copie locale du proxy Cloud SQL dans votre environnement de développement. Pour en savoir plus, consultez À propos du proxy Cloud SQL.

Pour effectuer des tâches administratives de base sur votre instance Cloud SQL, vous pouvez utiliser le client Cloud SQL pour MySQL.

Installer le proxy Cloud SQL

Téléchargez et installez le proxy Cloud SQL à l'aide de la commande suivante. Le proxy Cloud SQL vous permet de vous connecter à votre instance Cloud SQL lorsque vous l'exécutez en local.

Téléchargez le proxy :

curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

Rendez le proxy exécutable.

chmod +x cloud_sql_proxy

Créer une instance Cloud SQL

  1. Créez une instance Cloud SQL pour MySQL de deuxième génération. Saisissez "polls-instance" ou un nom similaire. La préparation de l'instance peut prendre quelques minutes. Une fois prêt, l'instance devrait apparaître dans la liste des instances.
  2. Utilisez maintenant l'outil de ligne de commande gcloud pour exécuter la commande suivante, en remplaçant [YOUR_INSTANCE_NAME] par le nom de votre instance Cloud SQL. Notez la valeur affichée pour connectionName pour l'étape suivante. Il s'affiche au format [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].
gcloud sql instances describe [YOUR_INSTANCE_NAME]

Vous pouvez également cliquer sur l'instance dans la console pour obtenir le Nom de connexion de l'instance.

c11e94464bf4fcf8.png

Initialiser votre instance Cloud SQL

Démarrez le proxy Cloud SQL à l'aide du connectionName de la section précédente.

./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

Remplacez [YOUR_INSTANCE_CONNECTION_NAME] par la valeur que vous avez enregistrée dans la section précédente. Cela permet d'établir une connexion entre votre ordinateur local et votre instance Cloud SQL à des fins de test. N'arrêtez pas le proxy Cloud SQL lors du test local de votre application.

Créez ensuite un utilisateur et une base de données Cloud SQL.

  1. Créez une base de données nommée polls-instance dans la console Google Cloud pour votre instance Cloud SQL. Par exemple, vous pouvez saisir "sondages" comme nom. a3707ec9bc38d412.png
  2. Créez un utilisateur nommé polls-instance à l'aide de la console Cloud pour votre instance Cloud SQL. f4d098fca49cccff.png

Configurer les paramètres de base de données

  1. Ouvrez mysite/settings-changeme.py pour y apporter des modifications.
  2. Renommez le fichier setting.py.
  3. À deux endroits, remplacez [YOUR-USERNAME] et [YOUR-PASSWORD] par le nom d'utilisateur et le mot de passe de la base de données que vous avez créés à la section précédente. Cela permet de configurer la connexion à la base de données pour le déploiement d'App Engine et les tests en local.
  4. À la ligne ‘HOST': ‘cloudsql/ [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]' remplacez [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] par le nom de l'instance acquise à la section précédente.
  5. Exécutez la commande suivante et copiez la valeur connectionName générée pour l'étape suivante.
gcloud sql instances describe [YOUR_INSTANCE_NAME]
  1. Remplacez [YOUR-CONNECTION-NAME] par la valeur que vous avez enregistrée à l'étape précédente.
  2. Remplacez [YOUR-DATABASE] par le nom que vous avez choisi dans la section précédente.
# [START db_setup]
if os.getenv('GAE_APPLICATION', None):
    # Running on production App Engine, so connect to Google Cloud SQL using
    # the unix socket at /cloudsql/<your-cloudsql-connection string>
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '/cloudsql/[PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME]',
            'USER': '[YOUR-USERNAME]',
            'PASSWORD': '[YOUR-PASSWORD]',
            'NAME': '[YOUR-DATABASE]',
        }
    }
else:
    # Running locally so connect to either a local MySQL instance or connect to
    # Cloud SQL via the proxy. To start the proxy via command line:
    #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
    # See https://cloud.google.com/sql/docs/mysql-connect-proxy
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'NAME': '[YOUR-DATABASE]',
            'USER': '[YOUR-USERNAME]',
            'PASSWORD': '[YOUR-PASSWORD]'
        }
    }
# [END db_setup]
  1. Enregistrez et fermez le fichier settings.py.

8. Configurer un compte de service

  1. Dans la console Dialogflow, cliquez sur 21a21c1104f5fdf3.png. Dans l'onglet General (Général), accédez à Google Project (Projet Google) > ID du projet, puis cliquez sur Google Cloud 7b2236f5627c37a0.png pour ouvrir la console Cloud. a4cfb880b3c8e789.png
  2. Cliquez sur le menu de navigation ▾ > IAM et Admin > Comptes de service, puis cliquez sur 796e7c9e65ae751f.png à côté de Intégrations Dialogflow, puis sur Créer une clé.

3d72abc0c184d281.png

  1. Un fichier JSON est téléchargé sur votre ordinateur. Vous en aurez besoin dans les sections de configuration suivantes.

9. Configurer le point de terminaison Dialogflow DetectIntent à appeler depuis l'application

  1. Dans le dossier "chat", remplacez key-sample.json par votre fichier JSON d'identifiants et nommez-le key.json.
  2. Dans le fichier views.py du dossier de chat, remplacez GOOGLE_PROJECT_ID = "<YOUR_PROJECT_ID>" par l'ID de votre projet.

10. Créer des buckets Cloud Storage

Créer un bucket Cloud Storage pour les objets statiques d'interface

  1. Dans la console Cloud, cliquez sur le menu de navigation événements > Stockage :

87ff9469db4eb77f.png

  1. Cliquez sur Créer un bucket.
  2. Indiquez un nom unique.

a15a6612e92a39d3.png

  1. Choisissez où stocker vos données. Choisissez Région, puis sélectionnez l'emplacement qui correspond le mieux à vos besoins.
  2. Choisissez Standard comme classe de stockage par défaut.

9c56abe632cf61db.png

  1. Choisissez Définir les autorisations de manière uniforme au niveau du bucket (Stratégie du bucket seulement), puis cliquez sur Continuer pour créer le bucket.

f175ac794049df04.png

  1. Une fois le bucket créé, cliquez sur le menu de navigation ▾ > Stockage > Navigateur et localisez le bucket que vous avez créé.

9500ee19b427158c.png

  1. Cliquez sur 796e7c9e65ae751f.png à côté du bucket correspondant, puis sur Modifier les autorisations relatives au bucket.

fd0a310bc3656edd.png

  1. Cliquez sur Ajouter des membres, puis sur Nouveaux membres et saisissez "allUsers", Cliquez sur Sélectionner un rôle > Lecteur des objets Storage. Cela permet d'accéder aux fichiers d'interface statiques pour allUsers. Ce paramètre de sécurité n'est pas idéal pour les fichiers, mais il fonctionne dans cet atelier de programmation particulier.

7519116abd56d5a3.png

Créer un bucket Cloud Storage pour les images importées par les utilisateurs

Suivez les mêmes instructions pour créer un bucket distinct afin d'importer les images d'utilisateurs. Définir les autorisations sur "allUsers" mais sélectionnez les rôles Storage Object Creator et Storage Object Viewer.

11. Configurer les buckets Cloud Storage dans l'application d'interface

Configurer le bucket Cloud Storage dans le fichier settings.py

  1. Ouvrez mysite/setting.py.
  2. Recherchez la variable GCS_BUCKET et remplacez ‘<YOUR-GCS-BUCKET-NAME>. avec votre bucket Cloud Storage statique.
  3. Recherchez la variable GS_MEDIA_BUCKET_NAME et remplacez ‘<YOUR-GCS-BUCKET-NAME-MEDIA>' par le nom de votre bucket Cloud Storage pour les images.
  4. Recherchez la variable GS_STATIC_BUCKET_NAME et remplacez ‘<YOUR-GCS-BUCKET-NAME-STATIC>' par le nom de votre bucket Cloud Storage pour les fichiers statiques.
  5. Enregistrez le fichier.
GCS_BUCKET = '<YOUR-GCS-BUCKET-NAME>'
GS_MEDIA_BUCKET_NAME = '<YOUR-GCS-BUCKET-NAME-MEDIA>'
GS_STATIC_BUCKET_NAME = '<YOUR-GCS-BUCKET-NAME-STATIC>'

Configurer un bucket Cloud Storage dans home.html

  • Ouvrez le dossier de chat, puis ouvrez templates et renommez home-changeme.html en home.html.
  • Recherchez <YOUR-GCS-BUCKET-NAME-MEDIA> et remplacez-le par le nom de votre bucket pour l'emplacement où vous souhaitez enregistrer le fichier importé par l'utilisateur. Cela vous empêche de stocker le fichier importé par l'utilisateur dans l'interface et de conserver les éléments statiques dans le bucket Cloud Storage. L'API Vision appelle le bucket Cloud Storage pour récupérer le fichier et effectuer la prédiction.

12. Créer et exécuter l'application en local

Pour exécuter l'application Django sur votre ordinateur local, vous devez configurer un environnement de développement Python incluant Python, pip et virtualenv. Pour obtenir des instructions, consultez la page Configurer un environnement de développement Python.

  1. Créez un environnement Python isolé et installez des dépendances.
virtualenv env
source env/bin/activate
pip install -r requirements.txt
  1. Exécutez les migrations Django pour configurer vos modèles.
python3 manage.py makemigrations
python3 manage.py makemigrations polls
python3 manage.py migrate
  1. Démarrez un serveur Web local :
python3 manage.py runserver
  1. Dans votre navigateur Web, accédez à http://localhost:8000/. Une page Web simple semblable à celle-ci doit s'afficher :

8f986b8981f80f7b.png

Les pages de l'exemple d'application sont fournies par le serveur Web Django exécuté sur votre ordinateur. Lorsque vous êtes prêt à poursuivre, appuyez sur Control+C (Command+C sur Macintosh) pour arrêter le serveur Web local.

Utiliser la console d'administration Django

  1. Créez un super-utilisateur.
python3 manage.py createsuperuser
  1. Démarrez un serveur Web local :
python3 manage.py runserver
  1. Accédez à http://localhost:8000/admin/ dans votre navigateur Web. Pour vous connecter au site d'administration, saisissez le nom d'utilisateur et le mot de passe que vous avez créés lorsque vous avez exécuté createsuperuser.

13. Déployer l'application dans l'environnement standard App Engine

Rassemblez tout le contenu statique dans un seul dossier en exécutant la commande suivante, qui déplace tous les fichiers statiques de l'application dans le dossier spécifié par STATIC_ROOT dans settings.py:

python3 manage.py collectstatic

Importez l'application en exécutant la commande suivante depuis le répertoire de l'application où se trouve le fichier app.yaml:

gcloud app deploy

Attendez de recevoir le message vous informant que la mise à jour est terminée.

14. Tester l'application d'interface

Dans votre navigateur Web, accédez à https://<your_project_id>.appspot.com

Cette fois, votre requête est traitée par un serveur Web s'exécutant dans l'environnement standard App Engine.

La commande app deploy déploie l'application comme décrit dans app.yaml et définit la version nouvellement déployée comme version par défaut, de sorte qu'elle diffuse tout le nouveau trafic.

15. Production

Lorsque vous êtes prêt à diffuser votre contenu en production, remplacez la variable DEBUG par False dans mysite/settings.py.

16. Tester le chatbot

Vous pouvez tester votre chatbot dans le simulateur, ou utiliser l'intégration Web ou Google Home que vous avez précédemment créée.

  1. Utilisateur : "salut"
  2. Chatbot : "Bonjour ! Vous pouvez importer une photo pour explorer des monuments."
  3. L'utilisateur importe une image.

Téléchargez cette image, nommez-la demo.jpg, puis utilisez-la.

c3aff843c9f132e4.jpeg

  1. Chatbot : "Le fichier est en cours de traitement. Voici les résultats: Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge, Golden Gate Bridge)

Globalement, cela devrait se présenter comme suit:

228df9993bfc001d.png

17. Effectuer un nettoyage

Si vous souhaitez suivre d'autres ateliers de programmation Dialogflow, ignorez cette section et reprenez-la plus tard.

Supprimer l'agent Dialogflow

  1. Cliquez sur ca4337eeb5565bcb.png à côté de votre agent existant.

520c1c6bb9f46ea6.png

  1. Dans l'onglet General (Général), faites défiler la page vers le bas et cliquez sur Delete This Agent (Supprimer cet agent).
  2. Saisissez Supprimer dans la fenêtre qui s'affiche, puis cliquez sur Supprimer.

18. Félicitations

Vous avez créé un chatbot dans Dialogflow et l'avez intégré à l'API Vision. Vous êtes maintenant développeur de chatbots !

En savoir plus

Pour en savoir plus, consultez les exemples de code sur la page Dialogflow GitHub.