De Google Cloud Vision-API gebruiken in Android-apps

Computervisie wordt beschouwd als een AI-compleet probleem. Met andere woorden, het oplossen ervan zou gelijk staan ​​aan het maken van een programma dat net zo slim is als mensen. Onnodig te zeggen dat een dergelijk programma nog moet worden gemaakt. Als u echter ooit apps zoals Google Goggles of Google Photos heeft gebruikt of het segment op Google Lens hebt gezien in de grondtoon van Google I / O 2017, beseft u waarschijnlijk dat de computervisie zeer krachtig is geworden.

Via een op REST gebaseerde API genaamd Cloud Vision API deelt Google zijn revolutionaire vision-gerelateerde technologieën met alle ontwikkelaars. Door de API te gebruiken, kunt u moeiteloos indrukwekkende functies toevoegen, zoals gezichtsdetectie, emotieherkenning en optische tekenherkenning voor uw Android-apps. In deze zelfstudie laat ik je zien hoe.

voorwaarden

Om deze tutorial te kunnen volgen, moet u beschikken over:

  • een Google Cloud Platform-account
  • een project op de Google Cloud-console
  • de nieuwste versie van Android Studio
  • en een apparaat met Android 4.4 of hoger

Als sommige van de bovenstaande vereisten voor u niet vertrouwd zijn, raad ik u aan de volgende inleidende zelfstudie over het Google Cloud Machine Learning-platform te lezen:

1. De Cloud Vision-API inschakelen

U kunt de Cloud Vision-API alleen in uw Android-app gebruiken nadat u deze hebt ingeschakeld in de Google Cloud-console en een geldige API-sleutel hebt verkregen. Dus begin door in te loggen op de console en naar te navigeren API Manager> Bibliotheek> Vision API. Op de pagina die wordt geopend, drukt u eenvoudig op in staat stellen knop.

Als u al een API-sleutel voor uw Cloud Console-project hebt gegenereerd, kunt u doorgaan met de volgende stap omdat u deze opnieuw kunt gebruiken met de Cloud Vision-API. Open anders de Geloofsbrieven tab en selecteer Aanmeldingsgegevens maken> API-sleutel.

In het dialoogvenster dat verschijnt, ziet u uw API-sleutel.

2. Afhankelijkheden toevoegen

Net als de meeste andere API's die worden aangeboden door Google, is de Cloud Vision-API toegankelijk via de Google API Client-bibliotheek. Om de bibliotheek in uw Android Studio-project te gebruiken, voegt u het volgende toe compileren afhankelijkheden in de app module build.gradle het dossier:

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

Bovendien, om de I / O-bewerkingen van bestanden te vereenvoudigen, raad ik u aan ook een compileren afhankelijkheid van de Apache Commons IO-bibliotheek.

compileer 'commons-io: commons-io: 2.5'

Omdat de Google API Client alleen kan werken als uw app de INTERNET toestemming, zorg ervoor dat de volgende regel aanwezig is in het manifestbestand van uw project:

3. Configuratie van de API-client

U moet de Google API-client configureren voordat u deze gebruikt om te communiceren met de Cloud Vision API. Dit gebeurt hoofdzakelijk door de API-sleutel, het HTTP-transport en de JSON-fabriek te specificeren die het moet gebruiken. Zoals je zou verwachten, zal het HTTP-transport verantwoordelijk zijn voor communicatie met de servers van Google, en de JSON-fabriek zal onder andere verantwoordelijk zijn voor het converteren van de op JSON gebaseerde resultaten die de API genereert in Java-objecten. 

Voor moderne Android-apps raadt Google u aan de NetHttpTransport klasse als het HTTP-transport en de AndroidJsonFactory klasse als de JSON-fabriek.

De Visie class staat voor de Google API Client voor Cloud Vision. Hoewel het mogelijk is om een ​​instantie van de klasse te maken met behulp van de constructor, doet u dit met behulp van de Vision.Builder in plaats daarvan is het gemakkelijker en flexibeler.

Tijdens het gebruik van de Vision.Builder Klasse, je moet niet vergeten om de. te bellen setVisionRequestInitializer () methode om uw API-sleutel op te geven. De volgende code laat zien hoe:

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

