Mit der Cloud Vision API Labels, Gesichter und Sehenswürdigkeiten in Bildern erkennen

Mit der Cloud Vision API erhalten Sie Informationen über den Inhalt eines Bildes, indem Sie über eine nutzerfreundliche REST API leistungsstarke Modelle für maschinelles Lernen verwenden.

In diesem Lab senden Sie ein Bild an die Cloud Vision API, die die darin enthaltenen Objekte, Gesichter und Sehenswürdigkeiten erkennen soll.

Lerninhalte

  • Vision API-Anfrage erstellen und API mit "curl" aufrufen
  • Labels, Methoden für die Web- und Gesichtserkennung sowie die Erkennung von Sehenswürdigkeiten der Vision API verwenden

Wenn Sie brauchen

  • Google Cloud Platform-Projekt
  • Ein Browser, wie Chrome oder Firefox

Wie werden Sie diese Anleitung verwenden?

Nur Lesen Gelesen und die Übungen abschließen

Wie würdest du deine Erfahrung mit der Google Cloud Platform bewerten?

Fortgeschritten Fortgeschritten Profi

Umgebung im eigenen Tempo einrichten

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

Screenshot von 2016-02-10 12:45:26.png

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. In diesem Codelab wird sie später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.

Das Durchlaufen dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen brauchen oder sie weiterlaufen möchten (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert von 300$ zur Verfügung.

Klicken Sie links oben auf dem Bildschirm auf das Menüsymbol.

Wählen Sie im Drop-down-Menü APIs &Dienste aus und klicken Sie auf „Dashboard“.

Klicken Sie auf APIs und Dienste aktivieren.

Suchen Sie anschließend im Suchfeld nach „vision“. Klicken Sie auf die Google Cloud Vision API:

Klicken Sie auf Aktivieren, um die Cloud Vision API zu aktivieren.

Warten Sie einige Sekunden, bis sie aktiviert wird. Folgendes wird angezeigt, sobald es aktiviert ist:

Google Cloud Shell ist eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird. Diese Debian-basierte virtuelle Maschine ist mit allen Entwicklertools ausgestattet, die Sie benötigen (gcloud, bq, git und andere). Sie enthält ein Basisverzeichnis mit 5 GB Speicherplatz. Wir verwenden Cloud Shell, um unsere Anfrage an die Speech API zu erstellen.

Wenn Sie Cloud Shell verwenden möchten, klicken Sie rechts oben in der Kopfzeile auf das Symbol „Google Cloud Shell aktivieren“ Screenshot 2015-06-08 um 17.30.32 Uhr.png

Im unteren Bereich der Konsole wird ein neuer Frame für die Cloud Shell-Sitzung geöffnet, in dem eine Befehlszeilen-Eingabeaufforderung angezeigt wird. Warten Sie, bis die Aufforderung "user@project:~$" angezeigt wird

Da wir mit curl eine Anfrage an die Vision API senden, müssen Sie einen API-Schlüssel generieren, mit dem die Anfrage-URL übergeben wird. Rufen Sie in der Cloud Console den Abschnitt „Anmeldedaten“ des APIs und der Dienste auf, um einen API-Schlüssel zu erstellen:

Wählen Sie im Drop-down-Menü API key (API-Schlüssel) aus:

Kopieren Sie den gerade generierten Schlüssel.

Speichern Sie nun den API-Schlüssel in einer Umgebungsvariablen. So brauchen Sie den Wert des API-Schlüssels nicht in jede Anfrage einzufügen. Dies ist in Cloud Shell möglich. Ersetzen Sie dabei <your_api_key> durch den soeben kopierten Schlüssel.

export API_KEY=<YOUR_API_KEY>

Cloud Storage-Bucket erstellen

Es gibt zwei Möglichkeiten, ein Bild zur Bilderkennung an die Vision API zu senden: Entweder Sie senden der API einen Base64-codierten Bildstring oder Sie übergeben die URL einer in Google Cloud Storage gespeicherten Datei. Wir verwenden eine Cloud Storage-URL. Wir erstellen außerdem einen Google Cloud Storage-Bucket, in dem unsere Bilder gespeichert werden.

Gehen Sie in der Cloud Console für Ihr Projekt zum Speicherbrowser:

Klicken Sie dann auf Bucket erstellen. Geben Sie Ihrem Bucket einen eindeutigen Namen (z. B. Ihre Projekt-ID) und klicken Sie auf Erstellen.

Bild in den Bucket hochladen

Klicken Sie mit der rechten Maustaste auf das folgende Donuts-Bild und klicken Sie dann auf Bild speichern unter und speichern Sie es als donuts.png im Ordner „Downloads“.

Gehen Sie zu dem Bucket, den Sie gerade im Storage-Browser erstellt haben, und klicken Sie auf Dateien hochladen. Wählen Sie dann donuts.png aus.

Sie sollten die Datei in Ihrem Bucket sehen:

Jetzt bearbeiten Sie die Berechtigung des Bildes.

Klicken Sie auf Zeile hinzufügen.

Fügen Sie eine neue Entität von Group und den Namen von allUsers hinzu:

Klicken Sie auf Speichern.

Nachdem die Datei in den Bucket hochgeladen wurde, können Sie eine Vision API-Anfrage erstellen und die URL dieses Donutbildes übergeben.

Erstellen Sie in der Cloud Shell-Umgebung eine request.json-Datei mit dem Code unten und ersetzen Sie dabei my-bucket-name durch den Namen des Cloud Storage-Buckets, den Sie erstellt haben. Sie können die Datei entweder mit einem Ihrer bevorzugten Befehlszeileneditoren (Nano, Vim oder Emacs) oder mit dem integrierten Orion-Editor in Cloud Shell erstellen:

request.json

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

Das erste Feature der Cloud Vision API, das wir untersuchen, ist die Labelerkennung. Diese Methode gibt eine Liste mit Labels (Wörtern) zurück, die den Bildinhalt beschreiben.

Wir bieten jetzt die Vision API mit curl an:

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

Die Antwort sollte in etwa so aussehen:

{
  "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
        }
      ]
    }
  ]
}

