Интегрируйте Vision API с Dialogflow

1. Прежде чем начать

В этой лаборатории кода вы интегрируете Vision API с Dialogflow, чтобы обеспечить богатые и динамичные ответы на основе машинного обучения на вводимые пользователем изображения. Вы создадите приложение чат-бота, которое принимает изображение в качестве входных данных, обрабатывает его в Vision API и возвращает пользователю идентифицированный ориентир. Например, если пользователь загрузит изображение Тадж-Махала, чат-бот вернет Тадж-Махал в качестве ответа.

Это полезно, потому что вы можете проанализировать элементы на изображении и принять меры на основе полученной информации. Вы также можете создать систему обработки возврата, которая поможет пользователям загружать квитанции, извлекать дату покупки из квитанции и обрабатывать возврат, если дата подходит.

Взгляните на следующий пример диалогового окна:

Пользователь: Привет

Чат-бот: Привет! Вы можете загрузить фотографию, чтобы изучить достопримечательности.

Пользователь: Загрузите изображение с Тадж-Махалом.

Чат-бот: Файл обрабатывается, вот результаты: Тадж-Махал, Тадж-Махал Гарден, Тадж-Махал.

15a4243e453415ca.png

Предварительные условия

Прежде чем продолжить, вам необходимо выполнить следующие лабораторные работы:

  1. Создайте планировщик встреч с помощью Dialogflow
  2. Интегрируйте чат-бота Dialogflow с Actions on Google
  3. Понимание сущностей в Dialogflow
  4. Создайте внешний клиент Django для приложения Dialogflow.

Вам также необходимо понять основные концепции и конструкции Dialogflow, которые вы можете почерпнуть из следующих видеороликов в разделе «Создание чат-бота с помощью Dialogflow» :

Что вы узнаете

  • Как создать агент Dialogflow
  • Как обновить агент Dialogflow для загрузки файлов
  • Как настроить соединение Vision API с выполнением Dialogflow
  • Как настроить и запустить интерфейсное приложение Django для Dialogflow
  • Как развернуть интерфейсное приложение Django в Google Cloud на App Engine
  • Как протестировать приложение Dialogflow из пользовательского интерфейса

Что ты построишь

  • Создайте агент Dialogflow
  • Внедрите интерфейс Django для загрузки файла
  • Реализуйте выполнение Dialogflow для вызова API Vision для загруженного изображения.

Что вам понадобится

  • Базовые знания Python
  • Базовое понимание Dialogflow
  • Базовое понимание Vision API

2. Обзор архитектуры

Вы создадите новый диалоговый интерфейс с помощью пользовательского интерфейса Django и расширите его для интеграции с Vision API. Вы создадите внешний интерфейс с помощью платформы Django, запустите и протестируете его локально, а затем развернете в App Engine. Интерфейс будет выглядеть так:

5b07e09dc4b84646.png

Поток запросов будет работать следующим образом, как показано на следующем изображении:

  1. Пользователь отправит запрос через интерфейс.
  2. Это вызовет вызов API-интерфейса DialogflowDetectIntent, чтобы сопоставить высказывание пользователя с правильным намерением.
  3. Как только намерение исследовать ориентир будет обнаружено, выполнение Dialogflow отправит запрос в Vision API, получит ответ и отправит его пользователю.

153725eb50e008d4.png

Вот как будет выглядеть общая архитектура.

a2fcea32222a9cb4.png

3. Что такое Vision API?

Vision API — это предварительно обученная модель машинного обучения, которая извлекает ценную информацию из изображений. Он может дать вам множество полезных сведений, включая маркировку изображений, распознавание лиц и достопримечательностей, оптическое распознавание символов и пометку непристойного контента. Чтобы узнать больше, см. Vision AI .

4. Создайте агент Dialogflow.

  1. Перейдите в консоль Dialogflow .
  2. Войдите в систему. (Если вы впервые пользуетесь услугой, используйте свой адрес электронной почты для регистрации.)
  3. Примите условия и положения, и вы окажетесь в консоли.
  4. Нажмите d9e90c93fc779808.png , прокрутите страницу вниз и нажмите « Создать нового агента» . 3b3f9677e2a26d93.png
  5. Введите «VisionAPI» в качестве имени агента .
  6. Нажмите Создать .

Dialogflow создает следующие два намерения по умолчанию как часть агента:

  1. Приветственное намерение по умолчанию приветствует ваших пользователей.
  2. Резервное намерение по умолчанию улавливает все вопросы, которые ваш бот не понимает.

На данный момент у вас есть функциональный бот, который приветствует пользователей, но вам необходимо обновить его, чтобы пользователи знали, что они могут загрузить изображение для изучения достопримечательностей.

