Makine öğrenimi API'lerini entegre etme

1. Genel Bakış

Bu codelab'de, birkaç makine öğrenimi API'si hakkında kısa bir tur yapacaksınız. Kullanacağınız araçlar:

  • Resim içeriğini anlamak için Cloud Vision
  • Sesi metne dönüştürmek için Cloud Speech-to-Text
  • Rastgele bir dizeyi desteklenen herhangi bir dile çevirmek için Cloud Translation
  • Metinden bilgi ayıklamak için Cloud Natural Language

Ne oluşturacaksınız?

Ses kaydını görüntüyle karşılaştırıp birbirleriyle alaka düzeylerini belirleyen bir işlem hattı oluşturacaksınız. Bu işlemi nasıl yapacağınızla ilgili kısa bir önizleme:

e6a57e5def315116.jpeg

Neler öğreneceksiniz?

  • Vision, Speech-to-Text, Translation ve Natural Language API'lerini kullanma
  • Kod örneklerini bulma

İhtiyacınız olanlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Python hakkında temel bilgiler

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Henüz bir Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. "Temizleme" bölümündeki, kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan talimatları uyguladığınızdan emin olun. Böylece bu eğitimin ötesinde faturalandırma yapılması önlenir. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

API'leri etkinleştirme

Gerekli tüm API'leri etkinleştirmek için bu bağlantıyı tıklayabilirsiniz. Bu işlemi yaptıktan sonra kimlik doğrulamayı ayarlama talimatlarını göz ardı edebilirsiniz. Bu işlemi birazdan yapacağız. Alternatif olarak, her API'yi ayrı ayrı etkinleştirebilirsiniz. Bunu yapmak için ekranın sol üst kısmındaki menü simgesini tıklayın.

2bfc27ef9ba2ec7d.png

Açılır menüden API'ler ve hizmetler'i seçip Kontrol Paneli'ni tıklayın.

a9546a22581facd5.png

API'leri ve hizmetleri etkinleştir'i tıklayın.

eae7ff043d13a35.png

Ardından, arama kutusunda "görüş"ü arayın. Google Cloud Vision API'yi tıklayın:

a47893f36372ae2f.png

Cloud Vision API'yi etkinleştirmek için Etkinleştir'i tıklayın:

a24fd082a22030ad.png

Etkinleşmesi için birkaç saniye bekleyin. Etkinleştirildikten sonra şunları görürsünüz:

633e58cbde1b74c6.png

Cloud Speech, Cloud Translation ve Cloud Natural Language API'lerini etkinleştirmek için aynı işlemi tekrarlayın.

Cloud Shell

Google Cloud Shell, Cloud'da çalışan bir komut satırı ortamıdır. Bu Debian tabanlı sanal makine, ihtiyaç duyacağınız tüm geliştirme araçları (gcloud, bq, git ve diğerleri) yüklü olarak gelir ve 5 GB kalıcı ana dizin sunar. Makine öğrenimi API'lerine yönelik isteğimizi oluşturmak için Cloud Shell'i kullanacağız.

Cloud Shell'i kullanmaya başlamak için başlık çubuğunun sağ üst köşesindeki "Google Cloud Shell'i etkinleştir" Screen Shot 2015-06-08 at 5.30.32 PM.png simgesini tıklayın.

24ef50000ca737a4.png

Konsolun altındaki yeni bir çerçevede Cloud Shell oturumu açılır ve komut satırı istemi görüntülenir. user@project:~$ istemi görünene kadar bekleyin.

İsteğe bağlı: Kod Düzenleyici

Komut satırını kullanma konusunda kendinizi ne kadar rahat hissettiğinize bağlı olarak Cloud Shell çubuğunun sağ üst köşesindeki "Launch Code Editor" (Kod Düzenleyiciyi Başlat) simgesini b885bf07bc1b02e5.png tıklayabilirsiniz.

de00be9278baf7b8.png

Hizmet Hesabı

Kimlik doğrulaması yapmak için hizmet hesabına ihtiyacınız vardır. Bir tane oluşturmak için [NAME] yerine hizmet hesabının istediğiniz adını girin ve Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud iam service-accounts create [NAME]

Şimdi bu hizmet hesabını kullanmak için bir anahtar oluşturmanız gerekir. [FILE_NAME] değerini anahtarın istediğiniz adıyla, [NAME] değerini yukarıdaki hizmet hesabı adıyla ve [PROJECT_ID] değerini projenizin kimliğiyle değiştirin. Aşağıdaki komut, anahtarı [FILE_NAME].json olarak oluşturup indirir:

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

Hizmet hesabını kullanmak için GOOGLE_APPLICATION_CREDENTIALS değişkenini anahtarın yolu olarak ayarlamanız gerekir. Bunu yapmak için [PATH_TO_FILE] ve [FILE_NAME] değerlerini değiştirdikten sonra aşağıdaki komutu çalıştırın:

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

