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

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

О практической работе

subjectПоследнее обновление: июн. 30, 2021
account_circleАвторы: Torry Yang

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

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

a47893f36372ae2f.png

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

a24fd082a22030ad.png

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

633e58cbde1b74c6.png

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

Облачная оболочка

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

Чтобы начать работу с Cloud Shell, нажмите «Активировать Google Cloud Shell». Снимок экрана 08.06.2015, 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] на идентификатор вашего проекта. Следующая команда создаст и загрузит ключ как [ИМЯ_ФАЙЛА].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. Для установки введите в облачную оболочку следующее:

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

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

Давайте взглянем на примеры кода для Cloud Vision API . Мы заинтересованы в том, чтобы узнать, что находится на указанном изображении. 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

В чем дело?

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

  • 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. Для установки введите в облачную оболочку следующее:

sudo pip install --upgrade google-cloud-speech

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

Давайте перейдем к примерам кода для Cloud Speech-to-Text . Мы заинтересованы в расшифровке аудио речи. transcribe.py выглядит хорошим местом для начала, так что давайте воспользуемся им. Скопируйте содержимое transscribe.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 в 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 '你有沒有帶外套'

Перевод должен быть "У тебя есть куртка?".

В чем дело?

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

  • 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. Для установки введите в облачную оболочку следующее:

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() и entity_text entities_text() из предыдущих шагов в solution.py .

Операторы импорта

Раскомментируйте и переместите операторы импорта наверх. Обратите внимание, что импортируются как speech.types , так и language.types . Это вызовет конфликт, поэтому давайте просто удалим их и изменим каждое отдельное вхождение types в transscribe_gcs( transcribe_gcs() и entity_text 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

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

Бонус: попробуйте больше

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

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

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

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

  • Выполнение запросов к API Cloud Vision
  • Выполнение запросов к Cloud Speech-to-Text API
  • Выполнение запросов к Cloud Translation API
  • Выполнение запросов к Cloud Natural Language API
  • Использование всех вышеперечисленных API вместе

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