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.
Om deze tutorial te kunnen volgen, moet u beschikken over:
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:
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.
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:
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.
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.
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);
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 ();
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.
Lijstfaces = 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
:
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; iU 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 romanDe 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 instellenTEXT_DETECTION
ofDOCUMENT_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 degetFullTextAnnotation ()
methode om een te krijgenTextAnnotation
object dat alle geëxtraheerde tekst bevat.final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();U kunt dan de
getText ()
methode van deTextAnnotation
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!