Wykrywanie w obrazach etykiet, twarzy i punktów orientacyjnych przy użyciu interfejsu Cloud Vision API

Cloud Vision API umożliwia zrozumienie treści obrazu dzięki wykorzystaniu zaawansowanych modeli uczenia maszynowego w prostym interfejsie REST API.

W tym module wyślemy obrazy do interfejsu Vision API i sprawdzimy, czy wykryje on obiekty, twarze i punkty orientacyjne.

Czego się nauczysz

  • Tworzenie żądania do interfejsu Vision API i wywoływanie tego interfejsu za pomocą polecenia curl
  • Korzystanie z metod wykrywania etykiet, stron internetowych, twarzy i punktów orientacyjnych interfejsu Vision API

Czego potrzebujesz

  • Projekt Google Cloud Platform
  • przeglądarka, np. Chrome lub Firefox;

Jak zamierzasz wykorzystać ten samouczek?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz korzystanie z Google Cloud Platform?

Początkujący Średnio zaawansowany Zaawansowany

Samodzielne konfigurowanie środowiska

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

Screenshot from 2016-02-10 12:45:26.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.

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

Wykonanie tego samouczka nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz je uruchomione (patrz sekcja „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Kliknij ikonę menu w lewym górnym rogu ekranu.

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

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

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

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

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

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 Speech API 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.

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:~$

Ponieważ w celu wysłania żądania do interfejsu Vision API będziesz korzystać z narzędzia curl, musisz wygenerować klucz interfejsu API, aby przekazać go w URL żądania. Aby utworzyć klucz interfejsu API, w konsoli Cloud otwórz sekcję Dane logowania w sekcji Interfejsy API i usługi:

Z menu wybierz Klucz interfejsu API:

Następnie skopiuj wygenerowany klucz.

Po utworzeniu klucza interfejsu API należy zapisać go jako zmienną środowiskową, dzięki czemu unikniesz wprowadzania jego wartości przy każdym żądaniu. Możesz to zrobić w Cloud Shell. Pamiętaj, aby zastąpić <your_api_key> skopiowanym właśnie kluczem.

export API_KEY=<YOUR_API_KEY>

Tworzenie zasobnika Cloud Storage

Obraz do interfejsu Vision API można wysłać na 2 sposoby: przekazując interfejsowi API ciąg znaków obrazu zakodowany w formacie base64 lub przekazując mu adres URL pliku przechowywanego w Google Cloud Storage. Użyjemy adresu URL Cloud Storage. Utworzymy zasobnik Google Cloud Storage, w którym będziemy przechowywać obrazy.

W konsoli Cloud otwórz przeglądarkę Storage w swoim projekcie:

Następnie kliknij Utwórz zasobnik. Nadaj zasobnikowi unikalną nazwę (np. identyfikator projektu) i kliknij Utwórz.

Przesyłanie obrazu do zasobnika

Kliknij prawym przyciskiem myszy poniższy obraz z pączkami, a następnie kliknij Zapisz obraz jako i zapisz go w folderze Pobrane pliki jako donuts.png.

W przeglądarce pamięci przejdź do utworzonego przed chwilą zasobnika i kliknij Prześlij pliki. Następnie kliknij donuts.png.

Plik powinien być widoczny w zasobniku:

Następnie zmień uprawnienia do obrazu.

Kliknij Dodaj element.

Dodaj nową encję typu Groupnazwę allUsers:

Kliknij Zapisz.

Teraz, gdy plik znajduje się w zasobniku, możesz utworzyć żądanie do interfejsu Vision API, przekazując mu adres URL tego zdjęcia pączków.

W środowisku Cloud Shell utwórz plik request.json z poniższym kodem, pamiętając o zastąpieniu my-bucket-name nazwą utworzonego zasobnika Cloud Storage. Możesz utworzyć plik za pomocą jednego z preferowanych edytorów wiersza poleceń (nano, vim, emacs) lub użyć wbudowanego edytora Orion w Cloud Shell:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

Pierwszą funkcją interfejsu Cloud Vision API, którą omówimy, jest wykrywanie etykiet. Ta metoda zwróci listę etykiet (słów) opisujących zawartość obrazu.

Teraz możemy wywołać interfejs Vision API za pomocą polecenia curl:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Odpowiedź powinna wyglądać mniej więcej tak:

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "powdered sugar",
          "score": 0.9436922
        },
        {
          "mid": "/m/01wydv",
          "description": "beignet",
          "score": 0.7160288
        },
        {
          "mid": "/m/06_dn",
          "description": "snow",
          "score": 0.71219236
        },
        {
          "mid": "/m/02wvn_6",
          "mid": "/m/0bp3f6m",
          "description": "fried food",
          "score": 0.7075312
        },
        {
          "mid": "/m/02wvn_6",
          "description": "ricciarelli",
          "score": 0.5625
        },
        {
          "mid": "/m/052lwg6",
          "description": "baked goods",
          "score": 0.53270763
        }
      ]
    }
  ]
}