Обновить приветственное намерение по умолчанию, чтобы уведомить пользователя о необходимости загрузки изображения.

  1. Нажмите «Намерение приветствия по умолчанию» .
  2. Перейдите в «Ответы» > «По умолчанию» > «Текст» или «Ответ SSML» и введите «Привет! Вы можете загрузить изображение, чтобы изучить достопримечательности».

f9cd9ba6917a7aa9.png

Создать объект

  1. Нажмите «Объекты» .

432fff294b666c93.png

  1. Нажмите «Создать объект» , назовите его «имя файла» и нажмите « Сохранить» .

602d001d684485de.png

Создать новое намерение

  1. Нажмите «Намерения» > «Создать намерение» .
  2. Введите «Изучить загруженное изображение» в качестве имени намерения .
  3. Нажмите «Обучающие фразы» > «Добавить обучающие фразы» и введите «file is demo.jpg » и «file is taj.jpeg » в качестве пользовательских выражений с @filename в качестве сущности.

dd54ebda59c6b896.png

  1. Нажмите «Ответы» > «Добавить ответ» > «По умолчанию» > «Текст» или «Ответ SSML» . Введите «Оценка файла» и нажмите « Добавить ответы».
  2. Нажмите «Выполнение» > «Включить выполнение» и включите параметр «Включить вызов веб-перехватчика для этого намерения» .

b32b7ac054fcc938.png

5. Настройте выполнение для интеграции с Vision API.

  1. Нажмите «Выполнение» .
  2. Включить встроенный редактор .