Zodra de Vision.Builder instantie is gereed, je kunt het bellen bouwen() methode om een ​​nieuwe te genereren Visie bijvoorbeeld die u overal in uw app kunt gebruiken.

Visievisie = visionBuilder.build ();

Op dit moment hebt u alles wat u nodig heeft om de Cloud Vision API te gebruiken.

4. Gezichten detecteren en analyseren

Het detecteren van gezichten op foto's is een veel voorkomende vereiste in toepassingen voor computervisie. Met de Cloud Vision API kunt u een uiterst nauwkeurige gezichtsdetector maken die ook emoties, lichtomstandigheden en gezichtsoriëntatiepunten kan identificeren.

Voor de demonstratie zullen we gezichtsdetectie uitvoeren op de volgende foto, die de bemanning van Apollo 9 kenmerkt:

Ik raad aan om een ​​versie van de foto met een hoge resolutie te downloaden van Wikimedia Commons en deze in uw project te plaatsen res / raw map.

Stap 1: codeer de foto

De Cloud Vision API verwacht dat het invoerbeeld wordt gecodeerd als een Base64-tekenreeks die in een Beeld voorwerp. Voordat u echter een dergelijk object genereert, moet u de gedownloade foto, die momenteel een onbewerkte afbeeldingsbron is, converteren naar een byte matrix. U kunt dit snel doen door de invoerstroom te openen met behulp van de openRawResource () methode van de Middelen klasse en doorgeven aan de toByteArray () methode van de IOUtils klasse.

Omdat bestands-I / O-bewerkingen niet op de UI-thread moeten worden uitgevoerd, moet u een nieuwe thread maken voordat u de invoerstroom opent. De volgende code laat zien hoe:

// Maak een nieuwe thread AsyncTask.execute (nieuw Runnable () @Override public void run () // Zet foto om naar byte array InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Meer code hier);

U kunt nu een maken Beeld object door de standaardconstructor aan te roepen. Om de. Toe te voegen byte array als een Base64-string, alles wat je hoeft te doen is de array doorgeven aan zijn encodeContent () methode.

Afbeelding inputImage = nieuwe afbeelding (); inputImage.encodeContent (photoData);

Stap 2: Verzoek doen

Omdat de Cloud Vision-API verschillende functies biedt, moet u de functie waarin u bent geïnteresseerd expliciet opgeven wanneer u hierom verzoekt. Om dit te doen, moet u een maken Voorzien zijn van object en bel het settype () methode. De volgende code laat zien hoe u een maakt Voorzien zijn van object alleen voor gezichtsdetectie:

Feature desiredFeature = new Feature (); desiredFeature.setType ( "FACE_DETECTION");

De ... gebruiken Beeld en de Voorzien zijn van objecten, kunt u nu een opstellen AnnotateImageRequest aanleg.

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

Merk op dat een AnnotateImageRequest object moet altijd behoren tot een BatchAnnotateImagesRequest object omdat de Cloud Vision API is ontworpen om meerdere afbeeldingen tegelijk te verwerken. Om een ​​te initialiseren BatchAnnotateImagesRequest exemplaar met een enkele AnnotateImageRequest object, kunt u de Arrays.asList () hulpprogramma methode.

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

Om het gezichtsdetectieverzoek daadwerkelijk te maken, moet u de execute () methode van een Annoteren object dat is geïnitialiseerd met behulp van de BatchAnnotateImagesRequest object dat u zojuist hebt gemaakt. Om een ​​dergelijk object te genereren, moet u de annoteren() methode aangeboden door de Google API Client voor Cloud Vision. Hier is hoe:

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

Stap 3: gebruik de respons

Zodra de aanvraag is verwerkt, krijgt u een BatchAnnotateImagesResponse object met het antwoord van de API. Voor een gezichtsdetectieverzoek bevat het antwoord een FaceAnnotation object voor elk gezicht dat de API heeft gedetecteerd. Je kunt een lijst met alles krijgen FaceAnnotation objecten met behulp van de getFaceAnnotations () methode.

Lijst faces = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

EEN FaceAnnotation object bevat veel nuttige informatie over een gezicht, zoals de locatie, de hoek en de emotie die het tot uitdrukking brengt. Vanaf versie 1 kan de API alleen de volgende emoties detecteren: vreugde, verdriet, woede en verrassing.

