Integracja interfejsów API uczenia maszynowego

1. Przegląd

W tym ćwiczeniu z programowania poznasz kilka interfejsów API uczenia maszynowego. Użyjesz:

  • Cloud Vision do analizowania treści obrazu.
  • Cloud Speech-to-Text do transkrypcji dźwięku na tekst.
  • Cloud Translation do tłumaczenia dowolnego ciągu znaków na dowolny obsługiwany język.
  • Cloud Natural Language do wyodrębniania informacji z tekstu.

Co utworzysz

Zbudujesz potok, który porównuje nagranie audio z obrazem i określa ich wzajemną trafność. Oto krótki opis tego, jak to zrobić:

e6a57e5def315116.jpeg

Czego się nauczysz

  • Jak korzystać z interfejsów Vision API, Speech-to-Text API, Translation API i Natural Language API
  • Gdzie znaleźć przykładowe fragmenty kodu

Czego potrzebujesz

  • przeglądarka, np. Chrome lub Firefox;
  • Podstawowa znajomość języka Python

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail lub Google Workspace, musisz je utworzyć.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

  1. Następnie musisz włączyć płatności w Cloud Console, aby móc korzystać z zasobów Google Cloud.

Ukończenie tego laboratorium nie powinno wiązać się z dużymi kosztami, a nawet z żadnymi. Postępuj zgodnie z instrukcjami w sekcji „Czyszczenie”, która zawiera wskazówki dotyczące zamykania zasobów, aby uniknąć opłat po zakończeniu tego samouczka. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Włączanie interfejsów API

Możesz kliknąć ten link, aby włączyć wszystkie niezbędne interfejsy API. Po wykonaniu tych czynności możesz zignorować instrukcje konfigurowania uwierzytelniania. Zrobimy to za chwilę. Możesz też włączyć każdy interfejs API osobno. Aby to zrobić, kliknij ikonę menu w lewym górnym rogu ekranu.

2bfc27ef9ba2ec7d.png

Wybierz Interfejsy API i usługi z menu i kliknij Panel.

a9546a22581facd5.png

Kliknij Włącz interfejsy API i usługi.

eae7ff043d13a35.png

Następnie w polu wyszukiwania wpisz „wzrok”. Kliknij Google Cloud Vision API:

a47893f36372ae2f.png

Aby włączyć interfejs Cloud Vision API, kliknij Włącz:

a24fd082a22030ad.png

Odczekaj kilka sekund, aż się włączy. Gdy ta funkcja będzie włączona, zobaczysz:

633e58cbde1b74c6.png

Powtórz ten sam proces, aby włączyć interfejsy Cloud Speech, Cloud Translation i Cloud Natural Language API.

Cloud Shell

Google Cloud Shell to środowisko wiersza poleceń działające w chmurze. Ta maszyna wirtualna oparta na Debianie zawiera wszystkie potrzebne narzędzia dla programistów (gcloud, bq, git i inne) i oferuje trwały katalog domowy o pojemności 5 GB. Do utworzenia żądania do interfejsów API uczenia maszynowego użyjemy Cloud Shell.

Aby rozpocząć korzystanie z Cloud Shell, kliknij ikonę „Aktywuj Google Cloud Shell” Screen Shot 2015-06-08 at 5.30.32 PM.png w prawym górnym rogu paska nagłówka.

24ef50000ca737a4.png

Sesja Cloud Shell otworzy się w nowej ramce u dołu konsoli, zostanie również wyświetlony monit wiersza poleceń. Poczekaj, aż pojawi się prompt user@project:~$ (użytkownik@projekt:~$).

Opcjonalnie: edytor kodu

Jeśli wolisz korzystać z wiersza poleceń, możesz kliknąć ikonę „Uruchom edytor kodu” b885bf07bc1b02e5.png w prawym górnym rogu paska Cloud Shell.

de00be9278baf7b8.png

Konto usługi

Do uwierzytelnienia będziesz potrzebować konta usługi. Aby utworzyć konto usługi, zastąp [NAME] wybraną nazwą konta usługi i uruchom to polecenie w Cloud Shell:

gcloud iam service-accounts create [NAME]

Teraz musisz wygenerować klucz, aby używać tego konta usługi. Zastąp [FILE_NAME] wybraną nazwą klucza, [NAME] nazwą konta usługi z powyższego przykładu, a [PROJECT_ID] identyfikatorem projektu. Poniższe polecenie utworzy i pobierze klucz w postaci pliku [FILE_NAME].json:

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

Aby używać konta usługi, musisz ustawić zmienną GOOGLE_APPLICATION_CREDENTIALS na ścieżkę do klucza. Aby to zrobić, uruchom to polecenie po zastąpieniu wartości [PATH_TO_FILE] i [FILE_NAME]:

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

