Интеграция API машинного обучения

1. Обзор

В этой лабораторной работе вы кратко познакомитесь с несколькими API машинного обучения. Вам понадобятся:

  • Cloud Vision для понимания содержания изображения
  • Cloud Speech-to-Text для преобразования аудио в текст
  • Cloud Translation для перевода произвольной строки на любой поддерживаемый язык
  • Cloud Natural Language для извлечения информации из текста

Что вы построите

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

e6a57e5def315116.jpeg

Чему вы научитесь

  • Как использовать API-интерфейсы Vision, Speech-to-Text, Translation и Natural Language
  • Где найти примеры кода

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

  • Браузер, например Chrome или Firefox
  • Базовые знания Python

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не будет вам работать, извините!). Далее в этой практической работе он будет обозначаться как PROJECT_ID .

  1. Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этой лабораторной работы не должно обойтись дорого, если вообще обойтись. Обязательно следуйте инструкциям в разделе «Очистка», где рассказывается, как отключить ресурсы, чтобы не платить за них после окончания этого руководства. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Включить API

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

2bfc27ef9ba2ec7d.png

Выберите API и службы из раскрывающегося списка и нажмите «Панель управления».

a9546a22581facd5.png

Нажмите «Включить API и службы» .

eae7ff043d13a35.png

Затем введите «vision» в поле поиска. Нажмите на Google Cloud Vision API :

a47893f36372ae2f.png

Нажмите «Включить» , чтобы включить API Cloud Vision:

a24fd082a22030ad.png

Подождите несколько секунд, пока он включится. После включения вы увидите следующее:

633e58cbde1b74c6.png

Повторите тот же процесс, чтобы включить API Cloud Speech, Cloud Translation и Cloud Natural Language .

Cloud Shell

Google Cloud Shell — это среда командной строки, работающая в облаке . Эта виртуальная машина на базе Debian оснащена всеми необходимыми инструментами разработки ( gcloud , bq , git и другими) и предлагает постоянный домашний каталог объёмом 5 ГБ. Мы будем использовать Cloud Shell для создания запросов к API машинного обучения.

Чтобы начать работу с Cloud Shell, нажмите «Активировать Google Cloud Shell». Скриншот 2015-06-08 в 17:30:32.png значок в правом верхнем углу панели заголовка

24ef50000ca737a4.png

Сеанс Cloud Shell откроется в новом фрейме в нижней части консоли и отобразит приглашение командной строки. Дождитесь появления приглашения user@project:~$.

Дополнительно: редактор кода

В зависимости от того, насколько хорошо вы умеете работать с командной строкой, вы можете нажать «Запустить редактор кода». b885bf07bc1b02e5.png значок в правом верхнем углу панели Cloud Shell

de00be9278baf7b8.png

Учетная запись службы

Для аутентификации вам потребуется учётная запись сервиса. Чтобы создать её, замените [ИМЯ] на имя нужной учётной записи сервиса и выполните следующую команду в Cloud Shell:

gcloud iam service-accounts create [NAME]

Теперь вам нужно сгенерировать ключ для использования этой учётной записи сервиса. Замените [FILE_NAME] на желаемое имя ключа, [NAME] на имя учётной записи сервиса, указанное выше, а [PROJECT_ID] на идентификатор вашего проекта. Следующая команда создаст и скачает ключ в формате [FILE_NAME].json:

gcloud iam service-accounts keys create [FILE_NAME].json --iam-account [NAME]@[PROJECT_ID].iam.gserviceaccount.com

Чтобы использовать учётную запись сервиса, необходимо указать путь к ключу в переменной GOOGLE_APPLICATION_CREDENTIALS. Для этого выполните следующую команду, заменив [PATH_TO_FILE] на [FILE_NAME]:

export GOOGLE_APPLICATION_CREDENTIALS=[PATH_TO_FILE]/[FILE_NAME].json

3. Облачное видение

Python-клиент

Вам понадобится клиент Python для Cloud Vision. Для установки введите в командной строке Cloud Shell следующее:

pip install --upgrade google-cloud-vision --user

Давайте попробуем

Давайте рассмотрим примеры кода для API Cloud Vision . Нам интересно узнать, что находится на указанном изображении. detect.py кажется полезным для этого, поэтому давайте его возьмём. Один из способов — скопировать содержимое detect.py , создать новый файл в Cloud Shell с именем vision.py и вставить весь код в vision.py . Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/vision/cloud-client/detect/detect.py -o vision.py