Interfejs API rozpoznał konkretny rodzaj tych pączków (beignets). Super! W przypadku każdej etykiety znalezionej przez interfejs Vision API zwraca on description z nazwą elementu. Zwraca też score, czyli liczbę z zakresu 0–100, która wskazuje, jak bardzo opis pasuje do obrazu. Wartość mid jest mapowana na identyfikator MID elementu w Grafie wiedzy Google. Podczas wywoływania interfejsu Knowledge Graph API możesz użyć znaku mid, aby uzyskać więcej informacji o elemencie.

Oprócz etykiet opisujących zawartość obrazu interfejs Vision API może też wyszukiwać w internecie dodatkowe informacje o obrazie. Za pomocą metody interfejsu API uzyskujemy wiele interesujących danych:webDetection

  • Lista elementów znalezionych na obrazie na podstawie treści ze stron z podobnymi obrazami.
  • Adresy URL obrazów znalezionych w internecie, które są dopasowane dokładnie lub częściowo, oraz adresy URL tych stron.
  • adresy URL podobnych obrazów, np. w wyniku odwrotnego wyszukiwania grafiki;

Aby wypróbować wykrywanie w internecie, użyjemy tego samego obrazu beignetów co powyżej. Wystarczy, że zmienisz jeden wiersz w pliku request.json (możesz też zaryzykować i użyć zupełnie innego obrazu). Na liście funkcji zmień typ z LABEL_DETECTION na WEB_DETECTION. request.json powinien teraz wyglądać tak:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

Aby wysłać go do interfejsu Vision API, możesz użyć tego samego polecenia curl co wcześniej (wystarczy nacisnąć strzałkę w górę w Cloud Shell):

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Zacznijmy od webEntities. Oto niektóre z elementów, które zwróciło to zdjęcie:

 "webEntities": [
          {
            "entityId": "/m/01hyh_",
            "score": 0.7155,
            "description": "Machine learning"
          },
          {
            "entityId": "/m/01wydv",
            "score": 0.48758492,
            "description": "Beignet"
          },
          {
            "entityId": "/m/0105pbj4",
            "score": 0.3976,
            "description": "Google Cloud Platform"
          },
          {
            "entityId": "/m/02y_9m3",
            "score": 0.3782,
            "description": "Cloud computing"
          },
          ...
        ]

Ten obraz był wielokrotnie używany w prezentacjach dotyczących naszych interfejsów Cloud ML API, dlatego interfejs API znalazł na nim elementy „uczenie maszynowe”, „Google Cloud Platform” i „przetwarzanie w chmurze”.

Jeśli sprawdzimy adresy URL w sekcjach fullMatchingImages, partialMatchingImagespagesWithMatchingImages, zauważymy, że wiele z nich prowadzi do tej witryny z ćwiczeniami (super meta!).

Załóżmy, że chcemy znaleźć inne zdjęcia beignetów, ale nie te same. W takiej sytuacji przydaje się część visuallySimilarImages odpowiedzi interfejsu API. Oto kilka podobnych wizualnie obrazów, które znalazł:

"visuallySimilarImages": [
          {
            "url": "https://igx.4sqi.net/img/general/558x200/21646809_fe8K-bZGnLLqWQeWruymGEhDGfyl-6HSouI2BFPGh8o.jpg"
          },
          {
            "url": "https://spoilednyc.com//2016/02/16/beignetszzzzzz-852.jpg"
          },
          {
            "url": "https://img-global.cpcdn.com/001_recipes/a66a9a6fc2696648/1200x630cq70/photo.jpg"
          },
          ...
]

Możemy przejść do tych adresów URL, aby zobaczyć podobne obrazy:

Super! Pewnie masz teraz ochotę na beignet (przepraszam). Działa to podobnie jak wyszukiwanie obrazem w Grafice Google:

Dzięki Cloud Vision możemy jednak uzyskać dostęp do tej funkcji za pomocą łatwego w obsłudze interfejsu API REST i zintegrować ją z naszymi aplikacjami.

Następnie przyjrzymy się metodom wykrywania twarzy i punktów orientacyjnych w interfejsie Vision API. Metoda wykrywania twarzy zwraca dane o twarzach znalezionych na obrazie, w tym emocje i lokalizację twarzy na obrazie. Wykrywanie punktów orientacyjnych może identyfikować popularne (i mniej znane) punkty orientacyjne – zwraca nazwę punktu orientacyjnego, jego współrzędne geograficzne oraz lokalizację, w której został on zidentyfikowany na obrazie.

Przesyłanie nowego obrazu

Aby skorzystać z tych dwóch nowych metod, prześlijmy do zasobnika Cloud Storage nowy obraz z twarzami i punktami charakterystycznymi. Kliknij prawym przyciskiem myszy poniższy obraz, a potem kliknij Zapisz obraz jako i zapisz go w folderze Pobrane pliki jako selfie.png.

