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.
Um dieses Tutorial bestmöglich zu nutzen, benötigen Sie:
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.
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
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.
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.
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.
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);
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; iSie 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 mussAktivitä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 hierUm der Abfragezeichenfolge der obigen URL Felder hinzuzufügen, können Sie ein verwenden
Liste
vonPaar
Objekte. Folgende Felder sind wichtig:
Schlüssel
, Angabe Ihres geheimen API-SchlüsselsQuelle
, Geben Sie die Sprache an, aus der Sie übersetzen möchtenZiel
, Geben Sie die Sprache an, in die Sie übersetzen möchtenq
, Geben Sie den zu übersetzenden Text anDer 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 hinzuTextvorschau
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 derTreibstoff
Klasse, um eine HTTP-GET-Anforderung an die Übersetzungs-API zu senden. Auch diesmal können Sie die verwendenresponseString ()
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 derHandler
Klasse, lass uns einfach durchlaufenÜbersetzungen
Array des obigen JSON-Dokuments und aktualisieren Sie den Inhalt desTextvorschau
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; iWenn 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!