После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:

python vision.py labels-uri gs://cloud-samples-data/ml-api-codelab/birds.jpg

Вы должны увидеть вывод о птицах и страусах, поскольку это было проанализированное изображение: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Что происходит?

Вы передали vision.py 2 аргумента:

  • labels-uri выбирает функцию detect_labels_uri() для запуска
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg — это местоположение изображения в облачном хранилище Google, которое передается как URI в detect_labels_uri()

Давайте подробнее рассмотрим функцию detect_labels_uri() . Обратите внимание на добавленные комментарии.

def detect_labels_uri(uri):
    """Detects labels in the file located in Google Cloud Storage or on the
    Web."""
    # relevant import from above
    # from google.cloud import vision

    # create ImageAnnotatorClient object
    client = vision.ImageAnnotatorClient()

    # create Image object
    image = vision.types.Image()

    # specify location of image
    image.source.image_uri = uri

    # get label_detection response by passing image to client
    response = client.label_detection(image=image)

    # get label_annotations portion of response
    labels = response.label_annotations
    print('Labels:')

    for label in labels:
        # print the label descriptions
        print(label.description)

4. Облачная функция преобразования речи в текст

Python-клиент

Вам понадобится клиент Python для Cloud Speech-to-Text. Для установки введите в командной строке Cloud Shell следующее:

sudo pip install --upgrade google-cloud-speech

Давайте попробуем

Давайте перейдём к примерам кода для Cloud Speech-to-Text . Нас интересует транскрибирование речи. transcribe.py выглядит как хорошее начало, поэтому давайте его используем. Скопируйте содержимое файла transcribe.py , создайте новый файл в Cloud Shell с именем speech2text.py и вставьте весь код в speech2text.py . Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/speech/cloud-client/transcribe.py -o speech2text.py

После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:

python speech2text.py gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Должны быть ошибки, сообщающие о неправильной кодировке и частоте дискретизации. Не волнуйтесь, перейдите в transcribe_gcs() в коде и удалите настройки encoding и sampe_hertz_rate из RecognitionConfig() . Заодно измените код языка на tr-TR, так как tr-ostrich.wav — это запись речи на турецком языке.

config = types.RecognitionConfig(language_code='tr-TR')

Теперь снова запустите speech2text.py . На выходе должен быть текст на турецком языке, поскольку анализировался следующий аудиофайл: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Что происходит?

Вы передали gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav , местоположение аудиофайла в Google Cloud Storage, в speech2text.py , который затем передается как gcs_uri в transcribe_uri()

Давайте подробнее рассмотрим наш модифицированный transcribe_uri() .

def transcribe_gcs(gcs_uri):
    """Transcribes the audio file specified by the gcs_uri."""

    from google.cloud import speech
    # enums no longer used
    # from google.cloud.speech import enums
    from google.cloud.speech import types

    # create ImageAnnotatorClient object
    client = speech.SpeechClient()

    # specify location of speech
    audio = types.RecognitionAudio(uri=gcs_uri)

    # set language to Turkish
    # removed encoding and sample_rate_hertz
    config = types.RecognitionConfig(language_code='tr-TR')

    # get response by passing config and audio settings to client
    response = client.recognize(config, audio)

    # Each result is for a consecutive portion of the audio. Iterate through
    # them to get the transcripts for the entire audio file.
    for result in response.results:
        # The first alternative is the most likely one for this portion.
        # get the transcript of the first alternative
        print(u'Transcript: {}'.format(result.alternatives[0].transcript))

5. Облачный перевод

Python-клиент

Вам понадобится клиент Python для Cloud Translation. Чтобы установить его, введите в Cloud Shell следующее:

sudo pip install --upgrade google-cloud-translate

Давайте попробуем

Теперь давайте посмотрим на примеры кода для Cloud Translation . В рамках этой лабораторной работы нам нужно перевести текст на английский язык. Файл snippets.py выглядит как то, что нам нужно. Скопируйте содержимое snippets.py , создайте новый файл в Cloud Shell с именем translate.py и вставьте весь код в translate.py . Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/translate/cloud-client/snippets.py -o translate.py

После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:

python translate.py translate-text en '你有沒有帶外套'

Перевод должен быть таким: «У тебя есть куртка?».

Что происходит?