Die API hat ermittelt, welche Art von Donuts diese sind (gute Leistung). Für jedes Label, das die Vision API findet, wird ein description mit dem Namen des Elements zurückgegeben. Außerdem wird eine score zurückgegeben, eine Zahl von 0 bis 100, die angibt, wie sicher die Beschreibung ist, dass die Beschreibung mit dem Inhalt im Bild übereinstimmt. Der Wert mid ist dem Knowledge Graph von Google zugeordnet. Du kannst mid verwenden, wenn du die Knowledge Graph API aufrufst, um weitere Informationen zum Element zu erhalten.

Mit der Vision API können Sie nicht nur Labels auf dem Bild hinzufügen, sondern auch im Internet nach zusätzlichen Details zu unserem Bild suchen. Über die webDetection-Methode der API erhalten wir viele interessante Daten zurück:

  • Eine Liste der Entitäten, die in unserem Bild gefunden wurden. Sie basiert auf den Inhalten von Seiten mit ähnlichen Bildern.
  • URLs von vollständig und teilweise übereinstimmenden Bildern im Web sowie die URLs dieser Seiten
  • URLs ähnlicher Bilder (wie bei einer umgekehrten Bildersuche)

Um die Weberkennung auszuprobieren, verwenden wir dasselbe Bild von Beignets wie oben. Wir müssen daher nur eine Zeile in unserer request.json-Datei ändern. Sie können sich auch in das Unbekannte stürzen und ein ganz anderes Bild verwenden. Ändere von der Funktionsliste einfach den Typ von LABEL_DETECTION zu WEB_DETECTION. request.json sollte jetzt so aussehen:

request.json

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

Zum Senden an die Vision API können Sie denselben curl-Befehl wie zuvor verwenden (drücken Sie einfach in der Cloud Shell den Aufwärtspfeil):

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

Beginnen wir mit der Antwort, beginnend mit webEntities. Hier sind einige der Entitäten, die dieses Bild zurückgegeben hat:

 "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"
          },
          ...
        ]

Dieses Bild wurde in vielen Präsentationen in unseren Cloud ML APIs verwendet. Aus diesem Grund hat die API die Entitäten „Maschinelles Lernen“ und „Google Cloud Platform“ sowie „Cloud-Computing“ gefunden.

Wenn wir die URLs unter fullMatchingImages, partialMatchingImages und pagesWithMatchingImages festlegen, stellen wir fest, dass viele der URLs auf diese Codelab-Website verweisen (Super-Meta!).

Angenommen, wir suchen nach anderen Bildern von Beignets, aber nicht nach denselben Bildern. In dieser Situation ist der visuallySimilarImages-Teil der API-Antwort praktisch. Hier sind einige der visuell ähnlichen Bilder, die gefunden wurden:

"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"
          },
          ...
]

Unter den folgenden URLs finden Sie ähnliche Bilder:

Nicht schlecht, oder? Mittlerweile ist er nur noch ein Begnet (sauer). Das ähnelt der Suche nach einem Bild in Google Bilder:

Mit Cloud Vision können wir diese Funktion aber mit einer benutzerfreundlichen REST API nutzen und in unsere Anwendungen einbinden.

Als Nächstes beschäftigen wir uns mit den Methoden zur Gesichtserkennung und der Erkennung von Sehenswürdigkeiten der Vision API. Bei der Gesichtserkennung werden Daten zu in einem Bild gefundenen Gesichtern zurückgegeben, einschließlich der Emotionen in den Gesichtern und deren Position im Bild. Mit der Erkennung von Sehenswürdigkeiten können Sie häufig vorkommende Sehenswürdigkeiten erkennen. Sie erhalten den Namen der Sehenswürdigkeit, ihre Koordinaten für den Breiten- und Längengrad sowie die Position, an der die Sehenswürdigkeit in einem Bild erkannt wurde.