Om deze tutorial kort te houden, laten we nu eenvoudig de volgende informatie weergeven in a Geroosterd brood:

  • De telling van de gezichten
  • De waarschijnlijkheid dat ze vreugde uiten

Je kunt natuurlijk de telling van de gezichten krijgen door de grootte() methode van de Lijst met de FaceAnnotation voorwerpen. Om de kans te krijgen dat een gezicht vreugde uitdrukt, kun je het intuïtief noemen getJoyLikelihood () methode van de geassocieerde FaceAnnotation voorwerp. 

Merk op dat omdat een eenvoudig Geroosterd brood kan alleen een enkele string weergeven, u moet alle bovenstaande details samenvoegen. Bovendien, een Geroosterd brood kan alleen worden weergegeven vanuit de UI-thread, dus zorg ervoor dat u deze belt nadat u de. hebt gebeld runOnUiThread () methode. De volgende code laat zien hoe:

// Count faces int numberOfFaces = faces.size (); // Krijg joy-waarschijnlijkheid voor elk gezicht String likelihoods = ""; voor (int i = 0; i

U kunt nu doorgaan en de app uitvoeren om het volgende resultaat te zien:

5. Tekst lezen

Het proces van het extraheren van tekenreeksen uit foto's van tekst wordt optische tekenherkenning genoemd, of kortweg OCR. Met de Cloud Vision API kunt u eenvoudig een optische tekenlezer maken die foto's van zowel afgedrukte als met de hand geschreven tekst kan verwerken. Bovendien is het voor de lezer die u maakt geen probleem om schuine tekst of tekst te lezen die op een kleurrijke foto is gelegd.

De API biedt twee verschillende functies voor OCR:

  • TEXT_DETECTION, voor het lezen van kleine hoeveelheden tekst, zoals die op uithangborden of boekomslagen
  • en DOCUMENT_TEXT_DETECTION, voor het lezen van grote hoeveelheden tekst, zoals die op de pagina's van een roman

De stappen die u moet volgen om een ​​OCR-aanvraag te doen, zijn identiek aan de stappen die u hebt gevolgd om een ​​gezichtsherkenningsverzoek in te dienen, behalve de manier waarop u de initialisatie start. Voorzien zijn van voorwerp. Voor OCR moet u het type op beide instellen TEXT_DETECTION of DOCUMENT_TEXT_DETECTION. Laten we voorlopig gaan met de eerste.

Feature desiredFeature = new Feature (); desiredFeature.setType ( "TEXT_DETECTION");

Je zult natuurlijk ook een foto met tekst in je project moeten plaatsen res / raw map. Als je een dergelijke foto niet hebt, kun je deze gebruiken, die een straatnaambord laat zien:

U kunt een versie van de bovenstaande foto met hoge resolutie downloaden van Wikimedia Commons.

Om de verwerking van de resultaten van een OCR-bewerking te starten, nadat u de BatchAnnotateImagesResponse object, je moet de getFullTextAnnotation () methode om een ​​te krijgen TextAnnotation object dat alle geëxtraheerde tekst bevat.

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

U kunt dan de getText () methode van de TextAnnotation object om daadwerkelijk een verwijzing naar een string te krijgen die de geëxtraheerde tekst bevat.

De volgende code laat zien hoe u de geëxtraheerde tekst kunt weergeven met a Geroosterd brood:

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

Als u uw app nu uitvoert, ziet u ongeveer zoiets als dit:

Conclusie

In deze zelfstudie leer je hoe je de Cloud Vision API kunt gebruiken om gezichtsdetectie, emotieherkenning en optische tekenherkenningsmogelijkheden toe te voegen aan je Android-apps. Ik weet zeker dat je het met me eens bent als ik zeg dat deze nieuwe mogelijkheden je apps in staat zullen stellen om meer intuïtieve en slimmere gebruikersinterfaces te bieden.

Het is vermeldenswaard dat er een belangrijke functie ontbreekt in de Cloud Vision API: gezichtsherkenning. In de huidige vorm kan de API alleen gezichten detecteren en niet identificeren.

Voor meer informatie over de API, kunt u de officiële documentatie raadplegen.

En bekijk ondertussen enkele van onze andere zelfstudies over het toevoegen van computer leren aan uw Android-apps!