Вы передали translate.py 3 аргумента:

  • translate-text выбирает функцию translate_text() для запуска
  • en передается как цель в translate_text() и служит для указания языка, на который нужно перевести
  • «你有沒有帶外套» — это строка, которую нужно перевести, и она передается в виде текста в translate_text()

Давайте подробнее рассмотрим translate_text() . Обратите внимание на добавленные комментарии.

def translate_text(target, text):
    """Translates text into the target language.

    Target must be an ISO 639-1 language code.
    See https://g.co/cloud/translate/v2/translate-reference#supported_languages
    """
    # relevant imports from above
    # from google.cloud import translate
    # import six

    # create Client object
    translate_client = translate.Client()

    # decode text if it's a binary type
    # six is a python 2 and 3 compatibility library
    if isinstance(text, six.binary_type):
        text = text.decode('utf-8')

    # get translation result by passing text and target language to client
    # Text can also be a sequence of strings, in which case this method
    # will return a sequence of results for each text.
    result = translate_client.translate(text, target_language=target)

    # print original text, translated text and detected original language
    print(u'Text: {}'.format(result['input']))
    print(u'Translation: {}'.format(result['translatedText']))
    print(u'Detected source language: {}'.format(
        result['detectedSourceLanguage']))

6. Облачный естественный язык

Python-клиент

Вам понадобится клиент Python для Cloud Natural Language. Для установки введите в командной строке Cloud Shell следующее:

sudo pip install --upgrade google-cloud-language

Давайте попробуем

Наконец, давайте рассмотрим примеры кода для Cloud Natural Language API . Мы хотим обнаруживать сущности в тексте. Похоже, что snippets.py содержит код, который это делает. Скопируйте содержимое snippets.py , создайте новый файл в Cloud Shell с именем natural_language.py и вставьте весь код в natural_language.py . Вы можете сделать это вручную в редакторе кода Cloud Shell или выполнить следующую команду curl в Cloud Shell:

curl https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/language/cloud-client/v1/snippets.py -o natural_language.py

После этого воспользуйтесь API, выполнив следующую команду в Cloud Shell:

python natural_language.py entities-text 'where did you leave my bike'

API должен идентифицировать «велосипед» как сущность. Сущности могут быть как именами собственными (общественные деятели, достопримечательности и т. д.), так и нарицательными (ресторан, стадион и т. д.).

Что происходит?

Вы передали 2 аргумента в natural_language.py :

  • entity-text выбирает функцию entities_text() для запуска
  • «где ты оставил мой велосипед» — это строка, которая анализируется на наличие сущностей и передается как текст в entities_text()

Давайте подробнее рассмотрим entities_text() . Обратите внимание на добавленные новые комментарии.

def entities_text(text):
    """Detects entities in the text."""
    # relevant imports from above
    # from google.cloud import language
    # from google.cloud.language import enums
    # from google.cloud.language import types
    # import six

    # create LanguageServiceClient object
    client = language.LanguageServiceClient()

    # decode text if it's a binary type
    # six is a python 2 and 3 compatibility library
    if isinstance(text, six.binary_type):
        text = text.decode('utf-8')

    # Instantiates a plain text document.
    document = types.Document(
        content=text,
        type=enums.Document.Type.PLAIN_TEXT)

    # Detects entities in the document. You can also analyze HTML with:
    #   document.type == enums.Document.Type.HTML
    entities = client.analyze_entities(document).entities

    # entity types from enums.Entity.Type
    entity_type = ('UNKNOWN', 'PERSON', 'LOCATION', 'ORGANIZATION',
                   'EVENT', 'WORK_OF_ART', 'CONSUMER_GOOD', 'OTHER')

    # print information for each entity found
    for entity in entities:
        print('=' * 20)
        print(u'{:<16}: {}'.format('name', entity.name))
        print(u'{:<16}: {}'.format('type', entity_type[entity.type]))
        print(u'{:<16}: {}'.format('metadata', entity.metadata))
        print(u'{:<16}: {}'.format('salience', entity.salience))
        print(u'{:<16}: {}'.format('wikipedia_url',
              entity.metadata.get('wikipedia_url', '-')))

7. Давайте их интегрируем

Давайте вспомним, что вы строите.

e6a57e5def315116.jpeg

Теперь соберём всё воедино. Создайте файл solution.py ; скопируйте и вставьте detect_labels_uri() , transcribe_gcs() , translate_text() и entities_text() из предыдущих шагов в solution.py .

