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.
Um diesem Tutorial folgen zu können, müssen Sie Folgendes haben:
Wenn Ihnen einige der oben genannten Voraussetzungen nicht bekannt sind, sollten Sie das folgende einführende Tutorial zur Google Cloud Machine Learning-Plattform lesen:
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.
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:
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.
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.
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);
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 ();
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.
Listefaces = 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
:
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; iSie 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 sindDie 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 festlegenTEXT_DETECTION
oderDOCUMENT_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 aufrufengetFullTextAnnotation ()
Methode, um eineTextAnnotation
Objekt, das den gesamten extrahierten Text enthält.final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();Sie können dann die anrufen
getText ()
Methode derTextAnnotation
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!