Korzystanie z interfejsu Vision API w Pythonie

1. Omówienie

5ab7829fc22b21c4.png

Interfejs Vision API umożliwia programistom łatwą integrację w aplikacjach funkcji związanych z wykrywaniem wzroku, takich jak dodawanie etykiet do obrazów, wykrywanie twarzy i punktów orientacyjnych, optyczne rozpoznawanie znaków (OCR) oraz oznaczanie treści dla dorosłych.

W tym samouczku skupisz się na używaniu interfejsu Vision API w Pythonie.

Czego się nauczysz

  • Jak skonfigurować środowisko
  • Jak wykrywać etykiety
  • Jak wykryć tekst?
  • Jak wykryć punkt orientacyjny
  • Jak wykrywać twarze?
  • Jak wykrywać obiekty?

Czego potrzebujesz

  • Projekt Google Cloud
  • przeglądarki, na przykład Chrome lub Firefox;
  • znajomość języka Python,

Ankieta

Jak wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z językiem Python?

Początkujący Poziom średnio zaawansowany Biegły

Jak oceniasz usługi Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Cloud Shell – środowisko wiersza poleceń działające w Cloud.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list 

Dane wyjściowe polecenia

 Credentialed Accounts ACTIVE  ACCOUNT *       <my_account>@<my_domain.com>  To set the active account, run:     $ gcloud config set account `ACCOUNT` 
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project 

Dane wyjściowe polecenia

[core] project = <PROJECT_ID> 

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID> 

Dane wyjściowe polecenia

Updated property [core/project]. 

3. Konfiguracja środowiska

Zanim zaczniesz korzystać z interfejsu Vision API, uruchom w Cloud Shell to polecenie, aby go włączyć:

gcloud services enable vision.googleapis.com 

Powinien pojawić się ekran podobny do tego:

Operation "operations/..." finished successfully. 

Teraz możesz używać interfejsu Vision API.

Przejdź do katalogu głównego:

cd ~ 

Utwórz środowisko wirtualne Pythona, aby wyizolować zależności:

virtualenv venv-vision 

Aktywuj środowisko wirtualne:

source venv-vision/bin/activate 

Zainstaluj program IPython i bibliotekę klienta Vision API:

pip install ipython google-cloud-vision 

Powinien pojawić się ekran podobny do tego:

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

Możesz teraz korzystać z biblioteki klienta Vision API.

W następnych krokach użyjesz interaktywnego interpretera Pythona o nazwie IPython, który został zainstalowany w poprzednim kroku. Rozpocznij sesję od uruchomienia ipython w Cloud Shell:

ipython 

Powinien pojawić się ekran podobny do tego:

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]: 

Możesz złożyć pierwszą prośbę...

4. Wykrywanie etykiet

Jedną z głównych funkcji Vision API jest identyfikowanie obiektów na obrazach, nazywanych adnotacjami etykiet. Wykrywanie etykiet identyfikuje ogólne obiekty, lokalizacje, aktywności, gatunki zwierząt, produkty i nie tylko. Interfejs Vision API pobiera obraz wejściowy i zwraca najbardziej prawdopodobne etykiety, które mają zastosowanie do tego obrazu. Zwraca listę najbardziej pasujących etykiet wraz z współczynnikiem ufności dopasowania do obrazu.

W tym przykładzie przeprowadzimy wykrywanie etykiet na zdjęciu (udostępnionym dzięki uprzejmości Alexa Knighta) w popularnej dzielnicy Setagaya w Tokio:

756f97f0b1e46c38.jpeg

Skopiuj ten kod do sesji IPython:

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=" | ",         )          

Poświęć chwilę na zapoznanie się z kodem i zobacz, jak za pomocą metody z biblioteki klienta annotate_image analizuje obraz pod kątem określonych funkcji.

Wyślij prośbę, używając funkcji LABEL_DETECTION:

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) 

Powinien pojawić się następujący wynik:

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

Oto w jaki sposób wyniki są prezentowane w ramach demonstracji online:

2191b0425c9c148f.png

Podsumowanie

W tym kroku udało nam się wykryć etykiety na obrazie i wyświetlić najbardziej prawdopodobne etykiety powiązane z tym obrazem. Dowiedz się więcej o wykrywaniu etykiet.

5. Wykrywanie tekstu

Funkcja optycznego rozpoznawania znaków (OCR) umożliwia wykrywanie tekstu. Wykrywa i wyodrębnia na obrazie tekst z obsługą wielu języków. Jest też wyposażony w automatyczną identyfikację języków.