3. Cloud Vision

Python istemcisi

Cloud Vision için Python istemcisine ihtiyacınız vardır. Yüklemek için Cloud Shell'e aşağıdakileri yazın:

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

Deneyelim

Cloud Vision API'nin kod örneklerine göz atalım. Belirtilen bir resimde ne olduğunu öğrenmek istiyoruz. detect.py bu konuda faydalı olabilir. Bir yöntem, detect.py dosyasının içeriğini kopyalamak, Cloud Shell'de vision.py adlı yeni bir dosya oluşturmak ve tüm kodu vision.py dosyasına yapıştırmaktır. Bu işlemi Cloud Shell kod düzenleyicide manuel olarak yapabilir veya Cloud Shell'de şu curl komutunu çalıştırabilirsiniz:

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

Bu işlemi yaptıktan sonra Cloud Shell'de aşağıdakileri çalıştırarak API'yi kullanın:

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

Analiz edilen resim şu olduğundan kuşlar ve deve kuşları hakkında bir çıktı görmeniz gerekir: https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/birds.jpg

Neler oluyor?

vision.py işlevine 2 bağımsız değişken ilettiniz:

  • labels-uri, çalıştırılacak detect_labels_uri() işlevini seçer.
  • gs://cloud-samples-data/ml-api-codelab/birds.jpg, Google Cloud Storage'daki bir resmin konumudur ve detect_labels_uri() içine uri olarak iletilir.

detect_labels_uri() daha yakından inceleyelim. Eklenen ek yorumları inceleyin.

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

Python istemcisi

Cloud Speech-to-Text için Python istemcisine ihtiyacınız vardır. Yüklemek için Cloud Shell'e aşağıdakileri yazın:

sudo pip install --upgrade google-cloud-speech

Deneyelim

Cloud Speech-to-Text kod örneklerine gidelim. Konuşma sesini metne dönüştürmek istiyoruz. transcribe.py, başlamak için iyi bir yer gibi görünüyor. O yüzden bunu kullanalım. transcribe.py dosyasının içeriğini kopyalayın, Cloud Shell'de speech2text.py adlı yeni bir dosya oluşturun ve tüm kodu speech2text.py dosyasına yapıştırın. Bu işlemi Cloud Shell kod düzenleyicide manuel olarak yapabilir veya Cloud Shell'de şu curl komutunu çalıştırabilirsiniz:

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

Bu işlemi yaptıktan sonra Cloud Shell'de aşağıdakileri çalıştırarak API'yi kullanın:

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

Yanlış kodlama ve örnek hertz hızıyla ilgili hatalar olmalıdır. Endişelenmeyin, kodda transcribe_gcs() bölümüne gidin ve encoding ile sampe_hertz_rate ayarlarını RecognitionConfig() bölümünden silin. Ayrıca, tr-ostrich.wav Türkçe bir konuşma kaydı olduğundan dil kodunu "tr-TR" olarak değiştirin.

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

Şimdi speech2text.py komutunu tekrar çalıştırın. Analiz edilen ses https://storage.googleapis.com/cloud-samples-data/ml-api-codelab/tr-ostrich.wav olduğundan çıkış, Türkçe bir metin olmalıdır.

Neler değişiyor?

Google Cloud Storage'daki bir ses dosyasının konumu olan gs://cloud-samples-data/ml-api-codelab/tr-ostrich.wav dosyasını speech2text.py'ye ilettiniz. Bu dosya daha sonra transcribe_uri()'ye gcs_uri olarak iletildi.

Değiştirilmiş transcribe_uri() öğemize daha yakından bakalım.

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

Python istemcisi

Cloud Translation için Python istemcisine ihtiyacınız vardır. Yüklemek için Cloud Shell'e aşağıdakileri yazın:

sudo pip install --upgrade google-cloud-translate

Deneyelim

Şimdi de Cloud Translation için kod örneklerine göz atalım. Bu codelab'in amacı doğrultusunda metni İngilizceye çevirmek istiyoruz. snippets.py istediğimiz gibi görünüyor. snippets.py dosyasının içeriğini kopyalayın, Cloud Shell'de translate.py adlı yeni bir dosya oluşturun ve tüm kodu translate.py dosyasına yapıştırın. Bu işlemi Cloud Shell kod düzenleyicide manuel olarak yapabilir veya Cloud Shell'de şu curl komutunu çalıştırabilirsiniz:

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

Bu işlemi yaptıktan sonra Cloud Shell'de aşağıdakileri çalıştırarak API'yi kullanın:

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

Çeviri "Ceketiniz var mı?" olmalıdır.

Neler değişiyor?

