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ör att kunna följa denna handledning måste du ha:
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:
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.
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:
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.
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.
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);
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 ();
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.
Listaansikten = 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
:
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; iNu 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 romanStegen 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 antingenTEXT_DETECTION
ellerDOCUMENT_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 ringagetFullTextAnnotation ()
metod för att få enTextAnnotation
objekt som innehåller all den extraherade texten.sista TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();Du kan då ringa
gettext ()
metod förTextAnnotation
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!