Импортные заявления

Раскомментируйте и переместите операторы импорта в начало. Обратите внимание, что импортируются как speech.types , так и language.types . Это приведёт к конфликту, поэтому давайте просто удалим их и заменим каждое вхождение types в transcribe_gcs() и entities_text() на speech.types и language.types соответственно. Должно получиться:

from google.cloud import vision
from google.cloud import speech
from google.cloud import translate
from google.cloud import language
from google.cloud.language import enums
import six

Возврат результатов

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

# import statements

def detect_labels_uri(uri):
    # code

    # we only need the label descriptions
    label_descriptions = []
    for label in labels:
        label_descriptions.append(label.description)

    return label_descriptions

def transcribe_gcs(gcs_uri):
    # code

    # naive assumption that audio file is short
    return response.results[0].alternatives[0].transcript

def translate_text(target, text):
    # code

    # only interested in translated text
    return result['translatedText']

def entities_text(text):
    # code

    # we only need the entity names
    entity_names = []
    for entity in entities:
        entity_names.append(entity.name)

    return entity_names

Используйте функции

После всей этой кропотливой работы вы можете вызывать эти функции. Вперёд, делайте это! Вот пример:

def compare_audio_to_image(audio, image):
    """Checks whether a speech audio is relevant to an image."""

    # speech audio -> text
    transcription = transcribe_gcs(audio)

    # text of any language -> english text
    translation = translate_text('en', transcription)

    # text -> entities
    entities = entities_text(translation)

    # image -> labels
    labels = detect_labels_uri(image)

    # naive check for whether entities intersect with labels
    has_match = False
    for entity in entities:
        if entity in labels:
            # print result for each match
            print('The audio and image both contain: {}'.format(entity))
            has_match = True

    # print if there are no matches
    if not has_match:
        print('The audio and image do not appear to be related.')

Поддержка нескольких языков

Ранее мы жёстко закодировали турецкий язык в transcribe_gcs() . Давайте изменим это так, чтобы язык можно было указать в compare_audio_to_image() . Вот необходимые изменения:

def transcribe_gcs(language, gcs_uri):
    ...
    config = speech.types.RecognitionConfig(language_code=language)
def compare_audio_to_image(language, audio, image):
    transcription = transcribe_gcs(language, audio)

Попробуй это

Окончательный код можно найти в файле solution.py этого репозитория GitHub . Вот команда curl для его получения:

curl https://raw.githubusercontent.com/googlecodelabs/integrating-ml-apis/master/solution.py -O

Версия на GitHub содержит argparse, который позволяет выполнять следующие действия из командной строки:

python solution.py tr-TR gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/football.jpg

Для каждого найденного элемента код должен вывести «И аудио, и изображение содержат:». В примере выше это будет «И аудио, и изображение содержат: мяч».

Бонус: попробуйте еще

Вот еще несколько мест расположения аудиофайлов и файлов изображений, которые можно попробовать.

Примеры речи tr-TR: gs://cloud-samples-data/ml-api-codelab/tr-ball.wav gs://cloud-samples-data/ml-api-codelab/tr-bike.wav gs://cloud-samples-data/ml-api-codelab/tr-jacket.wav gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Примеры речи de-DE: gs://cloud-samples-data/ml-api-codelab/de-ball.wav gs://cloud-samples-data/ml-api-codelab/de-bike.wav gs://cloud-samples-data/ml-api-codelab/de-jacket.wav gs://cloud-samples-data/ml-api-codelab/de-ostrich.wav

Примеры изображений: gs://cloud-samples-data/ml-api-codelab/bicycle.jpg gs://cloud-samples-data/ml-api-codelab/birds.jpg gs://cloud-samples-data/ml-api-codelab/coat_rack.jpg gs://cloud-samples-data/ml-api-codelab/football.jpg

8. Поздравляем!

Вы изучили и интегрировали четыре API машинного обучения, чтобы определить, соответствует ли образец речи представленному изображению. Это только начало, и есть ещё много способов улучшить этот конвейер!

Что мы рассмотрели

  • Выполнение запросов к API Cloud Vision
  • Выполнение запросов к API преобразования речи в текст в облаке
  • Выполнение запросов к API облачного перевода
  • Выполнение запросов к API Cloud Natural Language
  • Совместное использование всех вышеперечисленных API

Следующие шаги