translate.py işlevine 3 bağımsız değişken ilettiniz:

  • translate-text, çalıştırılacak translate_text() işlevini seçer.
  • en, translate_text()'e target olarak iletilir ve çevrilecek dili belirtmek için kullanılır.
  • ‘你有沒有帶外套' çevrilecek dizedir ve translate_text()'e metin olarak iletilir.

translate_text() daha yakından inceleyelim. Eklenen yorumları inceleyin.

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

Python istemcisi

Cloud Natural Language için Python istemcisine ihtiyacınız vardır. Yüklemek için Cloud Shell'e aşağıdakileri yazın:

sudo pip install --upgrade google-cloud-language

Deneyelim

Son olarak, Cloud Natural Language API'nin kod örneklerine bakalım. Metindeki varlıkları tespit etmek istiyoruz. snippets.py, bunu yapan bir kod içeriyor gibi görünüyor. snippets.py dosyasının içeriğini kopyalayın, Cloud Shell'de natural_language.py adlı yeni bir dosya oluşturun ve tüm kodu natural_language.py dosyasına yapıştırın. Bu işlemi Cloud Shell kod düzenleyicide manuel olarak yapabilir veya Cloud Shell'de şu curl komutunu çalıştırabilirsiniz:

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

Bu işlemi yaptıktan sonra Cloud Shell'de aşağıdakileri çalıştırarak API'yi kullanın:

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

API, "bisiklet"i bir öğe olarak tanımlamalıdır. Varlıklar özel isimler (kamuya mal olmuş kişiler, önemli noktalar vb.) veya genel isimler (restoran, stadyum vb.) olabilir.

Neler değişiyor?

natural_language.py işlevine 2 bağımsız değişken ilettiniz:

  • entities-text, çalıştırılacak entities_text() işlevini seçer.
  • "Bisikletimi nereye bıraktın?", varlıklar için analiz edilecek dizedir ve entities_text() içine text olarak iletilir.

entities_text() daha yakından inceleyelim. Eklenen yeni yorumları inceleyin.

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. Entegre Edelim

Ne geliştirdiğinizi hatırlayalım.

e6a57e5def315116.jpeg

Şimdi her şeyi bir araya getirelim. solution.py dosyası oluşturun; önceki adımlarda detect_labels_uri(), transcribe_gcs(), translate_text() ve entities_text() değerlerini kopyalayıp solution.py dosyasına yapıştırın.

Ekstreleri içe aktarma

İçe aktarma ifadelerinin yorumunu kaldırın ve bunları en üste taşıyın. Hem speech.types hem de language.types öğesinin içe aktarıldığını unutmayın. Bu durum çakışmaya neden olacağından bunları kaldırıp types, transcribe_gcs() ve entities_text() karakterlerinin her birini sırasıyla speech.types ve language.types olarak değiştirelim. Şunlar kalır:

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

İade sonuçları

Yazdırmak yerine işlevlerin sonuçları döndürmesini sağlayın. Aşağıdakine benzer bir ifade görmeniz gerekir:

# 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

İşlevleri kullanma

Tüm bu zorlu çalışmanın ardından bu işlevleri çağırabilirsiniz. Haydi, yapın! Aşağıda bununla ilgili bir örnek verilmiştir:

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

Birden fazla dili destekleme

Daha önce transcribe_gcs() içine Türkçe'yi sabit kodlamıştık. Bunu, dilin compare_audio_to_image() üzerinden belirtilebileceği şekilde değiştirelim. Gerekli değişiklikler şunlardır:

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)

Deneyin

Son kodu bu GitHub deposunun solution.py dosyasında bulabilirsiniz. Bunu almak için curl komutu:

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

GitHub'daki sürümde, komut satırından aşağıdakilerin yapılmasına olanak tanıyan argparse bulunur:

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

Bulunan her öğe için kod, "Ses ve görüntüde şunlar var: " ifadesini vermelidir. Yukarıdaki örnekte bu ifade "Ses ve görüntüde şunlar var: top" olur.

Bonus: Daha fazla deneme

Deneyebileceğiniz diğer ses ve resim dosyası konumlarını aşağıda bulabilirsiniz.

tr-TR konuşma örnekleri: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

de-DE konuşma örnekleri: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

Resim örnekleri: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. Tebrikler!

Bir konuşma örneğinin, sağlanan resim hakkında konuşup konuşmadığını belirlemek için dört makine öğrenimi API'sini inceleyip entegre ettiniz. Bu, yalnızca başlangıç. Bu işlem hattının iyileştirilebileceği daha birçok yol var.

İşlediğimiz konular

  • Cloud Vision API'ye istek gönderme
  • Cloud Speech-to-Text API'ye istek gönderme
  • Cloud Translation API'ye istek gönderme
  • Cloud Natural Language API'ye istek gönderme
  • Yukarıdaki tüm API'leri birlikte kullanma

Sonraki Adımlar