So verwenden Sie Google Cloud Machine Learning Services für Android

Die Nachrichten dieser Tage sind voller Schlagworte wie Automatisierung, künstliche Intelligenz und maschinelles Lernen. Wahrscheinlich suchen immer mehr Smartphone-Nutzer nach intelligenteren Apps. Als normaler Android-App-Entwickler fehlen Ihnen jedoch wahrscheinlich die Ressourcen, um solche Apps von Grund auf zu erstellen.

Glücklicherweise hat Google kürzlich eine Cloud Machine Learning-Plattform eingeführt, die neuronale Netzwerke bietet, die für eine Vielzahl von Aufgaben vorgebildet wurden. Die meisten Modelle sind nicht nur hochgenau, sondern verbessern sich auch ständig. Und rate was? Sie können sie verwenden, indem Sie einfach einige REST-API-Aufrufe ausführen!

In diesem Lernprogramm werde ich Sie in die Cloud Machine Learning-Plattform einführen und Ihnen zeigen, wie Sie eine intelligente Android-App erstellen, mit der reale Objekte erkannt und in mehreren Sprachen benannt werden können.

Voraussetzungen

Um dieses Tutorial bestmöglich zu nutzen, benötigen Sie:

  • die neueste Version von Android Studio
  • ein Gerät mit Android 4.4 oder höher
  • und ein Google Cloud Platform-Konto

1. Erwerb eines API-Schlüssels

Um die maschinellen Lerndienste von Google in Ihrer Android-App nutzen zu können, benötigen Sie einen API-Schlüssel. Sie können eines erhalten, indem Sie in der Google Cloud Platform-Konsole ein neues Projekt erstellen.

Melden Sie sich an der Konsole an und drücken Sie die Neues Projekt erstellen Taste. Geben Sie im angezeigten Dialogfeld dem Projekt einen aussagekräftigen Namen.

Wenn das Projekt erstellt wurde, gehen Sie zu API Manager> Dashboard und drücken Sie die API aktivieren Taste.

Im nächsten Bildschirm unter der Google Cloud Machine Learning Überschrift werden Sie in der Lage sein, alle verschiedenen Maschinenlern-APIs zu sehen, die Ihnen zur Verfügung stehen. In diesem Lernprogramm werden nur die APIs für Vision und Übersetzung verwendet.

Um die Vision-API zu aktivieren, klicken Sie auf den Link und drücken Sie Aktivieren Taste.

Um die Übersetzungs-API zu aktivieren, klicken Sie auf den Link und drücken Sie die Aktivieren Taste.

Sie benötigen nur einen Schlüssel, um beide APIs zu verwenden. Um es zu bekommen, gehe zum Referenzen Registerkarte, drücken Sie die Erstellen Sie Anmeldeinformationen und wählen Sie API-Schlüssel.

Sie sollten jetzt ein Popup mit Ihrem geheimen API-Schlüssel sehen.

2. Erstellen eines neuen Android-Projekts

Starten Sie Android Studio und erstellen Sie ein neues Projekt mit einer leeren Aktivität. Ich empfehle Ihnen, mindestens API Level 19 für das unterstützte Minimum SDK auszuwählen.

Obwohl Sie dies nicht müssen, ist es immer eine gute Idee, eine robuste Netzwerkbibliothek für die Kommunikation mit der Google Cloud Machine Learning-Plattform zu verwenden. In diesem Lernprogramm verwenden wir eine solche Bibliothek namens Fuel. Fügen Sie es als ein kompilieren Abhängigkeit in der App Modul build.gradle Datei:

kompiliere 'com.github.kittinunf.fuel: fuel-android: 1.5.0'

Drücken Sie Jetzt synchronisieren um Ihr Projekt zu aktualisieren.

Als nächstes braucht unsere App die INTERNET Erlaubnis, mit den Servern von Google zu kommunizieren. Fügen Sie daher die folgende Zeile in die Manifestdatei des Projekts ein:

Fügen Sie schließlich Ihren API-Schlüssel zum hinzu Werte / Zeichenfolgen.xml Datei:

ABCDEF12345-abcdef12345-123

3. Verwenden der Vision API

Mit der Vision-API können Sie Apps erstellen, die die Umgebung des Benutzers erkennen und verstehen. Gesichtserkennung, Emotionserkennung, optische Zeichenerkennung und Bildanmerkung sind einige der vielen Funktionen. Im Moment konzentrieren wir uns nur auf die leistungsstarke Funktion zur Bildanmerkung, die auch als Etikettenerkennung bezeichnet wird. Dies ist meiner Meinung nach sehr nützlich.

