Så här använder du Google Cloud Vision API i Android Apps

Datorsyn anses vara ett AI-komplett problem. Med andra ord skulle lösa det vara lika med att skapa ett program som är lika smart som människor. Det är självklart att ett sådant program ännu inte ska skapas. Men om du någonsin har använt appar som Google Goggles eller Google Photos-eller tittat på segmentet på Google Lens i huvudtalet till Google I / O 2017, inser du förmodligen att datorsyn har blivit mycket kraftfull.

Genom ett REST-baserat API kallat Cloud Vision API delar Google sin revolutionerande visionrelaterade teknik med alla utvecklare. Genom att använda API kan du enkelt lägga till imponerande funktioner som ansiktsdetektering, känslighetsdetektering och optisk teckenigenkänning i dina Android-appar. I denna handledning visar jag dig hur.

förutsättningar

För att kunna följa denna handledning måste du ha:

  • ett Google Cloud Platform-konto
  • ett projekt på Google Cloud-konsolen
  • den senaste versionen av Android Studio
  • och en enhet som kör Android 4.4 eller högre

Om några av ovanstående krav låter okända för dig, föreslår jag att du läser följande inledande handledning om Google Cloud Machine Learning-plattformen:

1. Aktivera API för molnsvision

Du kan använda Cloud Vision API i din Android-app först efter att du har aktiverat det i Google Cloud-konsolen och köpt en giltig API-nyckel. Börja med att logga in i konsolen och navigera till API Manager> Bibliotek> Vision API. På den sida som öppnas trycker du bara på Gör det möjligt knapp.

Om du redan har skapat en API-nyckel för ditt Cloud-konsolprojekt, kan du hoppa över till nästa steg eftersom du kommer att kunna återanvända det med Cloud Vision API. Annars öppnar du Referenser fliken och välj Skapa referenser> API-nyckel.

I dialogrutan som dyker upp ser du din API-nyckel.

2. Lägga till beroende

Liksom de flesta andra API-er som erbjuds av Google, kan Cloud Vision API nås med hjälp av Google API-klientbiblioteket. För att använda biblioteket i ditt Android Studio-projekt, lägg till följande sammanställa beroenden i app modulens build.gradle fil:

kompilera "com.google.api-client: google-api-client-android: 1.22.0" kompilera "com.google.apis: google-api-services-vision: v1-rev357-1.22.0" compile "com. google.code.findbugs: JSR305: 2.0.1'

För att förenkla filen I / O-operationer, föreslår jag att du också lägger till en sammanställa beroende av Apache Commons IO-biblioteket.

kompilera "commons-io: commons-io: 2,5"

Eftersom Google API-klienten kan fungera endast om din app har INTERNET tillstånd, se till att följande rad finns i ditt projekts manifestfil:

3. Konfigurera API-klienten

Du måste konfigurera Google API-klienten innan du använder den för att interagera med Cloud Vision API. Detta innebär i första hand att ange API-nyckeln, HTTP-transporten och den JSON-fabrik som den ska använda. Som du kan förvänta dig är HTTP-transporten ansvarig för kommunikation med Googles servrar, och JSON-fabriken kommer bland annat att ansvara för att konvertera JSON-baserade resultat som API genererar i Java-objekt. 

För moderna Android-appar rekommenderar Google att du använder NetHttpTransport klass som HTTP-transport och AndroidJsonFactory klass som JSON-fabriken.

De Syn klassen representerar Google API-klienten för Cloud Vision. Även om det är möjligt att skapa en instans av klassen med sin konstruktör, gör så med Vision.Builder klassen istället är lättare och mer flexibel.

Medan du använder Vision.Builder klass måste du komma ihåg att ringa setVisionRequestInitializer () metod för att ange din API-nyckel. Följande kod visar hur:

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

När Vision.Builder Exempel är redo, du kan ringa det bygga() Metod för att skapa en ny Syn Exempel du kan använda i hela appen.

Visionsvision = visionBuilder.build ();

Vid den här tiden har du allt du behöver för att börja använda Cloud Vision API.

4. Upptäcka och analysera ansikten

Detektering av ansikten i fotografier är ett mycket vanligt krav i datorvisningsrelaterade applikationer. Med Cloud Vision API kan du skapa en mycket korrekt ansiktsdetektor som också kan identifiera känslor, ljusförhållanden och ansiktsmärken.

För demonstrationens skull kommer vi att köra ansiktsdetektering på följande foto, vilket innehåller besättningen Apollo 9:

Jag föreslår att du hämtar en högupplöst upplösning av bilden från Wikimedia Commons och lägger den i ditt projekt res / rå mapp.

Steg 1: Koda fotot

Cloud Vision API förväntar sig att dess inmatningsbild kodas som en Base64-sträng som placeras inuti en Bild objekt. Innan du genererar ett sådant objekt måste du dock konvertera det foto du hämtade, vilket för närvarande är en råbildningsresurs till en bitgrupp array. Du kan snabbt göra det genom att öppna dess ingångsström med hjälp av openRawResource () metod för Medel klass och passerar den till toByteArray () metod för IOUtils klass.

Eftersom filen I / O-operationer inte ska köras på UI-tråden, se till att du hämtar en ny tråd innan du öppnar inmatningsströmmen. Följande kod visar hur:

// Skapa ny tråd AsyncTask.execute (new Runnable () @Override public void run () // Konvertera foto till byte array InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Mer kod här);

Du kan nu skapa en Bild objekt genom att ringa sin standardkonstruktor. För att lägga till bitgrupp array till den som en Base64-sträng är allt du behöver göra att passera arrayen till dess encodeContent () metod.

