Så här använder du Google Cloud Machine Learning Services för Android

Nyheter i dessa dagar är fulla av buzzwords som automation, artificiell intelligens och maskininlärning. Det är förmodligen varför fler och fler smartphone-användare börjar leta efter smartare appar. Som en vanlig Android-apputvecklare saknar du förmodligen de resurser som behövs för att skapa sådana appar från början.

Lyckligtvis lanserade Google nyligen en Cloud Machine Learning-plattform, som erbjuder neurala nätverk som har förutbildats för att utföra en rad olika uppgifter. De flesta modellerna är inte bara mycket noggranna, men också ständigt förbättrade. Och gissa vad? Du kan använda dem genom att helt enkelt göra några REST API-samtal!

I denna handledning introducerar jag dig till plattformen Cloud Machine Learning och visar dig hur du använder den för att skapa en smart Android-app som kan identifiera objekt i verkligheten och namnge dem på flera språk.

förutsättningar

För att få ut det mesta av denna handledning är allt du behöver:

  • den senaste versionen av Android Studio
  • En enhet som kör Android 4.4 eller senare
  • och ett Google Cloud Platform-konto

1. Hämta en API-nyckel

För att kunna använda Googles maskininlärningstjänster i din Android-app behöver du en API-nyckel. Du kan få en genom att skapa ett nytt projekt i Google Cloud Platform-konsolen.

Börja med att logga in i konsolen och trycka på Skapa nytt projekt knapp. I dialogrutan som dyker upp, ge ett meningsfullt namn till projektet.

När projektet har skapats, gå till API Manager> Dashboard och tryck på Aktivera API knapp.

På nästa skärm, under Google Cloud Machine Learning rubrik kommer du att kunna se alla de olika API-erna för maskininlärning som är tillgängliga för dig. I den här handledningen använder vi bara Vision and Translation API.

För att aktivera visions API, klicka på länken och tryck på Gör det möjligt knapp.

På samma sätt, för att aktivera översättnings API, klicka på länken och tryck på Gör det möjligt knapp.

Du behöver bara en nyckel för att använda båda API: erna. För att få det, gå till Referenser fliken, tryck på Skapa legitimationsuppgifter knappen och välj API-nyckel.

Du borde nu se en popup som innehåller din hemliga API-nyckel.

2. Skapa ett nytt Android-projekt

Avfyra Android Studio och skapa ett nytt projekt med en tom aktivitet. Jag föreslår att du väljer åtminstone API-nivå 19 för den minsta SDK som stöds.

Även om du inte behöver, är det alltid en bra idé att använda ett robust nätverksbibliotek för att kommunicera med Google Cloud Machine Learning-plattformen. I den här handledningen använder vi ett sådant bibliotek som heter Fuel. Lägg till det som en sammanställa beroendet i app modulens build.gradle fil:

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

Tryck Synkronisera nu för att uppdatera ditt projekt.

Därefter kommer vår app att behöva INTERNET tillåtelse att kommunicera med Googles servrar. Lägg därför till följande rad inuti projektets manifestfil:

Slutligen lägg till din API-nyckel till värden / strings.xml fil:

ABCDEF12345-abcdef12345-123

3. Använda Vision API

Vision API hjälper dig att skapa appar som kan se och ge mening av användarens miljö. Ansiktsigenkänning, känslighetsdetektering, optisk teckenigenkänning och bildannotation är några av dess många funktioner. För närvarande fokuserar vi bara på den kraftfulla bildannoteringsfunktionen, även kallad etikettdetektering, vilket enligt min mening är väldigt användbar.

Som du förväntar dig förväntar du dig en bild som en av dess ingångar. Låt oss nu skapa en skärm där användaren kan ta bilder med hjälp av enhetens kamera.

Steg 1: Skapa en layout

Skärmens layout ska ha en Knapp widget användaren kan trycka för att ta en bild, en Imageview widget för att visa bilden och a Textview widget för att visa etiketterna eller anteckningarna som genereras av API: n. Följ således följande kod till din aktivitets layout XML-fil:

Observera att vi har associerat en onClick hanteraren med knappen. Vi definierar det i nästa steg.

Steg 2: Skapa en avsikt

Genom att skapa en ny avsikt med ACTION_IMAGE_CAPTURE åtgärd och skickar den till startActivityForResult () Metod kan du ställa in standardkameraappen för användarens enhet för att ta bilder och vidarebefordra dem till din app. Lägg därför till följande kod i din Aktivitet klass:

offentliga slutliga statiska int MY_REQUEST_CODE = 1; public void takePicture (Visa vy) Intent intention = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (avsikt, MY_REQUEST_CODE); 

För att kunna ta emot bilderna som tagits med standard kameraapp, måste du åsidosätta onActivityResult () metod för din Aktivitet klass. Inuti metoden får du tillgång till a Bunt objekt som innehåller all bilddata. Du kan göra bilddata genom att helt enkelt konvertera den till en Bitmap och passerar den till Imageview widget.

@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) om (requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) // Konvertera bilddata till bitmapp Bitmap picture = (Bitmap) data.getExtras (). Get "data"); // Ange bitmappen som källan till ImageView ((ImageView) findViewById (R.id.previewImage)) .setImageBitmap (bild); // Mer kod går här

Om du kör appen nu och tar en bild ser du att storleken på bilden är ganska liten. Det är okej, men Cloud Vision API är mycket exakt även med bildminnebilder.

Steg 3: Koda bilden

Visions API kan inte användas Bitmap objekt direkt. Istället förväntar man sig en Base64-kodad sträng komprimerad bilddata.

För att komprimera bilddata kan du använda komprimera() metod för Bitmap klass. Som argument förväntar sig metoden att komprimeringsformat ska användas, önskad utskriftskvalitet och a ByteArrayOutputStream objekt. Följande kod komprimerar bitmappen med JPEG-formatet och säkerställer också att kvaliteten på den resulterande bilden är tillräckligt hög:

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

Du kan nu skapa Base64-strängen med hjälp av encodeToString () metod för Base64 klass.

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

Steg 4: Bearbeta bilden

Efter allt det hårda arbetet har du allt du behöver för att interagera med Vision API. Börja med att skapa en sträng som innehåller både webbadressen till API: n och din API-nyckel:

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

För att skicka data till API måste du skapa en HTTP POST-förfrågan. Förfrågan ska vara ett JSON-dokument som innehåller den Base64-kodade bilddata. För etikettdetektering måste dokumentet också ha en funktioner array som innehåller värdet LABEL_DETECTION. Här är formatet för JSON-dokumentet:

"requests": ["image": "content":  , "funktioner": ["typ": "LABEL_DETECTION"]]

Även om det är möjligt att handskoda JSON-dokumentet, är det mindre felaktigt att skapa det programmatiskt. Följande kod visar hur du gör det med hjälp av JSONObject och JSONArray klasser:

// Skapa en array som innehåller // funktionen LABEL_DETECTION JSONArray features = new JSONArray (); JSONObject-funktion = nytt JSONObject (); feature.put ("typ", "LABEL_DETECTION"); features.put (funktion); // Skapa ett objekt som innehåller // den Base64-kodade bilddata JSONObject imageContent = nytt JSONObject (); imageContent.put ("content", base64Data); // Sätt arrayen och objektet i en enda förfrågan // och lägg sedan förfrågan till en rad begäranden JSONArray requests = new JSONArray (); JSONObject request = nytt JSONObject (); request.put ("image", imageContent); request.put ("features", features); requests.put (begäran); JSONObject postData = nytt JSONObject (); postData.put ("requests", requests); // Konvertera JSON till en // sträng String body = postData.toString ();

Vid denna tidpunkt kan vi använda posta() metod för Bränsle klass för att göra HTTP POST-förfrågan. Som ett enda argument förväntar sig metoden URL: n för API: n. Du måste också inkludera innehåll-längd och innehållstyp rubriker i begäran. För att göra det, använd rubrik() metod. På samma sätt, för att lägga till JSON-dokumentet till kroppen för POST-förfrågan, använd posta() metod.

Slutligen, genom att ringa responseString () metod och passerar en ny instans av Hanterare klass till det, kan du asynkront få svaret på begäran som en sträng. Följ således följande kod:

Fuel.post (requestURL) .header (nytt par("innehållslängd", body.length ()), nytt par("content-type", "application / json")) .body (body.getBytes ()) .responseString (new Handler() @Override public void success (@NotNull Request Request, @NotNull Response Response, String data) // Mer kod går här @Override public void failure (@NotNull Request request, @NotNull Response svar, @NotNullNullNullFuelError fuelError ) );

När du använder etikettdetekteringsfunktionen returnerar Vision API ett JSON-dokument som innehåller etiketter. Tillsammans med varje etikett får du också ett betyg som anger hur exakt etiketten är. Dokumentet ser så här ut:

"label": "[m" id = "" , "beskrivning": "label2", "score": 0.90, ...]