W tym przykładzie wdrożymy wykrywanie tekstu na obrazie znaku drogowego:

4dedd3fcfd9ad99b.jpeg

Skopiuj ten kod do sesji IPython:

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=" | ",         )          

Wyślij prośbę, używając funkcji TEXT_DETECTION:

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) 

Powinien pojawić się następujący wynik:

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

Oto w jaki sposób wyniki są prezentowane w ramach demonstracji online:

9c70fbce871c5fe5.png

Podsumowanie

W tym kroku udało nam się wykryć tekst na obrazie i wyświetlić rozpoznany na nim tekst. Dowiedz się więcej o wykrywaniu tekstu.

6. Wykrywanie punktów orientacyjnych

Funkcja wykrywania punktów orientacyjnych wykrywa na zdjęciu popularne obiekty naturalne i stworzone przez człowieka.

W tym przykładzie:

fb7801e36884b875.jpeg

Skopiuj ten kod do sesji IPython:

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=" | ",         )          

Wyślij prośbę, używając funkcji LANDMARK_DETECTION:

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) 

Powinien pojawić się następujący wynik:

================================================================================ 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 

Oto w jaki sposób wyniki są prezentowane w ramach demonstracji online:

2788697365670985.png

Podsumowanie

W tym kroku mogliśmy wykryć punkt orientacyjny na zdjęciu wieży Eiffla. Dowiedz się więcej o wykrywaniu punktów orientacyjnych.

7. Wykrywanie twarzy

Wykrywanie cech twarzy wykrywa na zdjęciu kilka twarzy oraz powiązane z nimi kluczowe cechy, takie jak stan emocjonalny czy noszenie nakrycia głowy.

W tym przykładzie wykrywamy twarze na następującym zdjęciu (utworzonym dzięki uprzejmości Himanshu Singha Gurjara):

58c578ece524cf32.jpeg

Skopiuj ten kod do sesji IPython:

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)          

Wyślij prośbę, używając funkcji FACE_DETECTION:

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) 

Powinien pojawić się następujący wynik:

================================================================================ # 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 -------------------------------------------------------------------------------- 

Oto w jaki sposób wyniki są prezentowane w ramach demonstracji online:

cbb7f59299651b83.png

Podsumowanie

Udało Ci się wykryć twarz. Dowiedz się więcej o wykrywaniu twarzy.

8. Wykrywanie obiektów

W tym przykładzie wykrywamy obiekty na tym samym wcześniejszym zdjęciu (dzięki uprzejmości Alexa Knighta) Setagaya:

756f97f0b1e46c38.jpeg

Skopiuj ten kod do sesji IPython:

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=" | ",         )          

Wyślij prośbę, używając funkcji OBJECT_LOCALIZATION:

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) 

Powinien pojawić się następujący wynik:

================================================================================  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) 

Oto w jaki sposób wyniki są prezentowane w ramach demonstracji online:

e1c2ca803d874a6b.png

Podsumowanie

W tym kroku udało Ci się wykryć obiekty. Dowiedz się więcej o wykrywaniu obiektów.

9. Wiele funkcji

Wiesz już, jak korzystać z niektórych funkcji interfejsu Vision API, ale jest ich znacznie więcej i możesz poprosić o wiele funkcji w jednym żądaniu.

Możesz poprosić o zbieranie wszystkich statystyk jednocześnie:

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) 

Możliwości są też inne, np. wykrywanie serii obrazów synchronicznie lub asynchronicznie. Przejrzyj wszystkie instrukcje.

10. Gratulacje!

5ab7829fc22b21c4.png

Wiesz już, jak korzystać z interfejsu Vision API w Pythonie, i przetestowaliśmy kilka funkcji wykrywania obrazów.

Czyszczenie danych

Aby wyczyścić środowisko programistyczne, wykonaj te czynności w Cloud Shell:

  • Jeśli nadal jesteś w sesji IPython, wróć do powłoki: exit
  • Przestań używać środowiska wirtualnego Pythona: deactivate
  • Usuń folder środowiska wirtualnego: cd ~ ; rm -rf ./venv-vision

Aby usunąć projekt Google Cloud z Cloud Shell:

  • Pobierz bieżący identyfikator projektu: PROJECT_ID=$(gcloud config get-value core/project)
  • Sprawdź, czy to jest projekt, który chcesz usunąć: echo $PROJECT_ID
  • Usuń projekt: gcloud projects delete $PROJECT_ID

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.