3. Cloud Vision

Klient Python

Potrzebujesz klienta Pythona dla Cloud Vision. Aby zainstalować narzędzie, wpisz w Cloud Shell:

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

Wypróbuj

Przyjrzyjmy się przykładowym fragmentom kodu interfejsu Cloud Vision API. Chcemy dowiedzieć się, co znajduje się na określonym obrazie. detect.py wydaje się przydatne w tym przypadku, więc użyjemy tego narzędzia. Jednym ze sposobów jest skopiowanie zawartości pliku detect.py, utworzenie w Cloud Shell nowego pliku o nazwie vision.py i wklejenie do niego całego kodu.vision.py Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:

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

Gdy to zrobisz, użyj interfejsu API, uruchamiając w Cloud Shell to polecenie:

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

Powinny się wyświetlić informacje o ptakach i strusiach, ponieważ to to zdjęcie zostało przeanalizowane: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Co się dzieje?

Do funkcji vision.py przekazano 2 argumenty:

  • labels-uri wybiera funkcję detect_labels_uri() do uruchomienia.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg to lokalizacja obrazu w Google Cloud Storage, która jest przekazywana jako uri do detect_labels_uri()

Przyjrzyjmy się bliżej detect_labels_uri(). Zwróć uwagę na wstawione dodatkowe komentarze.

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. Cloud Speech-to-Text

Klient Pythona

Potrzebujesz klienta Pythona dla Cloud Speech-to-Text. Aby zainstalować narzędzie, wpisz w Cloud Shell:

sudo pip install --upgrade google-cloud-speech

Wypróbuj

Przejdźmy do przykładowego kodu Cloud Speech-to-Text. Chcemy transkrybować dźwięk mowy. transcribe.py wydaje się dobrym miejscem na początek, więc użyjemy tej opcji. Skopiuj zawartość pliku transcribe.py, utwórz w Cloud Shell nowy plik o nazwie speech2text.py i wklej do niego cały kod.speech2text.py Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:

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

Gdy to zrobisz, użyj interfejsu API, uruchamiając w Cloud Shell to polecenie:

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

Powinny pojawić się błędy dotyczące nieprawidłowego kodowania i częstotliwości próbkowania w hercach. Nie martw się, przejdź do transcribe_gcs() w kodzie i usuń ustawienia encodingsampe_hertz_rateRecognitionConfig(). Przy okazji zmień kod języka na „tr-TR”, ponieważ tr-ostrich.wav to nagranie mowy w języku tureckim.

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

Teraz ponownie uruchom speech2text.py. Dane wyjściowe powinny zawierać tekst w języku tureckim, ponieważ analizowany był dźwięk w tym języku: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Co się dzieje?

Przekazano gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav, czyli lokalizację pliku audio w Google Cloud Storage, do speech2text.py, który jest następnie przekazywany jako gcs_uri do transcribe_uri()

Przyjrzyjmy się bliżej zmodyfikowanemu 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. Cloud Translation

Klient Pythona

Potrzebujesz klienta Pythona dla Cloud Translation. Aby zainstalować narzędzie, wpisz w Cloud Shell:

sudo pip install --upgrade google-cloud-translate

Wypróbuj

Teraz zapoznaj się z przykładami kodu Cloud Translation. W tym ćwiczeniu chcemy przetłumaczyć tekst na język angielski. snippets.py wygląda na to, czego szukamy. Skopiuj zawartość pliku snippets.py, utwórz w Cloud Shell nowy plik o nazwie translate.py i wklej do niego cały kod.translate.py Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:

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

Gdy to zrobisz, użyj interfejsu API, uruchamiając w Cloud Shell to polecenie:

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

Tłumaczenie powinno brzmieć „Do you have a jacket?”.

Co się dzieje?

Do funkcji translate.py przekazano 3 argumenty:

  • translate-text wybiera funkcję translate_text() do uruchomienia.
  • en jest przekazywany jako target do translate_text() i określa język, na który ma zostać przetłumaczony tekst.
  • ‘你有沒有帶外套' to ciąg znaków do przetłumaczenia, który jest przekazywany jako text do translate_text()

Przyjrzyjmy się bliżej translate_text(). Zwróć uwagę na dodane komentarze.

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. Cloud Natural Language

Klient Pythona

Potrzebujesz klienta Pythona dla Cloud Natural Language. Aby zainstalować narzędzie, wpisz w Cloud Shell:

sudo pip install --upgrade google-cloud-language

Wypróbuj

