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ör att få ut det mesta av denna handledning är allt du behöver:
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.
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
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.
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.
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.
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);
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; iDu 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 dinAktivitet
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ärOm du vill lägga till fält i frågesträngen i ovanstående URL kan vi använda en
Lista
avPar
objekt. Följande fält är viktiga:
nyckel-
, specificerar din hemliga API-nyckelkälla
, Ange vilket språk du vill översätta frånmål
, Ange vilket språk du vill översätta tillq
, specificerar texten du vill översättaFö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 layoutsTextview
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örBrä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ändaresponseString ()
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örHanterare
klass, låt oss helt enkelt gå igenomöversättningar
array av ovanstående JSON-dokument och uppdatera innehållet iTextview
widget med de värden som är associerade medtranslatedText
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; iOm 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!