c8574c6ef899393f.png

  1. Обновите index.js используя следующий код, и обновите YOUR-BUCKET-NAME указав имя вашего сегмента 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. Вставьте следующее в package.json , чтобы заменить его содержимое.
{
  "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. Нажмите «Сохранить».

6. Загрузите и запустите интерфейсное приложение.

  1. Клонируйте этот репозиторий на свой локальный компьютер:
https://github.com/priyankavergadia/visionapi-dialogflow.git
  1. Перейдите в каталог, содержащий код. Кроме того, вы можете загрузить образец в виде zip-архива и распаковать его.
cd visionapi-dialogflow

7. Настройте локальную среду

При развертывании ваше приложение использует прокси-сервер Cloud SQL, встроенный в стандартную среду App Engine, для связи с вашим экземпляром Cloud SQL. Однако для локального тестирования приложения необходимо установить и использовать локальную копию Cloud SQL Proxy в своей среде разработки. Дополнительную информацию см. в разделе О прокси-сервере Cloud SQL .

Для выполнения основных задач администрирования на вашем экземпляре Cloud SQL вы можете использовать клиент Cloud SQL для MySQL.

Установите прокси-сервер Cloud SQL.

Загрузите и установите прокси-сервер Cloud SQL с помощью следующей команды. Прокси-сервер Cloud SQL используется для подключения к вашему экземпляру Cloud SQL при локальном запуске.

Загрузите прокси:

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

Сделайте прокси исполняемым.

chmod +x cloud_sql_proxy

Создайте экземпляр Cloud SQL

  1. Создайте экземпляр Cloud SQL для MySQL второго поколения. Введите «polls-instance» или что-то похожее на имя. Подготовка экземпляра может занять несколько минут. После того, как он будет готов, он должен появиться в списке экземпляров.
  2. Теперь с помощью инструмента командной строки gcloud выполните следующую команду, где [YOUR_INSTANCE_NAME] представляет имя вашего экземпляра Cloud SQL. Запишите значение, указанное для connectionName для следующего шага. Он отображается в формате [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] .
gcloud sql instances describe [YOUR_INSTANCE_NAME]

Альтернативно вы можете нажать на экземпляр в консоли, чтобы получить имя подключения к экземпляру .

c11e94464bf4fcf8.png

Инициализируйте экземпляр Cloud SQL

Запустите прокси-сервер Cloud SQL, используя connectionName из предыдущего раздела.

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

Замените [YOUR_INSTANCE_CONNECTION_NAME] значением, которое вы записали в предыдущем разделе. При этом будет установлено соединение вашего локального компьютера с экземпляром Cloud SQL для целей локального тестирования. Поддерживайте прокси-сервер Cloud SQL включенным все время, пока вы тестируете приложение локально.

Затем создайте нового пользователя и базу данных Cloud SQL.

  1. Создайте новую базу данных с помощью Google Cloud Console для своего экземпляра Cloud SQL с именем polls-instance . Например, вы можете ввести в качестве имени «опросы». a3707ec9bc38d412.png
  2. Создайте нового пользователя с помощью Cloud Console для вашего экземпляра Cloud SQL с именем polls-instance . f4d098fca49cccff.png

Настройте параметры базы данных

  1. Откройте mysite/settings-changeme.py для редактирования.
  2. Переименуйте файл в setting.py .
  3. В двух местах замените [YOUR-USERNAME] и [YOUR-PASSWORD] именем пользователя и паролем базы данных, которые вы создали в предыдущем разделе. Это помогает настроить подключение к базе данных для развертывания App Engine и локального тестирования.
  4. В строке 'HOST': 'cloudsql/ [PROJECT_NAME]:[REGION_NAME]:[INSTANC E_NAME]» замените [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] на имя вашего экземпляра, полученное в предыдущем разделе.
  5. Выполните следующую команду и скопируйте выведенное значение connectionName для следующего шага.
gcloud sql instances describe [YOUR_INSTANCE_NAME]
  1. Замените [YOUR-CONNECTION-NAME] на значение, которое вы записали на предыдущем шаге.
  2. Замените [YOUR-DATABASE] на имя, которое вы выбрали в предыдущем разделе.
# [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. Закройте и сохраните settings.py .

8. Настройте учетную запись службы.

  1. В консоли Dialogflow нажмите 21a21c1104f5fdf3.png . На вкладке «Общие» перейдите в «Проект Google» > «Идентификатор проекта» и нажмите «Google Cloud». 7b2236f5627c37a0.png чтобы открыть облачную консоль. a4cfb880b3c8e789.png
  2. Нажмите Меню навигации ☰ > IAM и администратор > Учетные записи служб , затем нажмите 796e7c9e65ae751f.png рядом с пунктом «Интеграции Dialogflow» и нажмите « Создать ключ» .

3d72abc0c184d281.png

  1. На ваш компьютер будет загружен файл JSON, который понадобится вам в следующих разделах настройки.

9. Настройте конечную точку DialogflowDetectIntent для вызова из приложения.

  1. В папке чата замените key-sample.json файлом JSON ваших учетных данных и назовите его key.json .
  2. В views.py в папке чата измените GOOGLE_PROJECT_ID = "<YOUR_PROJECT_ID>" на идентификатор вашего проекта.

10. Создайте сегменты облачного хранилища

Создайте сегмент Cloud Storage для статических объектов внешнего интерфейса.

  1. В Cloud Console нажмите «Навигация по меню навигации» ☰ > «Хранилище» .

87ff9469db4eb77f.png

  1. Нажмите Создать сегмент .
  2. Укажите глобально уникальное имя.

a15a6612e92a39d3.png

  1. Выберите, где хранить ваши данные. Выберите регион и выберите место, которое лучше всего соответствует вашим потребностям.
  2. Выберите «Стандартный» в качестве класса хранилища по умолчанию.

9c56abe632cf61db.png

  1. Выберите «Установить разрешения единообразно на уровне сегмента (только политика сегмента)» , затем нажмите « Продолжить» , чтобы создать сегмент.

f175ac794049df04.png

  1. После создания сегмента нажмите меню навигации ☰ > Хранилище > Браузер и найдите созданный вами сегмент.

9500ee19b427158c.png

  1. Нажмите 796e7c9e65ae751f.png рядом с соответствующим сегментом и нажмите «Изменить разрешения сегмента» .

fd0a310bc3656edd.png

  1. Нажмите «Добавить участников», нажмите « Новые участники» , введите «allUsers», затем нажмите «Выбрать роль» > «Просмотр объектов хранилища» . Это обеспечивает всем пользователям доступ к просмотру статических файлов внешнего интерфейса. Это не идеальная настройка безопасности для файлов, но она подходит для целей данной конкретной лаборатории.

7519116abd56d5a3.png

Создайте корзину Cloud Storage для загружаемых пользователем изображений.

Следуйте тем же инструкциям, чтобы создать отдельный контейнер для загрузки изображений пользователей. Снова установите разрешения «allUsers», но выберите в качестве ролей «Создатель объектов хранения» и «Просмотр объектов хранения» .

11. Настройте сегменты Cloud Storage во внешнем приложении.

Настройте сегмент Cloud Storage в settings.py.

  1. Откройте mysite/setting.py .
  2. Найдите переменную GCS_BUCKET и замените '<YOUR-GCS-BUCKET-NA ME>» статическим сегментом Cloud Storage.
  3. Найдите переменную GS_MEDIA_BUCKET_NAME и замените '<YOUR-GCS-BUCKET-NAME-MED IA>» на имя вашего сегмента Cloud Storage для изображений.
  4. Найдите переменную GS_STATIC_BUCKET_NAME и замените '<YOUR-GCS-BUCKET-NAME-STAT IC>» на имя вашего сегмента Cloud Storage для статических файлов.
  5. Сохраните файл.
GCS_BUCKET = '<YOUR-GCS-BUCKET-NAME>'
GS_MEDIA_BUCKET_NAME = '<YOUR-GCS-BUCKET-NAME-MEDIA>'
GS_STATIC_BUCKET_NAME = '<YOUR-GCS-BUCKET-NAME-STATIC>'

Настройте сегмент Cloud Storage в файле home.html.

  • Откройте папку чата, затем откройте templates и переименуйте home-changeme.html в home.html .
  • Найдите <YOUR-GCS-BUCKET-NAME-MEDIA> и замените его именем корзины, в которой вы хотите сохранить загруженный пользователем файл. Это не позволяет вам хранить загруженный пользователем файл во внешнем интерфейсе и хранить статические ресурсы в корзине Cloud Storage. Vision API вызывает корзину Cloud Storage, чтобы получить файл и сделать прогноз.

12. Создайте и запустите приложение локально.

Чтобы запустить приложение Django на локальном компьютере, вам необходимо настроить среду разработки Python, включая Python, pip и virtualenv. Инструкции см. в разделе Настройка среды разработки Python .

  1. Создайте изолированную среду Python и установите зависимости.
virtualenv env
source env/bin/activate
pip install -r requirements.txt
  1. Запустите миграцию Django, чтобы настроить свои модели.
python3 manage.py makemigrations
python3 manage.py makemigrations polls
python3 manage.py migrate
  1. Запустите локальный веб-сервер.
python3 manage.py runserver
  1. В веб-браузере перейдите по адресу http://localhost:8000/ . Вы должны увидеть простую веб-страницу, которая выглядит следующим образом:.

8f986b8981f80f7b.png

Примеры страниц приложения доставляются веб-сервером Django, работающим на вашем компьютере. Когда вы будете готовы двигаться дальше, нажмите Control+C ( Command+C на Macintosh), чтобы остановить локальный веб-сервер.

Используйте консоль администратора Django

  1. Создайте суперпользователя.
python3 manage.py createsuperuser
  1. Запустите локальный веб-сервер.
python3 manage.py runserver
  1. Перейдите по адресу http://localhost:8000/admin/ в веб-браузере. Чтобы войти на сайт администратора, введите имя пользователя и пароль, которые вы создали при запуске createsuperuser .

13. Разверните приложение в стандартной среде App Engine.

Соберите все статическое содержимое в одну папку, выполнив следующую команду, которая перемещает все статические файлы приложения в папку, указанную STATIC_ROOT в settings.py :

python3 manage.py collectstatic

Загрузите приложение, выполнив следующую команду из каталога приложения, где находится файл app.yaml :

gcloud app deploy

Дождитесь сообщения, уведомляющего вас о завершении обновления.

14. Проверьте интерфейсное приложение

В веб-браузере перейдите по адресу https://<your_project_id>.appspot.com.

На этот раз ваш запрос обслуживается веб-сервером, работающим в стандартной среде App Engine.

Команда app deploy развертывает приложение, как описано в app.yaml , и устанавливает вновь развернутую версию в качестве версии по умолчанию, заставляя ее обслуживать весь новый трафик.

15. Производство

Когда вы будете готовы использовать свой контент в рабочей среде, измените переменную DEBUG на False в mysite/settings.py .

16. Проверьте своего чат-бота

Вы можете протестировать своего чат-бота в симуляторе или использовать ранее созданную веб-интеграцию или интеграцию с Google Home.

  1. Пользователь: «Привет»
  2. Чат-бот: «Привет! Вы можете загрузить фотографию, чтобы изучить достопримечательности».
  3. Пользователь загружает изображение.

Загрузите это изображение, назовите его demo.jpg и используйте.

c3aff843c9f132e4.jpeg

  1. Чат-бот: «Файл обрабатывается, вот результаты: Мост Золотые Ворота, Национальная зона отдыха Золотые Ворота, Мост Золотые Ворота, Мост Золотые Ворота, Мост Золотые Ворота».

В целом это должно выглядеть так:

228df9993bfc001d.png

17. Очистка

Если вы хотите выполнить другие лабораторные работы по коду Dialogflow, пропустите этот раздел и вернитесь к нему позже.

Удалить агент Dialogflow

  1. Нажмите ca4337eeb5565bcb.png рядом с вашим существующим агентом.

520c1c6bb9f46ea6.png

  1. На вкладке «Общие» прокрутите вниз и нажмите «Удалить этого агента» .
  2. Введите «Удалить» в появившемся окне и нажмите «Удалить» .

18. Поздравления

Вы создали чат-бота в Dialogflow и интегрировали его с Vision API. Теперь вы разработчик чат-бота!

Узнать больше

Чтобы узнать больше, ознакомьтесь с примерами кода на странице Dialogflow Github .