Następnie prześlij go do zasobnika Cloud Storage w taki sam sposób jak w poprzednim kroku, pamiętając o zaznaczeniu pola wyboru „Udostępnij publicznie”.

Aktualizowanie prośby

Następnie zaktualizujemy plik request.json, aby zawierał adres URL nowego obrazu i wykorzystywał wykrywanie twarzy i punktów orientacyjnych zamiast wykrywania etykiet. Pamiętaj, aby zastąpić my-bucket-name nazwą zasobnika Cloud Storage:

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          } 
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

Wywoływanie interfejsu Vision API i parsowanie odpowiedzi

Teraz możesz wywołać interfejs Vision API za pomocą tego samego polecenia curl, którego używasz powyżej:

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

Przyjrzyjmy się najpierw obiektowi faceAnnotations w naszej odpowiedzi. Zwraca ona obiekt dla każdej twarzy znalezionej na obrazie – w tym przypadku 3. Oto skrócona wersja naszej odpowiedzi:

{
      "faceAnnotations": [
        {
          "boundingPoly": {
            "vertices": [
              {
                "x": 669,
                "y": 324
              },
              ...
            ]
          },
          "fdBoundingPoly": {
            ...
          },
          "landmarks": [
            {
              "type": "LEFT_EYE",
              "position": {
                "x": 692.05646,
                "y": 372.95868,
                "z": -0.00025268539
              }
            },
            ...
          ],
          "rollAngle": 0.21619819,
          "panAngle": -23.027969,
          "tiltAngle": -1.5531756,
          "detectionConfidence": 0.72354823,
          "landmarkingConfidence": 0.20047489,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_LIKELY"
        }
        ...
     }
}

boundingPoly podaje współrzędne x,y wokół twarzy na obrazie. fdBoundingPoly to mniejszy obszar niż boundingPoly, obejmujący skórę twarzy. landmarks to tablica obiektów dla każdej cechy twarzy (o niektórych z nich możesz nawet nie wiedzieć!). Informuje nas o rodzaju punktu orientacyjnego oraz jego położeniu 3D (współrzędne x, y,z), gdzie współrzędna z określa głębokość. Pozostałe wartości dostarczają więcej szczegółów na temat twarzy, w tym prawdopodobieństwo radości, smutku, złości i zdziwienia. Obiekt powyżej dotyczy osoby znajdującej się najdalej z tyłu na zdjęciu – widać, że robi śmieszną minę, co wyjaśnia joyLikelihood POSSIBLE.

Przyjrzyjmy się teraz części landmarkAnnotations naszej odpowiedzi:

"landmarkAnnotations": [
        {
          "mid": "/m/0c7zy",
          "description": "Petra",
          "score": 0.5403372,
          "boundingPoly": {
            "vertices": [
              {
                "x": 153,
                "y": 64
              },
              ...
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 30.323975,
                "longitude": 35.449361
              }
            }
          ]

Interfejs Vision API rozpoznał, że to zdjęcie zostało zrobione w Petrze. Jest to dość imponujące, biorąc pod uwagę, że wskazówki wizualne na tym obrazie są minimalne. Wartości w tej odpowiedzi powinny być podobne do wartości w odpowiedzi labelAnnotations powyżej.

Otrzymujemy mid punktu orientacyjnego, jego nazwę (description) oraz poziom ufności score. boundingPoly wskazuje region na obrazie, w którym zidentyfikowano punkt orientacyjny. Klucz locations zawiera współrzędne szerokości i długości geograficznej tego punktu orientacyjnego.

Przyjrzeliśmy się metodom wykrywania etykiet, twarzy i punktów orientacyjnych w interfejsie Vision API, ale są jeszcze 3 inne, których nie omówiliśmy. Więcej informacji o pozostałych 3 rodzajach znajdziesz w dokumentacji:

  • Wykrywanie logo: rozpoznawanie popularnych logo i ich lokalizacji na obrazie.
  • Wykrywanie SafeSearch: określanie, czy obraz zawiera treści dla pełnoletnich. Jest to przydatne w przypadku każdej aplikacji z treściami generowanymi przez użytkowników. Obrazy możesz filtrować na podstawie 4 czynników: treści dla dorosłych, treści medyczne, treści zawierające przemoc i treści parodiujące.
  • Wykrywanie tekstu: uruchom OCR, aby wyodrębnić tekst z obrazów. Ta metoda może nawet rozpoznawać język tekstu znajdującego się na obrazie.

Wiesz już, jak analizować obrazy za pomocą interfejsu Vision API. W tym przykładzie przekazaliśmy do interfejsu API adres URL obrazu w Google Cloud Storage. Zamiast tego możesz przekazać obraz w formie tekstu zakodowanego w formacie base64.

Omówione zagadnienia

  • Wywoływanie interfejsu Vision API za pomocą polecenia curl przez przekazanie mu adresu URL obrazu w zasobniku Cloud Storage
  • Korzystanie z metod wykrywania etykiet, stron internetowych, twarzy i punktów orientacyjnych w interfejsie Vision API

Następne kroki