Slik bruker du Google Cloud Vision API i Android Apps

Datasyn anses å være et AI-komplett problem. Med andre ord, å løse det ville tilsvare å skape et program som er så smart som mennesker. Det er unødvendig å si at et slikt program ennå ikke skal opprettes. Men hvis du noen gang har brukt apper som Google Goggles eller Google Photos, eller så på segmentet på Google Lens i hovedinngangen til Google I / O 2017, forstår du sannsynligvis at datasynet har blitt veldig kraftig..

Gjennom en REST-basert API kalles Cloud Vision API, deler Google sin revolusjonerende visjonsrelaterte teknologier med alle utviklere. Ved å bruke API, kan du enkelt legge til imponerende funksjoner som ansiktsgjenkjenning, følelsesdeteksjon og optisk tegngjenkjenning til Android-appene dine. I denne veiledningen vil jeg vise deg hvordan.

Forutsetninger

For å kunne følge denne opplæringen må du ha:

  • en Google Cloud Platform-konto
  • et prosjekt på Google Cloud-konsollen
  • den nyeste versjonen av Android Studio
  • og en enhet som kjører Android 4.4 eller høyere

Hvis noen av de ovennevnte kravene høres ukjent for deg, foreslår jeg at du leser følgende introduksjonsveiledning om Google Cloud Machine Learning-plattformen:

1. Aktivere API for Cloud Vision

Du kan bruke Cloud Vision API i Android-appen din først etter at du har aktivert den i Google Cloud-konsollen og oppnådd en gyldig API-nøkkel. Så start med å logge inn på konsollen og navigere til API Manager> Bibliotek> Vision API. På siden som åpnes, trykk bare på Aktiver knapp.

Hvis du allerede har generert en API-nøkkel for Cloud-konsollprosjektet, kan du hoppe over til neste trinn fordi du vil kunne bruke den på nytt med Cloud Vision API. Ellers åpner du legitimasjon fanen og velg Opprett legitimasjon> API-nøkkel.

I dialogboksen som dukker opp, ser du API-nøkkelen din.

2. legge til avhengigheter

Som de fleste andre APIer som tilbys av Google, kan Cloud Vision API nås ved hjelp av Google API Client-biblioteket. For å bruke biblioteket i Android Studio-prosjektet, legg til følgende kompilere avhengigheter i app modulens build.gradle fil:

kompilere 'com.google.api-client: google-api-client-android: 1.22.0' compile 'com.google.apis: google-api-services-visjon: v1-rev357-1.22.0' compile 'com. google.code.findbugs: JSR305: 2.0.1'

Videre for å forenkle fil I / O-operasjoner, foreslår jeg at du også legger til en kompilere avhengighet for Apache Commons IO biblioteket.

kompilere 'commons-io: commons-io: 2,5'

Fordi Google API-klienten kan fungere bare hvis appen din har INTERNETT tillatelse, sørg for at følgende linje er tilstede i prosjektets manifestfil:

3. Konfigurere API-klienten

Du må konfigurere Google API-klienten før du bruker den til å samhandle med Cloud Vision API. Dette gjør primært med å spesifisere API-nøkkelen, HTTP-transporten og JSON-fabrikken den skal bruke. Som du kanskje forventer, er HTTP-transporten ansvarlig for kommunikasjon med Googles servere, og JSON-fabrikken vil blant annet være ansvarlig for å konvertere de JSON-baserte resultatene API genererer i Java-objekter. 

For moderne Android-apper anbefaler Google at du bruker NetHttpTransport klassen som HTTP-transport og AndroidJsonFactory klasse som JSON fabrikk.

De Syn klassen representerer Google API-klienten for Cloud Vision. Selv om det er mulig å lage en forekomst av klassen ved hjelp av sin konstruktør, gjør det ved å bruke Vision.Builder Klassen i stedet er enklere og mer fleksibel.

Mens du bruker Vision.Builder klasse, må du huske å ringe setVisionRequestInitializer () Metode for å angi API-nøkkelen din. Følgende kode viser deg hvordan:

Vision.Builder visionBuilder = ny Vision.Builder (ny NetHttpTransport (), ny AndroidJsonFactory (), null); visionBuilder.setVisionRequestInitializer (ny VisionRequestInitializer ("YOUR_API_KEY"));