Wie zu erwarten, erwartet die API ein Bild als eine der Eingaben. Lassen Sie uns nun einen Bildschirm erstellen, auf dem der Benutzer mit der Kamera des Geräts Bilder aufnehmen kann.

Schritt 1: Erstellen Sie ein Layout

Das Layout unseres Bildschirms muss a Taste Widget, das der Benutzer drücken kann, um ein Foto aufzunehmen Bildansicht Widget, um das Bild anzuzeigen, und a Textvorschau Widget zur Anzeige der von der API generierten Beschriftungen oder Anmerkungen. Fügen Sie der Layout-XML-Datei Ihrer Aktivität den folgenden Code hinzu:

Beachten Sie, dass wir ein zugeordnet haben onClick Handler mit der Taste. Wir werden es im nächsten Schritt definieren.

Schritt 2: Erstellen Sie eine Absicht

Durch das Erstellen einer neuen Absicht mit der ACTION_IMAGE_CAPTURE Aktion und Weitergabe an die startActivityForResult () Auf diese Weise können Sie die Standard-Kamera-App des Benutzergeräts bitten, Bilder aufzunehmen und an Ihre App weiterzuleiten. Fügen Sie daher folgenden Code hinzu Aktivität Klasse:

public final static int MY_REQUEST_CODE = 1; public void takePicture (Ansichtsansicht) Intent Intent = New Intent (MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (intent, MY_REQUEST_CODE); 

Um die von der Standard-Kamera-App aufgenommenen Bilder empfangen zu können, müssen Sie die Einstellung überschreiben onActivityResult () Methode Ihrer Aktivität Klasse. Innerhalb der Methode haben Sie Zugriff auf eine Bündeln Objekt, das alle Bilddaten enthält. Sie können die Bilddaten rendern, indem Sie sie einfach in eine konvertieren Bitmap und weitergeben an die Bildansicht Widget.

@Override protected void onActivityResult (int requestCode, int resultCode, Intent-Daten) if (requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) // Bilddaten in Bitmap konvertieren Bitmap picture = (Bitmap) data.getExtras (). "Daten"); // Setze die Bitmap als Quelle für ImageView ((ImageView) findViewById (R.id.previewImage)) .setImageBitmap (picture); // mehr Code geht hier

Wenn Sie die App jetzt ausführen und ein Foto machen, werden Sie feststellen, dass die Größe des Bildes recht klein ist. Das ist in Ordnung, obwohl die Cloud Vision-API selbst mit Miniaturbildern sehr genau ist.

Schritt 3: Kodieren Sie das Bild

Die Vision-API kann nicht verwendet werden Bitmap Objekte direkt. Stattdessen erwartet sie eine Base64-codierte Zeichenfolge komprimierter Bilddaten.

Um die Bilddaten zu komprimieren, können Sie die komprimieren() Methode der Bitmap Klasse. Als Methode erwartet die Methode das verwendete Komprimierungsformat, die gewünschte Ausgabequalität und a ByteArrayOutputStream Objekt. Der folgende Code komprimiert die Bitmap im JPEG-Format und stellt außerdem sicher, dass die Qualität des resultierenden Bildes ausreichend hoch ist:

ByteArrayOutputStream byteStream = new ByteArrayOutputStream (); picture.compress (Bitmap.CompressFormat.JPEG, 90, byteStream);

Sie können jetzt die Base64-Zeichenfolge mithilfe von generieren encodeToString () Methode der Base64 Klasse.

String base64Data = Base64.encodeToString (byteStream.toByteArray (), Base64.URL_SAFE);

Schritt 4: Verarbeiten Sie das Bild

Nach all dieser harten Arbeit haben Sie alles, was Sie brauchen, um mit der Vision-API zu interagieren. Erstellen Sie zunächst eine Zeichenfolge, die sowohl die URL der API als auch Ihren API-Schlüssel enthält:

String requestURL = "https://vision.googleapis.com/v1/images:annotate?key=" + getResources (). GetString (R.string.mykey);

Um Daten an die API zu senden, müssen Sie eine HTTP-POST-Anforderung erstellen. Der Hauptteil der Anforderung muss ein JSON-Dokument sein, das die Base64-codierten Bilddaten enthält. Für die Etikettenerkennung muss das Dokument außerdem über ein Eigenschaften Array, das den Wert enthält LABEL_DETECTION. Hier ist das Format des JSON-Dokuments:

"Anforderungen": ["Bild": "Inhalt":  , "features": ["type": "LABEL_DETECTION"]]

Obwohl es möglich ist, das JSON-Dokument manuell zu codieren, ist die programmgesteuerte Erstellung weniger fehleranfällig. Der folgende Code zeigt, wie Sie dies mit Hilfe von tun JSONObject und JSONArray Klassen:

// Erstellen Sie ein Array mit // dem LABEL_DETECTION-Feature. JSONArray features = new JSONArray (); JSONObject-Feature = neues JSONObject (); feature.put ("type", "LABEL_DETECTION"); features.put (Funktion); // Erstellen Sie ein Objekt, das // die Base64-codierten Bilddaten enthält. JSONObject imageContent = new JSONObject (); imageContent.put ("content", base64Data); // Setze das Array und das Objekt in eine einzige Anfrage // und dann die Anfrage in ein Array von Requests. JSONArray request = new JSONArray (); JSONObject-Anfrage = neues JSONObject (); request.put ("image", imageContent); request.put ("features", features); request.put (request); JSONObject postData = neues JSONObject (); postData.put ("Anforderungen", Anfragen); // Konvertiere den JSON in einen // String String body = postData.toString ();

An dieser Stelle können wir die verwenden Post() Methode der Treibstoff Klasse, um die HTTP-POST-Anforderung auszuführen. Als einziges Argument erwartet die Methode die URL der API. Sie müssen auch die Inhaltslänge und Inhaltstyp Header in der Anfrage. Verwenden Sie dazu die Header() Methode. Um das JSON-Dokument zum Hauptteil der POST-Anforderung hinzuzufügen, verwenden Sie das Post() Methode.

Zuletzt durch das Aufrufen der responseString () Methode und Übergabe einer neuen Instanz von Handler Klasse können Sie die Antwort der Anforderung asynchron als Zeichenfolge abrufen. Fügen Sie dementsprechend folgenden Code hinzu:

Fuel.post (requestURL) .header (neues Paar("content-length", body.length ()), neues Paar("content-type", "application / json")) .body (body.getBytes ()) .responseString (neuer Handler)() @Override public void Erfolg (@NotNull Request-Anforderung, @NotNull Response-Antwort, Zeichenfolgendaten) // Hier wird mehr Code ausgegeben @Override public void-Fehler (@NotNull Request-Anforderung, @NotNull Response-Antwort, @NotNull FuelError fuelError ) );

Wenn Sie die Etikettenerkennungsfunktion verwenden, gibt die Vision-API ein JSON-Dokument mit Etiketten zurück. Neben jedem Etikett erhalten Sie auch eine Bewertung, wie genau das Etikett ist. Das Dokument sieht so aus:

"antworten": ["labelAnnotations": ["mid": "/ m / id1", "description": "label1", "score": 0,91, "mid": "/ m / id2" , "description": "label2", "score": 0.90,…]

Lassen Sie uns jetzt alle Objekte in der labelAnnotationen Array und addieren Sie den Wert von jedem Beschreibung Schlüssel zum Textvorschau Widget unseres Layouts. So können Sie das in der Erfolg() Methode der Handler Klasse:

// Zugriff auf die labelAnnotations-Arrays JSONArray labels = new JSONObject (Daten) .getJSONArray ("Antworten") .getJSONObject (0) .getJSONArray ("labelAnnotations"); String Ergebnisse = ""; // Durchlaufen Sie das Array und extrahieren Sie den // Beschreibungsschlüssel für jedes Element für (int i = 0; i

Sie können jetzt die App ausführen, ein Bild von einem nahegelegenen Objekt machen und die Bezeichnungen sehen, die das Vision-API für sie generiert.

4. Verwenden der Übersetzungs-API

Die Cloud-Übersetzungs-API kann, wie der Name vermuten lässt, Text in und aus mehr als 100 Sprachen übersetzen. Durch die effektive Verwendung können Sie intelligente Apps erstellen, die mit Ihren Benutzern in ihrer eigenen Sprache kommunizieren können.

Im vorherigen Schritt haben Sie gesehen, dass die Labels, die unsere App generiert, in Englisch sind. Fügen wir nun einen Button hinzu, um diese Labels ins Deutsche zu übersetzen.

Schritt 1: Aktualisieren Sie das Layout

Füge hinzu ein Taste Widget am Ende des Layouts Ihrer Aktivität mit folgendem Code:

Beachten Sie, dass auch diese Schaltfläche eine onClick Eventhandler, der in Ihrem definiert werden muss Aktivität Klasse.

Schritt 2: Übersetzen Sie die Etiketten

Die Verwendung der Übersetzungs-API ist weitaus einfacher als die Verwendung der Vision-API, vor allem, weil Sie zur Definition Ihrer Anfrage kein JSON-Dokument erstellen müssen. Stattdessen können Sie ihr einfach Parameter in einer Abfragezeichenfolge übergeben.

Erstellen Sie die translateToGerman () und erstellen Sie darin eine Zeichenfolge, die die URL der Übersetzungs-API enthält.

public void translateToGerman (Ansicht anzeigen) String requestURL = "https://translation.googleapis.com/language/translate/v2"; // mehr Code geht hier

Um der Abfragezeichenfolge der obigen URL Felder hinzuzufügen, können Sie ein verwenden Liste von Paar Objekte. Folgende Felder sind wichtig:

  • Schlüssel, Angabe Ihres geheimen API-Schlüssels
  • Quelle, Geben Sie die Sprache an, aus der Sie übersetzen möchten
  • Ziel, Geben Sie die Sprache an, in die Sie übersetzen möchten
  • q, Geben Sie den zu übersetzenden Text an

Der folgende Code zeigt, wie Sie die API für die Übersetzung von Englisch nach Deutsch konfigurieren:

Liste> params = neue ArrayList <> (); // API-Schlüssel hinzufügen params.add (neues Paar("key", getResources (). getString (R.string.mykey))); // Setze Quell- und Zielsprache params.add (neues Paar("source", "en")); params.add (neues Paar("Ziel", "De"));

Weil die Abfragezeichenfolge mehrere Zeichen enthalten kann q In diesen Feldern fügen wir für jedes Etikett, das sich in unserem Layout befindet, ein Feld hinzu Textvorschau Widget. Hier ist wie:

String [] abfragen = ((TextView) findViewById (R.id.resultsText)) .getText (). ToString (). Split ("\ n"); for (String-Abfrage: Abfragen) params.add (neues Paar("q", Abfrage)); 

Zum Schluss können Sie das anrufen erhalten() Methode der Treibstoff Klasse, um eine HTTP-GET-Anforderung an die Übersetzungs-API zu senden. Auch diesmal können Sie die verwenden responseString () Methode, um die Antwort asynchron als Zeichenfolge abzurufen.

Fuel.get (requestURL, params) .responseString (neuer Handler() @Override public void Erfolg (@NotNull Request-Anforderung, @NotNull Response-Antwort, Zeichenfolgendaten) // Mehr Code hier @Override public void-Fehler (@NotNull Request-Anforderung, @NotNull Response-Antwort, @NotNull FuelError fuelError) );

Die Antwort der Übersetzungs-API ist ein JSON-Dokument, das ein Array von Übersetzungen enthält. Es hat folgendes Format:

"data": "translations": ["übersetzterText": "…", "übersetzterText": "…",…]

Für jetzt in der Erfolg() Methode der Handler Klasse, lass uns einfach durchlaufen Übersetzungen Array des obigen JSON-Dokuments und aktualisieren Sie den Inhalt des Textvorschau Widget mit den Werten, die mit dem verknüpft sind übersetzter Text Schlüssel.

// Zugriff auf das Translationsarray JSONArray translations = new JSONObject (data) .getJSONObject ("data") .getJSONArray ("translations"); // Das Array durchlaufen und den übersetzten Text extrahieren // Schlüssel für jedes Element String result = ""; für (int i = 0; i

Wenn Sie die App jetzt ausführen, Etiketten für ein Bild generieren und die zweite Schaltfläche drücken, sollten Sie die Etiketten in deutscher Sprache sehen können.

Fazit

In diesem Lernprogramm haben Sie erfahren, wie Sie die Cloud Vision- und Cloud-Übersetzungs-APIs, die Teil der Google Cloud Machine Learning-Plattform sind, in einer Android-App verwenden. Es gibt viele weitere APIs, die von der Plattform angeboten werden. Sie können mehr darüber erfahren, indem Sie sich auf die offizielle Dokumentation beziehen. 

Lesen Sie in unseren anderen Tutorials, wie Sie Machine Learning und Cloud-Dienste in Ihren Android-Apps verwenden!