Python ile Vision API'yi kullanma

1. Genel Bakış

5ab7829fc22b21c4.png

Vision API, geliştiricilerin görüntü etiketleme, yüz ve önemli nokta algılama, optik karakter tanıma (OCR) ve uygunsuz içeriği etiketleme gibi görme algılama özelliklerini uygulamalara kolayca entegre etmelerine olanak tanır.

Bu eğiticide, Python ile Vision API'yi kullanmaya odaklanacaksınız.

Neler öğreneceksiniz?

  • Ortamınızı ayarlama
  • Etiket algılama nasıl yapılır?
  • Metin algılama nasıl yapılır?
  • Önemli nokta algılama işlemi nasıl yapılır?
  • Yüz algılama nasıl yapılır?
  • Nesne algılama nasıl yapılır?

Gerekenler

  • Bir Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Python kullanımı hakkında bilgi

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Cloud hizmetleriyle ilgili deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Ortam kurulumu

Vision API'yi kullanmaya başlamadan önce API'yi etkinleştirmek için Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud services enable vision.googleapis.com

Aşağıdakine benzer bir tablo görürsünüz:

Operation "operations/..." finished successfully.

Artık Vision API'yi kullanabilirsiniz.

Ana dizininize gidin:

cd ~

Bağımlılıkları izole etmek için bir Python sanal ortamı oluşturun:

virtualenv venv-vision

Sanal ortamı etkinleştirin:

source venv-vision/bin/activate

IPython ve Vision API istemci kitaplığını yükleyin:

pip install ipython google-cloud-vision

Aşağıdakine benzer bir tablo görürsünüz:

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

Artık Vision API istemci kitaplığını kullanmaya hazırsınız.

Sonraki adımlarda, önceki adımda yüklediğiniz IPython adlı etkileşimli bir Python yorumlayıcısını kullanacaksınız. Cloud Shell'de ipython çalıştırarak oturum başlatın:

ipython

Aşağıdakine benzer bir tablo görürsünüz:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

İlk isteğinizi göndermeye hazırsınız...

4. Etiket algılama

Vision API'nin temel özelliklerinden biri, görüntüdeki nesneleri veya varlıkları tanımlamak için etiket ek açıklaması olarak bilinir. Etiket algılama; genel nesneleri, konumları, etkinlikleri, hayvan türlerini, ürünleri ve daha fazlasını tanımlar. Vision API, bir giriş görüntüsünü alır ve söz konusu görüntü için geçerli olan en olası etiketleri döndürür. En iyi eşleşen etiketleri, resimle eşleşmenin güven puanıyla birlikte döndürür.

Bu örnekte, Tokyo'nun popüler bölgelerinden biri olan Setagaya'nın bir görüntüsü (Alex Knight'ın izniyle) üzerinde etiket algılama işlemi gerçekleştireceksiniz:

756f97f0b1e46c38.jpeg

Aşağıdaki kodu IPython oturumunuza kopyalayın:

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

Biraz zaman ayırarak kodu inceleyin ve kodu, verilen bir dizi özellik için bir resim analiz etmek üzere annotate_image istemci kitaplığı yöntemini nasıl kullandığını görün.

LABEL_DETECTION özelliğini kullanarak istek gönderin:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

Çıkış şöyle olmalıdır:

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

Çevrimiçi demoda sonuçlar şu şekilde sunulmaktadır:

2191b0425c9c148f.png

Özet

Bu adımda, bir görüntü üzerinde etiket algılamayı başardınız ve söz konusu görüntüyle ilişkili en olası etiketleri gösterdiniz. Etiket algılama hakkında daha fazla bilgi edinin.

5. Metin algılama işlemi gerçekleştir

Metin algılama, Optik Karakter Tanıma (OCR) özelliğini gerçekleştirir. Çok çeşitli dilleri destekleyen bu çözüm, resimlerdeki metinleri tespit edip ayıklar. Ayrıca otomatik dil tanımlama özelliği de vardır.

Bu örnekte, bir trafik işareti resmi üzerinde metin algılama işlemi gerçekleştireceksiniz:

4dedd3fcfd9ad99b.jpeg

Aşağıdaki kodu IPython oturumunuza kopyalayın:

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

TEXT_DETECTION özelliğini kullanarak istek gönderin:

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

Çıkış şöyle olmalıdır:

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

Çevrimiçi demoda sonuçlar şu şekilde sunulmaktadır:

9c70fbce871c5fe5.png

Özet

Bu adımda, bir resim üzerinde metin algılamayı başardınız ve resimdeki tanınan metni gösterdiniz. Metin algılama hakkında daha fazla bilgi edinin.

6. Önemli nokta algılaması gerçekleştirme

Önemli nokta algılama özelliği, bir görüntüdeki doğal ve insan yapımı popüler yapıları algılar.

Bu örnekte, Eyfel Kulesi'nin bir görüntüsü (John Towner'ın izniyle) üzerinde önemli nokta algılama işlemi gerçekleştireceksiniz:

fb7801e36884b875.jpeg

Aşağıdaki kodu IPython oturumunuza kopyalayın:

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

LANDMARK_DETECTION özelliğini kullanarak istek gönderin:

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

Çıkış şöyle olmalıdır:

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

Çevrimiçi demoda sonuçlar şu şekilde sunulmaktadır:

2788697365670985.png

Özet

Bu adımda, Eyfel Kulesi'nin bir resmi üzerinde önemli nokta algılama işlemi gerçekleştirdiniz. Önemli nokta algılama hakkında daha fazla bilgi edinin.

7. Yüz algılama işlemi gerçekleştir

Yüz özelliklerini algılama özelliği, görüntüdeki birden çok yüzü ve duygusal durum veya şapka takmak gibi ilişkili önemli yüz özelliklerini algılar.

Bu örnekte, şu resimde bulunan yüzleri tespit edebilirsiniz (Himanshu Singh Gurjar'ın izniyle):

58c578ece524cf32.jpeg

Aşağıdaki kodu IPython oturumunuza kopyalayın:

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

FACE_DETECTION özelliğini kullanarak istek gönderin:

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

Çıkış şöyle olmalıdır:

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

Çevrimiçi demoda sonuçlar şu şekilde sunulmaktadır:

cbb7f59299651b83.png

Özet

Bu adımda yüz algılama işlemi gerçekleştirdiniz. Yüz algılama hakkında daha fazla bilgi edinin.

8. Nesne algılama

Bu örnekte, nesne algılama işlemini Setagaya'nın önceki görüntüsü üzerinde (Alex Knight'ın izniyle) gerçekleştireceksiniz:

756f97f0b1e46c38.jpeg

Aşağıdaki kodu IPython oturumunuza kopyalayın:

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

OBJECT_LOCALIZATION özelliğini kullanarak istek gönderin:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

Çıkış şöyle olmalıdır:

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

Çevrimiçi demoda sonuçlar şu şekilde sunulmaktadır:

e1c2ca803d874a6b.png

Özet

Bu adımda nesne algılama işlemi gerçekleştirdiniz. Nesne algılama hakkında daha fazla bilgi edinin.

9. Birden çok özellik

Vision API'nin bazı özelliklerinin nasıl kullanılacağını gördünüz ancak daha pek çok özellik bulunuyor ve tek bir istekte birden çok özellik isteyebilirsiniz.

Tüm analizleri bir kerede almak için yapabileceğiniz istek türü:

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

Ayrıca, bir grup görüntü üzerinde eşzamanlı veya eşzamansız olarak algılamalar gerçekleştirmek gibi daha fazla olasılık vardır. Tüm "Nasıl Yapılır?" kılavuzlarına göz atın.

10. Tebrikler!

5ab7829fc22b21c4.png

Vision API'yi Python ile kullanmayı öğrendiniz ve birkaç görüntü algılama özelliğini test ettiniz.

Temizleme

Geliştirme ortamınızı temizlemek için Cloud Shell'den:

  • Hâlâ IPython oturumunuzdaysanız kabuğa geri dönün: exit
  • Python sanal ortamını kullanmayı bırakın: deactivate
  • Sanal ortam klasörünüzü silin: cd ~ ; rm -rf ./venv-vision

Google Cloud projenizi Cloud Shell'den silmek için:

  • Geçerli proje kimliğinizi alın: PROJECT_ID=$(gcloud config get-value core/project)
  • Silmek istediğiniz projenin bu proje olduğundan emin olun: echo $PROJECT_ID
  • Projeyi silin: gcloud projects delete $PROJECT_ID

Daha Fazla Bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.