För nu, låt oss bara slingra igenom alla föremål i labelAnnotations array och lägg till värdet av varje beskrivning nyckeln till Textview widgeten i vår layout. Så här kan du göra det inuti Framgång() metod för Hanterare klass:

// Öppna etikettenAnnotations arrayerna JSONArray labels = nya JSONObject (data) .getJSONArray ("svar") .getJSONObject (0) .getJSONArray ("labelAnnotations"); Stringresultat = ""; // Loop genom arrayen och extrahera // beskrivningsnyckeln för varje punkt för (int i = 0; i

Du kan nu köra appen, ta en bild av ett objekt i närheten och se etiketterna som Vision API genererar för det.

4. Använda översättnings API

Cloud Translation Translation API, som namnet antyder, kan översätta text till och från över 100 språk. Genom att använda den effektivt kan du skapa smarta appar som kan kommunicera med dina användare på sina egna språk.

I föregående steg såg du att etiketterna som vår app genererar är på engelska. Låt oss nu lägga till en knapp för att översätta dessa etiketter till tyska.

Steg 1: Uppdatera layouten

Lägg till en Knapp widgeten mot slutet av din aktivitets layout med följande kod:

Observera att den här knappen också har en onClick händelsehanterare som måste definieras i din Aktivitet klass.

Steg 2: Översätt etiketterna

Använda översättnings API är mycket enklare än att använda Vision API, främst för att du inte behöver skapa ett JSON-dokument för att definiera din begäran. I stället kan du enkelt skicka parametrar till den i en fråge sträng.

Skapa translateToGerman () metod och, inuti det, skapa en sträng som innehåller URL-adressen till översättnings API.

public void translateToGerman (Visa vy) String requestURL = "https://translation.googleapis.com/language/translate/v2"; // Mer kod går här

Om du vill lägga till fält i frågesträngen i ovanstående URL kan vi använda en Lista av Par objekt. Följande fält är viktiga:

  • nyckel-, specificerar din hemliga API-nyckel
  • källa, Ange vilket språk du vill översätta från
  • mål, Ange vilket språk du vill översätta till
  • q, specificerar texten du vill översätta

Följande kod visar hur du konfigurerar API: n för att översätta från engelska till tyska:

Lista> parametrar = ny ArrayList <> (); // Lägg till API-tangenten params.add (nytt par("nyckel", getResources (). getString (R.string.mykey))); // Ange källa och målspråk params.add (nytt par("källa", "en")); params.add (nytt par("mål", "de"));

Eftersom frågesträngen kan innehålla flera q fält lägger vi till en för varje etikett som finns närvarande i vår layouts Textview widget. Här är hur:

String [] queries = ((TextView) findViewById (R.id.resultsText)) .getText (). ToString (). Split ("\ n"); för (Stringfråga: frågor) params.add (nytt par("q", fråga)); 

Slutligen kan du ringa skaffa sig() metod för Bränsle klass för att göra en HTTP GET-förfrågan till översättnings API. Även den här gången kan du använda responseString () Metod för att asynkront få svaret som en sträng.

Fuel.get (requestURL, params) .responseString (new Handler() @Override public void success (@NotNull Request Request, @NotNull Response Response, String data) // Mer kod här @Override public void failure (@NotNull Request request, @NotNull Response response, @NotNullNullNullFuelError fuelError) );

Svaret från översättnings API är ett JSON-dokument som innehåller en rad översättningar. Den har följande format:

"data": "translations": ["translatedText": "...", "translatedText": "...", ...]

För nu, inne i Framgång() metod för Hanterare klass, låt oss helt enkelt gå igenom översättningar array av ovanstående JSON-dokument och uppdatera innehållet i Textview widget med de värden som är associerade med translatedText nycklar.

// Öppna översättningsuppsättningen JSONArray translations = new JSONObject (data) .getJSONObject ("data") .getJSONArray ("translations"); // Loop genom arrayen och extrahera translatedText // -knappen för varje objekt String result = ""; för (int i = 0; i

Om du kör appen nu, skapa etiketter för en bild och tryck på den andra knappen, så ska du kunna se etiketterna på tyska.

Slutsats

I den här handledningen lärde du dig att använda API: erna Cloud Vision and Cloud Translation, som ingår i Google Cloud Machine Learning-plattformen, i en Android-app. Det finns många fler sådana API: er som erbjuds av plattformen. Du kan lära dig mer om dem genom att referera till den officiella dokumentationen. 

Medan du är här, kolla in några av våra andra handledning om hur du använder maskininlärning och molntjänster i dina Android-appar!