Wäre es nicht toll, wenn eine Android-App ihre Umgebung sehen und verstehen könnte? Können Sie sich vorstellen, wie viel besser seine Benutzeroberfläche sein könnte, wenn sie sich die Benutzer ansehen und sofort ihr Alter, Geschlecht und ihre Emotionen kennen könnte? Nun, eine solche App mag futuristisch erscheinen, ist aber heute völlig machbar.
Mit dem IBM Watson Visual Recognition-Service ist das Erstellen mobiler Apps, die Objekte in Bildern genau erkennen und analysieren können, einfacher als je zuvor. In diesem Tutorial zeige ich Ihnen, wie Sie damit eine intelligente Android-App erstellen, mit der Alter und Geschlecht einer Person ermittelt und auffällige Objekte in einem Foto identifiziert werden können.
Um diesem Tutorial folgen zu können, müssen Sie Folgendes haben:
Wie alle Watson-Services muss auch der Visual Recognition-Service manuell aktiviert werden, bevor er in einer App verwendet werden kann. Melden Sie sich also bei der IBM Bluemix-Konsole an und navigieren Sie zu Dienstleistungen> Watson. Drücken Sie in der sich öffnenden Seite die Erstellen Sie den Watson-Service Taste.
Wählen Sie aus der Liste der verfügbaren Dienste aus Visuelle Erkennung.
Sie können dem Dienst jetzt einen aussagekräftigen Namen geben und die Taste drücken Erstellen Taste.
Sobald der Dienst bereit ist, wird dafür ein API-Schlüssel generiert. Sie können es anzeigen, indem Sie das öffnen Dienstanmeldeinformationen Tab und drücken Sie die Anmeldeinformationen anzeigen Taste.
In diesem Lernprogramm verwenden wir die Watson Java- und Android-SDKs, während Sie mit dem Visual Recognition-Dienst interagieren. Wir werden auch die Picasso-Bibliothek verwenden, um Bilder aus dem Internet abzurufen und anzuzeigen. Fügen Sie daher Folgendes hinzu Implementierung
Abhängigkeiten zu Ihrem App
Modul build.gradle Datei:
Implementierung 'com.ibm.watson.developer_cloud: visuelle Erkennung: 3.9.1' Implementierung 'com.ibm.watson.developer_cloud: android-sdk: 0.4.2' Implementierung 'com.squareup.picasso: picasso: 2.5.2'
Um mit Watsons Servern interagieren zu können, benötigt Ihre App die INTERNET
Erlaubnis, so fordern Sie es in Ihrem Projekt an AndroidManifest.xml Datei.
Darüber hinaus benötigt die App, die wir heute erstellen, Zugriff auf die Kamera und die externen Speichermedien des Geräts. Daher müssen Sie auch die anfordern KAMERA
und WRITE_EXTERNAL_STORAGE
Berechtigungen.
Fügen Sie schließlich den API-Schlüssel Ihres Visual Recognition-Dienstes hinzu strings.xml Datei.
a1234567890bcdefe
Das Watson Java SDK stellt alle Funktionen bereit, die der Visual Recognition-Dienst über das Internet bietet VisualRecognition
Klasse. Daher müssen Sie jetzt eine Instanz davon mit seinem Konstruktor initialisieren, der sowohl ein Versionsdatum als auch den API-Schlüssel als Argumente erwartet.
Bei der Verwendung des visuellen Erkennungsdienstes möchten Sie normalerweise Bilder mit der Kamera des Geräts aufnehmen. Das Watson Android SDK verfügt über eine CameraHelper
Klasse, um Ihnen dabei zu helfen. Obwohl Sie dies nicht müssen, sollten Sie auch eine Instanz davon in Ihren Aktivitäten initialisieren onCreate ()
Methode.
private VisualRecognition vrClient; privater CameraHelper-Helfer; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // Initialize Visual Recognition-Client vrClient = new VisualRecognition (VisualRecognition.VERSION_DATE_2016_05_20, getString (R.string.api_key)); // Kamera Helper Helper initialisieren = new CameraHelper (this);
An diesem Punkt haben Sie alles, was Sie benötigen, um mit dem Dienst Bilder zu analysieren.
Der Visual Recognition-Dienst kann eine Vielzahl physischer Objekte erkennen. Als Eingabe erwartet sie ein einigermaßen gut beleuchtetes Bild mit einer Auflösung von mindestens 224 x 224 Pixel. Lassen Sie uns zunächst die Gerätekamera verwenden, um ein solches Bild aufzunehmen.
Der Benutzer muss in der Lage sein, eine Schaltfläche zu drücken, um das Bild aufzunehmen. Die XML-Layoutdatei Ihrer Aktivität muss über eine Taste
Widget. Es muss auch eine Textvorschau
Widget, um die erkannten Objekte aufzulisten.
Optional können Sie auch eine Bildansicht
Widget zum Anzeigen des Bildes.
Im obigen Code haben wir dem Ereignis einen On-Click-Ereignishandler hinzugefügt Taste
Widget. Sie können einen Stub für dieses Widget im Code generieren, indem Sie auf die nebenstehende Glühlampe klicken.
public void takePicture (View View) // Mehr Code hier
Sie können ein Foto aufnehmen, indem Sie einfach die CameraHelper
Objekt ist dispatchTakePictureIntent ()
So fügen Sie den folgenden Code in den Ereignishandler ein:
helper.dispatchTakePictureIntent ();
Die obige Methode verwendet die Standard-Kamera-App des Geräts, um das Bild aufzunehmen. Das heißt, um Zugriff auf das aufgenommene Bild zu erhalten, müssen Sie Ihre Aktivitäten überschreiben onActivityResult ()
Methode und suchen Sie nach Ergebnissen, deren Anforderungscode lautet REQUEST_IMAGE_CAPTURE
. So können Sie das machen:
@Override protected void onActivityResult (int requestCode, int resultCode, Absichtsdaten) super.onActivityResult (requestCode, resultCode, data); if (requestCode == CameraHelper.REQUEST_IMAGE_CAPTURE) // Mehr Code hier
Wenn Sie das richtige Ergebnis gefunden haben, können Sie das Bild in Form von a extrahieren Bitmap
Objekt mit der getBitmap ()
Methode der CameraHelper
Klasse. Sie können den absoluten Pfad des Bildes auch mit der eine Datei bekommen()
Methode. Wir benötigen sowohl die Bitmap als auch den absoluten Pfad. Fügen Sie daher den folgenden Code hinzu:
abschließendes Bitmap-Foto = helper.getBitmap (resultCode); letzte Datei photoFile = helper.getFile (resultCode);
Wenn Sie sich für das Hinzufügen entschieden haben Bildansicht
Widget an Ihr Layout anpassen, können Sie das Bild jetzt anzeigen, indem Sie die Bitmap direkt an ihr Layout übergeben setImageBitmap ()
Methode.
ImageView-Vorschau = findViewById (R.id.preview); preview.setImageBitmap (Foto);
Um Elemente im Bild zu erkennen, müssen Sie das Bild als Eingabe an das Bild übergeben klassifizieren()
Methode der VisualRecognition
Objekt. Bevor Sie dies tun, müssen Sie es jedoch in ein packen ClassifyImagesOptions
Objekt, das mit dem erstellt werden kann ClassifyImagesOptions.Builder
Klasse.
Der Rückgabewert von klassifizieren()
Methode ist a ServiceCall
Objekt, das sowohl synchrone als auch asynchrone Netzwerkanforderungen unterstützt. Für jetzt nennen wir es ausführen()
Methode, um eine synchrone Anfrage zu stellen. Da Netzwerkoperationen im UI-Thread nicht zulässig sind, müssen Sie dies natürlich von einem neuen Thread aus tun.
AsyncTask.execute (new Runnable () @Override public void run () Antwort von VisualClassification = vrClient.classify (neuer ClassifyImagesOptions.Builder () .images (photoFile) .build ()) .execute (); // Mehr Code hier );
Das klassifizieren()
Die Methode ist so konzipiert, dass mehrere Bilder gleichzeitig verarbeitet werden können. Folglich ist ihre Antwort eine Liste von Klassifizierungsdetails. Da wir gerade mit einem einzelnen Bild arbeiten, benötigen wir nur den ersten Eintrag der Liste. So können Sie es bekommen:
ImageClassification-Klassifikation = response.getImages (). Get (0); VisualClassifier classifier = category.getClassifiers (). Get (0);
Der visuelle Erkennungsdienst behandelt jedes erkannte Element als separate Klasse vom Typ VisualClassifier.VisualClass
. Indem Sie die getClasses ()
Methode können Sie eine Liste aller Klassen erhalten.
Jede Klasse hat unter anderem einen Namen und eine Vertrauensbewertung. Der folgende Code zeigt, wie Sie die Liste der Klassen durchlaufen und nur die Namen derjenigen anzeigen, deren Werte in der Klasse über 70% liegen Textvorschau
Widget.
final StringBuffer output = new StringBuffer (); für (VisualClassifier.VisualClass-Objekt): classifier.getClasses ()) if (object.getScore ()> 0.7f) output.append ("<") .append(object.getName()) .append("> "); runOnUiThread (new Runnable () @Override public void run () TextView detectObjects = findViewById (R.id.detected_objects); detectObjects.setText (output););
Beachten Sie, dass der obige Code die runOnUiThread ()
Methode, weil der Inhalt der Textvorschau
Das Widget kann nur vom UI-Thread aus aktualisiert werden.
Wenn Sie die App jetzt ausführen und ein Foto aufnehmen, können Sie die Bildklassifizierung von Watson sehen.
Der visuelle Erkennungsdienst verfügt über eine dedizierte Methode zur Verarbeitung menschlicher Gesichter. Es kann das Alter und Geschlecht einer Person in einem Foto bestimmen. Wenn die Person berühmt ist, kann sie auch benannt werden.
Das Analysieren von Gesichtern mit dem Visual Recognition-Dienst unterscheidet sich nicht zu sehr von der Klassifizierung von Objekten. Sie können also das zuvor erstellte Layout wieder verwenden. Um Ihnen jedoch einige weitere Funktionen des Dienstes vorzustellen, werde ich ein neues Layout erstellen, dieses mit einer etwas anderen Funktionalität.
Lassen Sie uns diesmal, anstatt Bilder mit der Kamera aufzunehmen und an den Dienst zu übergeben, direkt eine Bild-URL an sie übergeben. Damit der Benutzer eine URL eingeben und die Analyse starten kann, benötigt unser Layout eine Text bearbeiten
Widget und ein Taste
Widget. Es wird auch ein brauchen Textvorschau
Widget, um die Ergebnisse der Analyse anzuzeigen.
Ich schlage vor, dass Sie auch eine hinzufügen Bildansicht
Widget an das Layout an, damit der Benutzer das Bild sehen kann, auf das die URL verweist.
Im On-Click-Handler der Taste
Widget können Sie das anrufen getText ()
Methode der Text bearbeiten
Widget, um die Bild-URL zu bestimmen, die der Benutzer eingegeben hat. Wenn Sie die URL kennen, können Sie sie einfach an Picassos übergeben Belastung()
und in()
Methoden zum Herunterladen und Anzeigen des Bildes im Bildansicht
Widget.
EditText imageURLInput = findViewById (R.id.image_url); final String url = imageURLInput.getText (). toString (); ImageView-Vorschau = findViewById (R.id.preview); Picasso.with (this) .load (url) .into (Vorschau);
Um die Gesichtsanalyse für die URL auszuführen, müssen Sie die detectFaces ()
Methode der VisualRecognition
Klient. Genau wie das klassifizieren()
Methode, auch diese Methode benötigt eine VisualRecognitionOptions
Objekt als Eingabe.
Weil Sie bereits wissen, wie Sie das benutzen ausführen()
Methode um synchrone Anfragen zu stellen, rufen wir jetzt die Enqueue ()
Stattdessen wird diese Methode asynchron ausgeführt und benötigt einen Rückruf. Der folgende Code zeigt Ihnen wie:
vrClient.detectFaces (new VisualRecognitionOptions.Builder () .url (url) .build ()) .enqueue (neuer ServiceCallback() @Override public void onResponse (Antwort von DetectedFaces) // hier mehr Code @Override public void onFailure (Ausnahme e) );
Wie Sie im obigen Code sehen können, im onResponse ()
Methode des Callback-Objekts haben Sie Zugriff auf eine Erkannte Gesichter
Objekt, das eine Liste der Ergebnisse der Gesichtsanalyse enthält. Da wir ein einzelnes Bild als Eingabe verwendet haben, benötigen wir nur den ersten Eintrag der Liste. Indem ich es anrufe getFaces ()
Methode erhalten Sie eine Liste aller Gesicht
Objekte erkannt.
Listefaces = response.getImages (). get (0) .getFaces ();
Jeder Gesicht
Das Objekt verfügt über ein Geschlecht und einen Altersbereich, auf das Sie zugreifen können, indem Sie das aufrufen getGender ()
und getAge ()
Methoden.
Das getGender ()
Methode gibt tatsächlich ein Geschlecht
Objekt. Sie müssen sich selbst nennen getGender ()
Methode, um das Geschlecht als Zeichenfolge abzurufen, entweder "MALE" oder "FEMALE". Ebenso die getAge ()
Methode gibt ein zurück Alter
Objekt. Indem ich es anrufe getMin ()
und getMax ()
Methoden können Sie das ungefähre Alter des Gesichts in Jahren bestimmen.
Der folgende Code zeigt, wie Sie die Liste von durchlaufen Gesicht
erzeugen Sie eine Zeichenfolge, die die Geschlechter und das Alter aller Gesichter enthält, und zeigen Sie sie im Fenster an Textvorschau
Widget:
String-Ausgabe = ""; für (Gesicht: Gesichter) Ausgabe + = "<" + face.getGender().getGender() + ", " + face.getAge().getMin() + " - " + face.getAge().getMax() + " years old>\ n "; TextView personDetails = findViewById (R.id.person_details); personDetails.setText (Ausgabe);
Hier ist ein Beispiel für eine Gesichtsanalyse:
Mit dem Watson Visual Recognition-Dienst können Sie äußerst leicht Apps erstellen, die intelligent sind und sich ihrer Umgebung bewusst sind. In diesem Lernprogramm haben Sie gelernt, wie Sie es mit den Watson Java- und Android-SDKs verwenden, um generische Objekte und Gesichter zu erkennen und zu analysieren.
Weitere Informationen zu diesem Dienst finden Sie in der offiziellen Dokumentation.
Auf Envato Tuts finden Sie auch einige unserer anderen Beiträge zum Maschinellen Lernen+!