Image inputImage = ny bild (); inputImage.encodeContent (photoData);

Steg 2: Gör en förfrågan

Eftersom Cloud Vision API erbjuder flera olika funktioner måste du explicit ange vilken funktion du är intresserad av när du gör en begäran om det. För att göra det måste du skapa en Funktion objekt och ring dess setType () metod. Följande kod visar hur du skapar en Funktion Objekt för ansiktsigenkänning endast:

Funktion önskadFeature = Ny funktion (); desiredFeature.setType ( "FACE_DETECTION");

Använda Bild och den Funktion objekt, du kan nu komponera en AnnotateImageRequest exempel.

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

Observera att en AnnotateImageRequest objektet måste alltid tillhöra a BatchAnnotateImagesRequest objektet eftersom Cloud Vision API är utformat för att bearbeta flera bilder samtidigt. För att initiera en BatchAnnotateImagesRequest exempel som innehåller en singel AnnotateImageRequest objekt, du kan använda Arrays.asList () verktygsmetod.

BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (begäran));

För att faktiskt göra ansökningsdetektering måste du ringa Kör() metod av en Kommentera objekt som initialiseras med hjälp av BatchAnnotateImagesRequest objekt som du just skapat. För att generera ett sådant objekt måste du ringa kommentera() Metod som erbjuds av Google API-klienten för Cloud Vision. Här är hur:

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

Steg 3: Använd svaret

När förfrågan har behandlats får du en BatchAnnotateImagesResponse objekt som innehåller svaret från API: n. För en ansökningssökningsförfrågan innehåller svaret a FaceAnnotation objekt för varje ansikte som API har upptäckt. Du kan få en lista över alla FaceAnnotation objekt som använder getFaceAnnotations () metod.

Lista ansikten = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

en FaceAnnotation objekt innehåller mycket användbar information om ett ansikte, till exempel dess plats, dess vinkel och de känslor den uttrycker. Från version 1 kan API endast upptäcka följande känslor: glädje, sorg, ilska och överraskning.

För att hålla denna handledning kort, låt oss nu bara visa följande information i en Rostat bröd:

  • Ansikten räknas
  • Sannolikheten för att de uttrycker glädje

Du kan förstås räkna ansikten genom att ringa storlek() metod för Lista innehållande FaceAnnotation objekt. För att få sannolikheten för ett ansikte som uttrycker glädje kan du ringa det intuitivt namnet getJoyLikelihood () metod för de associerade FaceAnnotation objekt. 

Observera att för en enkel Rostat bröd kan bara visa en enda sträng, du måste sammanfoga alla ovanstående detaljer. Dessutom a Rostat bröd kan bara visas från användargränssnittet, så se till att du ringer det efter att ha ringt runOnUiThread () metod. Följande kod visar hur:

// Räknar ansikten int numberOfFaces = faces.size (); // Få glädje sannolikhet för varje ansikte String sannolikheter = ""; för (int i = 0; i

Nu kan du gå och köra appen för att se följande resultat:

5. Läser text

Processen att extrahera strängar från bilder av text kallas optisk teckenigenkänning, eller OCR för kort. Cloud Vision API gör att du enkelt kan skapa en optisk teckenläsare som kan hantera bilder av både tryckt och handskriven text. Dessutom får läsaren du skapar inga problem med att läsa vinklad text eller text som överlagras på en färgstark bild.

API: n erbjuder två olika funktioner för OCR:

  • TEXT_DETECTION, för att läsa små mängder text, som det som finns på skyltar eller bokomslag
  • och DOCUMENT_TEXT_DETECTION, för att läsa stora mängder text, till exempel det som finns på sidorna i en roman

Stegen du behöver följa för att göra en OCR-förfrågan är identisk med de steg du följde för att göra en ansökningsdetektering, förutom hur du initierar Funktion objekt. För OCR måste du ange dess typ till antingen TEXT_DETECTION eller DOCUMENT_TEXT_DETECTION. För nu, låt oss gå med den förra.

Funktion önskadFeature = Ny funktion (); desiredFeature.setType ( "TEXT_DETECTION");

Du måste självklart också lägga in ett foto med text i ditt projekt res / rå mapp. Om du inte har ett sådant foto kan du använda den här som visar ett gatustecken:

Du kan hämta en högupplöstupplösning av ovanstående foto från Wikimedia Commons.

För att börja bearbeta resultaten av en OCR-operation, efter att du har erhållit BatchAnnotateImagesResponse objekt, du måste ringa getFullTextAnnotation () metod för att få en TextAnnotation objekt som innehåller all den extraherade texten.

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

Du kan då ringa gettext () metod för TextAnnotation motsätta sig att få en referens till en sträng som innehåller den extraherade texten.

Följande kod visar hur du visar den extraherade texten med hjälp av a Rostat bröd:

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

Om du kör din app nu bör du se något så här:

Slutsats

I den här handledningen lärde du dig hur du använder Cloud Vision API för att lägga till ansiktsdetektering, känslighetsdetektering och optiska teckenigenkänningsfunktioner i dina Android-appar. Jag är säker på att du håller med mig när jag säger att dessa nya funktioner kommer att låta dina appar erbjuda mer intuitiva och smartare användargränssnitt.

Det är värt att nämna att det finns en viktig egenskap som saknas i Cloud Vision API: ansiktsigenkänning. I sin nuvarande form kan API-en bara upptäcka ansikten, inte identifiera dem.

För att lära dig mer om API: n, kan du referera till den officiella dokumentationen.

Och under tiden, kolla in några av våra andra handledning om att lägga till datorinlärning till dina Android-appar!