So verwenden Sie die Google Cloud Vision-API in Android-Apps

Computer Vision wird als ein AI-komplettes Problem betrachtet. Mit anderen Worten, die Lösung wäre gleichbedeutend mit der Erstellung eines Programms, das genauso intelligent ist wie der Mensch. Ein solches Programm muss natürlich noch erstellt werden. Wenn Sie jedoch schon einmal Apps wie Google Goggles oder Google Photos verwendet haben oder in der Keynote von Google I / O 2017 das Segment auf Google Lens beobachtet haben, werden Sie wahrscheinlich feststellen, dass die Computer Vision sehr mächtig geworden ist.

Über eine auf REST basierende API namens Cloud Vision API teilt Google seine revolutionären, visionären Technologien mit allen Entwicklern. Durch die Verwendung der API können Sie Ihren Android-Apps mühelos beeindruckende Funktionen wie Gesichtserkennung, Emotionserkennung und optische Zeichenerkennung hinzufügen. In diesem Tutorial zeige ich Ihnen wie.

Voraussetzungen

Um diesem Tutorial folgen zu können, müssen Sie Folgendes haben:

  • ein Google Cloud Platform-Konto
  • ein Projekt in der Google Cloud-Konsole
  • die neueste Version von Android Studio
  • und ein Gerät, auf dem Android 4.4 oder höher ausgeführt wird

Wenn Ihnen einige der oben genannten Voraussetzungen nicht bekannt sind, sollten Sie das folgende einführende Tutorial zur Google Cloud Machine Learning-Plattform lesen:

1. Aktivieren der Cloud Vision-API

Sie können die Cloud Vision-API in Ihrer Android-App nur verwenden, nachdem Sie sie in der Google Cloud-Konsole aktiviert haben und einen gültigen API-Schlüssel erhalten haben. Melden Sie sich also an der Konsole an und navigieren Sie zu API Manager> Bibliothek> Vision-API. Drücken Sie in der sich öffnenden Seite einfach die Aktivieren Taste.

Wenn Sie bereits einen API-Schlüssel für Ihr Cloud-Konsolenprojekt generiert haben, können Sie mit dem nächsten Schritt fortfahren, da Sie ihn mit der Cloud Vision-API wiederverwenden können. Ansonsten öffnen Sie die Referenzen Tab und wählen Sie Erstellen Sie Anmeldeinformationen> API-Schlüssel.

In dem sich öffnenden Dialog sehen Sie Ihren API-Schlüssel.

2. Abhängigkeiten hinzufügen

Wie die meisten anderen von Google angebotenen APIs kann auf die Cloud Vision-API über die Google API-Client-Bibliothek zugegriffen werden. Um die Bibliothek in Ihrem Android Studio-Projekt zu verwenden, fügen Sie Folgendes hinzu kompilieren Abhängigkeiten im App Modul build.gradle Datei:

comp.google.api-client: google-api-client-android: 1.22.0 'compile' com.google.apis: google-api-services-vision: v1-rev357-1.22.0 'compile' com. google.code.findbugs: jsr305: 2.0.1 '

Um die Datei-E / A-Vorgänge zu vereinfachen, schlage ich vor, dass Sie auch a hinzufügen kompilieren Abhängigkeit für die IO-Bibliothek von Apache Commons.

'commons-io: commons-io: 2.5' kompilieren

Weil der Google API-Client nur funktionieren kann, wenn Ihre App über das verfügt INTERNET Stellen Sie sicher, dass die folgende Zeile in der Manifestdatei Ihres Projekts vorhanden ist:

3. Konfigurieren des API-Clients

Sie müssen den Google API-Client konfigurieren, bevor Sie ihn für die Interaktion mit der Cloud Vision-API verwenden können. Dazu müssen Sie in erster Linie den API-Schlüssel, den HTTP-Transport und die zu verwendende JSON-Factory angeben. Wie zu erwarten, ist der HTTP-Transport für die Kommunikation mit den Servern von Google verantwortlich, und die JSON-Factory ist unter anderem dafür verantwortlich, die von der API generierten JSON-Ergebnisse in Java-Objekte zu konvertieren. 

Für moderne Android-Apps empfiehlt Google die Verwendung der NetHttpTransport Klasse als HTTP-Transport und die AndroidJsonFactory Klasse wie die JSON-Fabrik.

Das Vision Klasse steht für den Google API-Client für Cloud Vision. Obwohl es möglich ist, eine Instanz der Klasse mithilfe des Konstruktors zu erstellen, verwenden Sie dazu die Vision.Builder stattdessen ist der Unterricht einfacher und flexibler.

Während der Verwendung der Vision.Builder Klasse, müssen Sie daran denken, die setVisionRequestInitializer () Methode, um Ihren API-Schlüssel anzugeben. Der folgende Code zeigt Ihnen wie:

Vision.Builder visionBuilder = new Vision.Builder (new NetHttpTransport (), neue AndroidJsonFactory (), null); visionBuilder.setVisionRequestInitializer (neuer VisionRequestInitializer ("YOUR_API_KEY"));