Na koniec przyjrzyjmy się przykładowym kodom interfejsu Cloud Natural Language API. Chcemy wykryć w tekście fragmenty. snippets.py zawiera kod, który to umożliwia. Skopiuj zawartość pliku snippets.py, utwórz w Cloud Shell nowy plik o nazwie natural_language.py i wklej do niego cały kod.natural_language.py Możesz to zrobić ręcznie w edytorze kodu Cloud Shell lub uruchomić to polecenie curl w Cloud Shell:

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

Gdy to zrobisz, użyj interfejsu API, uruchamiając w Cloud Shell to polecenie:

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

Interfejs API powinien identyfikować „rower” jako jednostkę. Elementy mogą być rzeczownikami własnymi (osoby publiczne, punkty orientacyjne itp.) lub rzeczownikami pospolitymi (restauracja, stadion itp.).

Co się dzieje?

Do funkcji natural_language.py przekazano 2 argumenty:

  • entities-text wybiera funkcję entities_text() do uruchomienia.
  • „gdzie zostawiłeś mój rower” to ciąg znaków, który ma zostać przeanalizowany pod kątem encji. Jest on przekazywany jako tekst do entities_text().

Przyjrzyjmy się bliżej entities_text(). Zwróć uwagę na nowe wstawione komentarze.

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. Zintegrujmy je

Przypomnijmy sobie, co tworzysz.

e6a57e5def315116.jpeg

Teraz połączmy wszystkie elementy. Utwórz plik solution.py, a następnie skopiuj i wklej do niego wartości detect_labels_uri(), transcribe_gcs(), translate_text() i entities_text() z poprzednich kroków.solution.py

Importowanie wyciągów

Odkomentuj instrukcje importu i przenieś je na początek. Pamiętaj, że importowane są zarówno plik speech.types, jak i plik language.types. Spowoduje to konflikt, więc usuńmy je i zmieńmy każde wystąpienie znaku typestranscribe_gcs()entities_text() na odpowiednio speech.typeslanguage.types. Powinny pozostać:

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

Wyniki zwrotu

Zamiast drukowania niech funkcje zwracają wyniki. Powinien pojawić się tekst podobny do tego:

# 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

Korzystanie z funkcji

Po wykonaniu tych wszystkich czynności możesz wywołać te funkcje. Śmiało, zrób to! Oto przykład:

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.')

Obsługa wielu języków

Wcześniej na stałe zakodowaliśmy język turecki w transcribe_gcs(). Zmieńmy to, aby język można było określać w compare_audio_to_image(). Wymagane zmiany:

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)

Wypróbuj

Ostateczny kod znajdziesz w pliku solution.pytym repozytorium GitHub. Oto polecenie curl, które umożliwia pobranie tych informacji:

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

Wersja w GitHubie zawiera moduł argparse, który umożliwia wykonanie w wierszu poleceń tych czynności:

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

W przypadku każdego znalezionego elementu kod powinien wyświetlać komunikat „The audio and image both contain: ” (Dźwięk i obraz zawierają:). W przykładzie powyżej będzie to „The audio and image both contain: ball” (Dźwięk i obraz zawierają: piłka).

Bonus: wypróbuj więcej

Oto więcej lokalizacji plików audio i obrazów, które możesz wypróbować.

Próbki mowy w języku tureckim:gs://cloud-samples-data/ml-api-codelab/tr-ball.wavgs://cloud-samples-data/ml-api-codelab/tr-bike.wavgs://cloud-samples-data/ml-api-codelab/tr-jacket.wavgs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav

Próbki mowy w języku niemieckim:gs://cloud-samples-data/ml-api-codelab/de-ball.wavgs://cloud-samples-data/ml-api-codelab/de-bike.wavgs://cloud-samples-data/ml-api-codelab/de-jacket.wavgs://cloud-samples-data/ml-api-codelab/de-ostrich.wav

Przykładowe obrazy:gs://cloud-samples-data/ml-api-codelab/bicycle.jpggs://cloud-samples-data/ml-api-codelab/birds.jpggs://cloud-samples-data/ml-api-codelab/coat_rack.jpggs://cloud-samples-data/ml-api-codelab/football.jpg

8. Gratulacje!

Poznaliśmy i zintegrowaliśmy 4 interfejsy API systemów uczących się, aby określić, czy próbka mowy dotyczy podanego obrazu. To dopiero początek, ponieważ ten proces można jeszcze ulepszyć na wiele sposobów.

Omówione zagadnienia

  • Wysyłanie żądań do interfejsu Cloud Vision API
  • Wysyłanie żądań do interfejsu Cloud Speech-to-Text API
  • Wysyłanie żądań do interfejsu Cloud Translation API
  • Wysyłanie żądań do interfejsu Cloud Natural Language API
  • Korzystanie ze wszystkich powyższych interfejsów API

Następne kroki