Neues Bild hochladen

Um diese beiden neuen Methoden zu verwenden, laden Sie ein neues Bild mit Gesichtern und Sehenswürdigkeiten in unseren Cloud Storage-Bucket hoch. Klicken Sie mit der rechten Maustaste auf das folgende Bild. Klicken Sie dann auf Bild speichern unter und speichern Sie es als selfie.png im Ordner „Downloads“.

Laden Sie den Bericht dann wie gewohnt aus dem Cloud Storage-Bucket hoch und klicken Sie das Kästchen „Öffentlich freigeben“ an.

Unsere Anfrage aktualisieren

Als Nächstes aktualisieren wir unsere request.json-Datei, um die URL des neuen Bildes hinzuzufügen und die Erkennung von Gesichtern und Sehenswürdigkeiten anstelle der Labelerkennung zu verwenden. Ersetzen Sie dabei my-bucket-name durch den Namen unseres Cloud Storage-Buckets:

request.json

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

Vision API aufrufen und Antwort parsen

Jetzt können Sie die Vision API mit demselben Curl-Befehl wie oben aufrufen aufrufen:

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

Sehen wir uns zuerst das faceAnnotations-Objekt in unserer Antwort an. Die API gibt ein Objekt für jedes im Bild gefundene Gesicht zurück­ – in diesem Fall drei. Das ist eine gekürzte Version unserer Antwort:

{
      "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"
        }
        ...
     }
}

Mit boundingPoly erhalten wir die x- und y-Koordinaten um das Gesicht im Bild. fdBoundingPoly ist ein kleineres Feld als boundingPoly, das den Hautteil des Gesichts verdeckt. landmarks ist eine Fülle von Objekten für jede Gesichtsmerkmal (einige davon sind dir vielleicht noch nicht bekannt). Hiermit wird der Typ des Orientierungspunktes zusammen mit der 3D-Position dieses Merkmals (x-, y-, z-Koordinaten) angegeben, wobei die z-Koordinate die Tiefe darstellt. Die verbleibenden Werte geben uns mehr Details zum Gesicht, einschließlich der Wahrscheinlichkeit von Freude, Trauer, Wut und Überraschung. Das Objekt oben bezieht sich auf die Person, die im Bild am weitesten zurückliegt. Sie zeigt, dass sie ein lächeliges Gesicht zeigt, das die joyLikelihood von POSSIBLE erklärt.

Als Nächstes sehen wir uns den landmarkAnnotations-Teil unserer Antwort an:

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

Die Vision API konnte hier erkennen, dass das Bild in Petra aufgenommen wurde. Das ist sehr beeindruckend, weil die sichtbaren Anhaltspunkte in diesem Bild minimal sind. Die Werte in dieser Antwort sollten der in der obigen labelAnnotations-Antwort ähneln.

Wir erhalten die mid der Sehenswürdigkeit, des Namens (description) und eine Konfidenz von score. boundingPoly zeigt den Bereich im Bild an, in dem die Sehenswürdigkeit erkannt wurde. Der Schlüssel locations gibt die Koordinaten des Breiten- und Längengrads dieses Sehenswürdigkeit an.

Wir haben uns die Methoden zur Erkennung von Labels, des Gesichts und Sehenswürdigkeiten der Vision API angesehen. Es gibt jedoch drei weitere, die wir noch nicht erkundet haben. Weitere Informationen finden Sie in der Dokumentation.

  • Logoerkennung: Identifizieren Sie bekannte Logos und deren Position in einem Bild.
  • SafeSearch-Erkennung: Finden Sie heraus, ob ein Bild explizite Inhalte enthält. Das ist sinnvoll bei Apps mit von Nutzern erstellten Inhalten. Sie können Bilder anhand der folgenden vier Faktoren filtern: Inhalte nur für Erwachsene, Medizinprodukt, Gewalt und Spoofing.
  • Texterkennung: Führen Sie OCR aus, um Text aus Bildern zu extrahieren. Diese Methode kann sogar die Sprache des in einem Bild enthaltenen Textes erkennen.

Sie haben gelernt, wie Sie Bilder mit der Vision API analysieren können. In diesem Beispiel haben Sie die Google Cloud Storage-URL Ihres Bildes an die API übergeben. Alternativ können Sie einen Base64-codierten Bildstring übergeben.

Behandelte Themen

  • Vision API mit "curl" durch Übergabe der URL eines Bildes in einem Cloud Storage-Bucket aufrufen
  • Mithilfe der Vision API Labels, Web, Gesichter und Sehenswürdigkeiten erkennen

Nächste Schritte