Einmal die Vision.Builder Instanz ist fertig, Sie können es anrufen bauen() Methode zum Erzeugen eines neuen Vision Instanz, die Sie in Ihrer App verwenden können.

Vision vision = visionBuilder.build ();

An diesem Punkt haben Sie alles, was Sie benötigen, um die Cloud Vision-API zu verwenden.

4. Gesichter erkennen und analysieren

Das Erkennen von Gesichtern in Fotos ist eine sehr häufige Anforderung in Anwendungen, die mit der Bildverarbeitung zusammenhängen. Mit der Cloud-Vision-API können Sie einen hochpräzisen Gesichtsdetektor erstellen, mit dem Sie auch Emotionen, Lichtverhältnisse und Wahrzeichen erkennen können.

Zu Demonstrationszwecken wird auf dem folgenden Foto, das die Crew von Apollo 9 zeigt, Gesichtserkennung ausgeführt:

Ich schlage vor, dass Sie eine hochauflösende Version des Fotos von Wikimedia Commons herunterladen und in Ihr Projekt einfügen res / raw Mappe.

Schritt 1: Kodieren Sie das Foto

Die Cloud Vision-API erwartet, dass das Eingabebild als Base64-Zeichenfolge codiert wird, die sich in einer Zeichenfolge befindet Bild Objekt. Bevor Sie ein solches Objekt erstellen, müssen Sie jedoch das heruntergeladene Foto, das derzeit eine Rohbildressource ist, in ein Foto konvertieren Byte Array. Sie können dies schnell tun, indem Sie den Eingabestrom mithilfe von öffnen openRawResource () Methode der Ressourcen Klasse und Weitergabe an die toByteArray () Methode der IOUtils Klasse.

Da Datei-E / A-Vorgänge nicht im UI-Thread ausgeführt werden sollten, stellen Sie sicher, dass Sie einen neuen Thread erstellen, bevor Sie den Eingabestrom öffnen. Der folgende Code zeigt Ihnen wie:

// Neuen Thread erstellen AsyncTask.execute (new Runnable () @Override public void run () // Foto in Byte-Array konvertieren InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte photo]; photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Mehr Code hier);

Sie können jetzt ein erstellen Bild Objekt durch Aufruf seines Standardkonstruktors. Hinzufügen Byte Array als Base64-String an das Array übergeben, müssen Sie es nur an das Array übergeben encodeContent () Methode.

Bild inputImage = neues Bild (); inputImage.encodeContent (photoData);

Schritt 2: Machen Sie eine Anfrage

Da die Cloud Vision-API mehrere verschiedene Funktionen bietet, müssen Sie die gewünschte Funktion explizit angeben, während Sie eine Anfrage an sie richten. Dazu müssen Sie ein erstellen Merkmal Objekt und nennen Sie es setType () Methode. Der folgende Code zeigt Ihnen, wie Sie eine Merkmal Objekt nur zur Gesichtserkennung:

Feature erwünschteFeature = neue Funktion (); erwünschteFeature.setType ("FACE_DETECTION");

Verwendung der Bild und das Merkmal Objekte können Sie jetzt eine AnnotateImageRequest Beispiel.

AnnotateImageRequest request = new AnnotateImageRequest (); request.setImage (inputImage); request.setFeatures (Arrays.asList (erwünschteFeature));

Beachten Sie, dass ein AnnotateImageRequest Objekt muss immer zu einem gehören BatchAnnotateImagesRequest Objekt, da die Cloud Vision-API mehrere Bilder gleichzeitig verarbeiten kann. A initialisieren BatchAnnotateImagesRequest Instanz, die eine einzelne enthält AnnotateImageRequest Objekt können Sie das verwenden Arrays.asList () Dienstprogrammmethode.

BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (request));

Um die Gesichtserkennungsanfrage zu starten, müssen Sie die ausführen() Methode eines Kommentieren Objekt, das mit dem initialisiert wird BatchAnnotateImagesRequest Objekt, das Sie gerade erstellt haben. Um ein solches Objekt zu generieren, müssen Sie das aufrufen kommentieren() Methode, die vom Google API-Client für Cloud Vision angeboten wird. Hier ist wie:

BatchAnnotateImagesResponse batchResponse = vision.images (). Annotate (batchRequest) .execute ();

Schritt 3: Verwenden Sie die Antwort

Sobald die Anfrage bearbeitet wurde, erhalten Sie eine BatchAnnotateImagesResponse Objekt, das die Antwort der API enthält. Für eine Gesichtserkennungsanfrage enthält die Antwort a FaceAnnotation Objekt für jedes Gesicht, das die API erkannt hat. Sie können eine Liste von allen erhalten FaceAnnotation Objekte mit der getFaceAnnotations () Methode.

Liste faces = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