Først når Vision.Builder forekomsten er klar, du kan ringe den bygge() metode for å generere en ny Syn eksempel du kan bruke i hele appen din.

Visjon visjon = visionBuilder.build ();

På dette tidspunktet har du alt du trenger for å begynne å bruke Cloud Vision API.

4. Oppdage og analysere ansikter

Detektering av ansikter i fotografier er et meget vanlig krav i datamaskinselaterte applikasjoner. Med Cloud Vision API kan du opprette en svært nøyaktig ansiktsdetektor som også kan identifisere følelser, lysforhold og ansiktsmiljøer.

For demonstrasjons skyld kjører vi ansiktsgjenkjenning på følgende bilde, som inneholder besetningen til Apollo 9:

Jeg foreslår at du laster ned en høyoppløselig versjon av bildet fra Wikimedia Commons og legger det i prosjektets res / rå mappe.

Trinn 1: Kod på bildet

Cloud Vision API forventer at inngangsbildet blir kodet som en Base64-streng som er plassert i en Bilde gjenstand. Før du genererer et slikt objekt, må du imidlertid konvertere bildet du lastet ned, som for tiden er en rå bilderessurs, til en byte array. Du kan raskt gjøre det ved å åpne inngangsstrømmen ved hjelp av openRawResource () metode av ressurser klasse og passerer den til toByteArray () metode av IOUtils klasse.

Fordi fil I / O-operasjoner ikke skal kjøres på brukergrensesnittet, må du sørge for at du får en ny tråd før du åpner inngangsstrømmen. Følgende kode viser deg hvordan:

// Opprett ny tråd AsyncTask.execute (ny Runnable () @Override public void run () // Konverter bilde til byte array InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Mer kode her);

Du kan nå opprette en Bilde objekt ved å ringe sin standard konstruktør. For å legge til byte array til den som en Base64-streng, alt du trenger å gjøre er å passere arrayet til det encodeContent () metode.

Bilde inputImage = nytt bilde (); inputImage.encodeContent (photoData);

Trinn 2: Lag en forespørsel

Fordi Cloud Vision API inneholder flere forskjellige funksjoner, må du spesifikt spesifisere funksjonen du er interessert i mens du gjør en forespørsel. For å gjøre dette må du opprette en Trekk objekt og ring det setType () metode. Følgende kode viser hvordan du lager en Trekk bare motstand for ansiktsgjenkjenning:

Funksjon desiredFeature = ny funksjon (); desiredFeature.setType ( "FACE_DETECTION");

Bruker Bilde og Trekk Objekter, du kan nå komponere en AnnotateImageRequest forekomst.

AnnotateImageRequest request = ny AnnotateImageRequest (); request.setImage (inputImage); request.setFeatures (Arrays.asList (desiredFeature));

Legg merke til at en AnnotateImageRequest objekt må alltid tilhøre a BatchAnnotateImagesRequest objekt fordi API for Cloud Vision er designet for å behandle flere bilder samtidig. For å initialisere en BatchAnnotateImagesRequest forekomst som inneholder en enkelt AnnotateImageRequest objekt, kan du bruke Arrays.asList () verktøymetode.

BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (request));

For å faktisk gjøre ansiktsgjenkjenningsforespørselen, må du ringe henrette() metode av en Kommenter objekt som er initialisert ved hjelp av BatchAnnotateImagesRequest Motta deg nettopp opprettet. For å generere et slikt objekt må du ringe merknader () Metode som tilbys av Google API-klienten for Cloud Vision. Dette er hvordan:

BatchAnnotateImagesResponse batchResponse = vision.images (). Annotate (batchRequest) .execute ();

Trinn 3: Bruk svaret

Når forespørselen er behandlet, får du en BatchAnnotateImagesResponse objekt som inneholder svaret fra API-en. For en ansiktsdeteksjonsforespørsel inneholder svaret a FaceAnnotation objekt for hvert ansikt API har oppdaget. Du kan få en liste over alle FaceAnnotation objekter som bruker getFaceAnnotations () metode.

Liste ansikter = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