EIN FaceAnnotation object enthält viele nützliche Informationen zu einem Gesicht, z. B. Position, Winkel und Emotion. Ab Version 1 kann die API nur die folgenden Emotionen erkennen: Freude, Trauer, Wut und Überraschung.

Um dieses Tutorial kurz zu halten, lassen Sie uns jetzt einfach die folgenden Informationen in a anzeigen Toast:

  • Die Anzahl der Gesichter
  • Die Wahrscheinlichkeit, dass sie Freude ausdrücken

Sie können natürlich die Anzahl der Gesichter abrufen, indem Sie die Größe() Methode der Liste das enthält FaceAnnotation Objekte. Um die Wahrscheinlichkeit zu erhalten, dass ein Gesicht Freude ausdrückt, können Sie den intuitiv genannten Namen nennen getJoyLikelihood () Methode des zugehörigen FaceAnnotation Objekt. 

Beachten Sie das, weil eine einfache Toast Wenn Sie nur eine einzige Zeichenfolge anzeigen können, müssen Sie alle oben genannten Details verketten. A Toast kann nur vom UI-Thread angezeigt werden, stellen Sie also sicher, dass Sie ihn nach dem Aufruf von aufrufen runOnUiThread () Methode. Der folgende Code zeigt Ihnen wie:

// Gesichter zählen int numberOfFaces = faces.size (); // Freude-Wahrscheinlichkeit für jedes Gesicht erhalten String-Wahrscheinlichkeit = ""; für (int i = 0; i

Sie können jetzt die App ausführen, um folgendes Ergebnis zu sehen:

5. Lesetext

Das Extrahieren von Strings aus Textfotos wird als optische Zeichenerkennung (OCR) bezeichnet. Mit der Cloud Vision-API können Sie auf einfache Weise einen optischen Zeichenleser erstellen, der sowohl Fotos von gedrucktem als auch von handgeschriebenem Text verarbeiten kann. Der Leser, den Sie erstellen, wird keine Probleme damit haben, geneigten Text oder Text zu lesen, der auf einem farbigen Bild überlagert ist.

Die API bietet zwei verschiedene Funktionen für die OCR:

  • TEXT_DETECTION, zum Lesen kleiner Textmengen, z. B. auf Schildern oder Buchdeckeln
  • und DOCUMENT_TEXT_DETECTION, zum Lesen großer Textmengen, wie sie beispielsweise auf den Seiten eines Romans vorhanden sind

Die Schritte, die Sie ausführen müssen, um eine OCR-Anforderung zu erstellen, sind identisch mit den Schritten, die Sie zum Erstellen einer Gesichtserkennungsanfrage ausgeführt haben, mit Ausnahme der Initialisierung der Merkmal Objekt. Für die OCR müssen Sie den Typ auf entweder festlegen TEXT_DETECTION oder DOCUMENT_TEXT_DETECTION. Lass uns jetzt mit dem ersteren gehen.

Feature erwünschteFeature = neue Funktion (); erwünschteFeature.setType ("TEXT_DETECTION");

Sie müssen natürlich auch ein Foto mit Text in Ihr Projekt einfügen res / raw Mappe. Wenn Sie kein solches Foto haben, können Sie dieses mit einem Straßenschild verwenden:

Sie können eine hochauflösende Version des obigen Fotos von Wikimedia Commons herunterladen.

Um mit der Verarbeitung der Ergebnisse einer OCR-Operation zu beginnen, erhalten Sie die BatchAnnotateImagesResponse Objekt müssen Sie das aufrufen getFullTextAnnotation () Methode, um eine TextAnnotation Objekt, das den gesamten extrahierten Text enthält.

final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();

Sie können dann die anrufen getText () Methode der TextAnnotation Objekt, um tatsächlich einen Verweis auf einen String zu erhalten, der den extrahierten Text enthält.

Der folgende Code zeigt, wie der extrahierte Text mit a angezeigt wird Toast:

Toast.makeText (getApplicationContext (), text.getText (), Toast.LENGTH_LONG) .show ();

Wenn Sie Ihre App jetzt ausführen, sollte Folgendes angezeigt werden:

Fazit

In diesem Lernprogramm haben Sie erfahren, wie Sie mit der Cloud Vision-API Ihre Android-Apps mit Funktionen zur Gesichtserkennung, Emotionserkennung und optischen Zeichenerkennung erweitern. Ich bin sicher, dass Sie mir zustimmen werden, wenn ich sage, dass diese neuen Funktionen Ihren Apps mehr intuitive und intelligentere Benutzeroberflächen bieten.

Erwähnenswert ist, dass in der Cloud Vision-API eine wichtige Funktion fehlt: die Gesichtserkennung. In der aktuellen Form kann die API nur Gesichter erkennen, jedoch nicht identifizieren.

Weitere Informationen zur API finden Sie in der offiziellen Dokumentation.

In der Zwischenzeit finden Sie einige unserer anderen Tutorials zum Hinzufügen von Computerunterricht zu Ihren Android-Apps!