EN FaceAnnotation objekt inneholder mye nyttig informasjon om et ansikt, for eksempel dets plassering, dets vinkel og følelsene den uttrykker. Fra versjon 1 kan API bare oppdage følgende følelser: glede, sorg, sinne og overraskelse.

For å holde denne opplæringen kort, la oss nå bare vise følgende informasjon i en Skål:

  • Antall ansikter
  • Sannsynligheten for at de uttrykker glede

Du kan selvfølgelig få tellingen av ansiktene ved å ringe størrelse() metode av Liste inneholder FaceAnnotation objekter. For å få sannsynligheten for at et ansikt uttrykker glede, kan du ringe det intuitivt navngitte getJoyLikelihood () metode for den tilknyttede FaceAnnotation gjenstand. 

Merk at fordi en enkel Skål kan bare vise en enkelt streng, du må sammenkalle alle de ovennevnte detaljene. I tillegg a Skål Kan bare vises fra brukergrensesnittet, så sørg for at du ringer det etter at du har ringt til runOnUiThread () metode. Følgende kode viser deg hvordan:

// Antall ansikter int numberOfFaces = faces.size (); // Få glede sannhet for hvert ansikt String sannsynlighet = ""; for (int i = 0; i

Du kan nå gå videre og kjøre appen for å se følgende resultat:

5. Lesing av tekst

Prosessen med å trekke ut strenger fra bilder av tekst kalles optisk tegngjenkjenning, eller OCR for kort. Cloud Vision API lar deg enkelt lage en optisk tegnleser som kan håndtere bilder av både trykt og håndskrevet tekst. Dessuten vil leseren du lager, ikke ha problemer med å lese vinklet tekst eller tekst som er lagt på et fargerikt bilde.

API gir to forskjellige funksjoner for OCR:

  • TEXT_DETECTION, for å lese små mengder tekst, for eksempel det som er tilstede på skilt eller bokomslag
  • og DOCUMENT_TEXT_DETECTION, for å lese store mengder tekst, for eksempel det som er tilstede på sidene til en roman

Trinnene du må følge for å lage en OCR-forespørsel, er identiske med trinnene du fulgte for å foreta en ansiktsdeteksjonsforespørsel, unntatt hvordan du initialiserer Trekk gjenstand. For OCR må du sette sin type til enten TEXT_DETECTION eller DOCUMENT_TEXT_DETECTION. For nå, la oss gå med den tidligere.

Funksjon desiredFeature = ny funksjon (); desiredFeature.setType ( "TEXT_DETECTION");

Du må selvfølgelig også legge inn et bilde som inneholder tekst inni prosjektet ditt res / rå mappe. Hvis du ikke har et slikt bilde, kan du bruke denne, som viser et gateskilt:

Du kan laste ned en høyoppløselig versjon av bildet ovenfor fra Wikimedia Commons.

For å begynne å behandle resultatene av en OCR-operasjon, etter at du har oppnådd BatchAnnotateImagesResponse objekt, må du ringe getFullTextAnnotation () metode for å få en TextAnnotation objekt som inneholder all utvunnet tekst.

Endelig TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();

Du kan da ringe til GetText () metode av TextAnnotation motsette seg faktisk å få en referanse til en streng som inneholder den ekstraherte teksten.

Følgende kode viser hvordan du viser den uttrukne teksten ved hjelp av a Skål:

Toast.makeText (getApplicationContext (), text.getText (), Toast.LENGTH_LONG) .show ();

Hvis du kjører appen din nå, bør du se noe slikt:

Konklusjon

I denne opplæringen lærte du hvordan du bruker Cloud Vision API for å legge til ansiktsgjenkjenning, følelsesdeteksjon og muligheter for optisk tegngjenkjenning til Android-appene dine. Jeg er sikker på at du er enig med meg når jeg sier at disse nye funksjonene vil tillate at appene dine tilbyr mer intuitive og smartere brukergrensesnitt.

Det er verdt å nevne at det er en viktig funksjon som mangler i Cloud Vision API: ansiktsgjenkjenning. I sin nåværende form kan API bare oppdage ansikter, ikke identifisere dem.

For å lære mer om API, kan du se den offisielle dokumentasjonen.

Og i mellomtiden, sjekk ut noen av våre andre opplæringsprogrammer når du legger til datamaskinlæring i Android-appene dine!