AWS Rekognition: Vad finns på bilden?

2 januari 2019

Vad var det på den där bilden egentligen?

Utvecklingen i molnet går i en rasande takt där nya tjänster tillkommer nästan på daglig basis. Ett område där det går särskilt fort är inom maskininlärning och AI. I denna bloggpost ska vi titta på ett exempel där vi på kort tid kan få upp en websida som kan klassificera bilder och berätta vilka objekt som finns i en bild med hjälp av AWS Rekognition. Ett enkelt exempel här, men tekniken kan du t ex använda för att automatisera klassificering och kategorisering av stora mängder foton för att sedan lagra och använda kategoriseringen i dina analyser.

Det vi ska bygga är enligt bilden ovan. En webbsida, med lite javascript för att klassificera bilder. Grunden är AWS Rekognition, Amazons tjänst för bildigenkänning som lanserades på AWS re:invent. Det är en tjänst där AWS paketerat deep learning så att man inte ska behöva bry sig om uppsättning och träning av modeller utan bara att börja använda och hitta på tjänster kring. AWS Rekognition har en rad klassificeringsfunktioner med allt ifrån text- och ansikts-igenkänning till videoanalys. I dagens exempel ska vi använda den funktion som analyserar och hittar olika objekt i bilder.

Förutom Rekognition kommer vi även använda oss av Cognito för att vår websida ska få rätt rättigheter att prata med AWS samt S3 för att publicera vår webbsida.

Cognito

Först det tråkiga – rättigheter. För att vår webbsida överhuvudtaget ska kunna prata med AWS behöver vi sätta upp en användarpool så att vi kan ge anonyma anrop från vår webbsida rätt att prata med AWS. Vi behöver ett så kallat Identity Pool Id. Det gör vi med följande steg:

  1. Öppna Amazon Cognito konsolen.
  2. Välj Create new identity pool.
  3. Skriv in ett namn för din pool.
  4. För “Unauthenticated identities” välj att slå på, “Enable access to unauthenticated identities”. Det gör att även om man inte loggat in eller skapat konto kommer man kunna komma åt din sida.
  5. Välj “Create Pool”.
  6. Under View Details, notera namnet för “unauthenticated identities”.
  7. Välj Allow
  8. För plattform, välj JavaScript.
  9. Notera värdet för IdentityPoolId som visas i kodexemplet
  10. Nästa steg är att ge vår nya pool rätt att använda sig av Rekognition. Det gör vi med IAM konsolen.
  11. Välj Roles.
  12. Välj rollen du noterade namnet på i steg 6.
  13. I Permissions välj Attach Policy.
  14. Välj AmazonRekognitionReadOnlyAccess.
  15. Välj Attach Policy.

Javascript

Nästa steg är att med hjälp av JavaScript och HTML skapa en sida där man kan ladda upp en bild till AWS Rekognition och få tillbaka ett svar. Kommer inte gå igenom hela lösningen här, länk till den finns i slutet. Fokuserar på de viktigaste punkterna.

För att kunna prata med AWS använder sig skriptet av SDK:er som AWS släppt för att förenkla kommunikation med AWS och dess tjänster, specifikt Cognitio och Rekognition för oss.

Dessa hittas på https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js och https://aws.amazon.com/sdk-for-browser/

Det den bifogade koden gör är:

  1. Vänta på att en bild laddas upp
  2. Logga in på AWS
  3. Ladda upp bilden till Rekognition
  4. Vänta på svar
  5. Visa svaret

Startfunktionen i den bifogade koden är ProcessImage() Den tar den valda bilden, kontrollerar att den är i ett format som Rekognition stödjer och kallar sedan på DetectLabels.

Det är funktionen DetectLabels i den bifogade javascript-koden som gör jobbet. Den tar bilddatat och skickar till AWS genom att köra webservicen detectLabels hos AWS och när den får ett svar skapar den en HTML-tabell med de ”Labels”/objekt som hittats i bilden samt konfidensvärden. Konfidensvärden är det som anger hur säker Rekognition är på vad den hittat i bilden. Så som man kan se i bilden i början av blogginlägget är den 99.709.. % säker på att det är en apa.

Svaret från Rekognition kommer i form av en JSON, som för Apan i exemplet ovan kan se ut något i stil med nedan, dvs en samling / array av Labels i form av en hierarki. Har i vårt exempel valt att skriva ut alla labels och inte ta hänsyn till hierarkin.

{ ”LabelModelVersion”: ”2.0”, ”Labels”: [ { ”Confidence”: 99.709228515625, ”Instances”: [], ”Name”: ”Mammal”, ”Parents”: [ { ”Name”: ”Animal” } ] }, { ”Confidence”: 99.709228515625, ”Instances”: [], ”Name”: ”Animal”, ”Parents”: [] }, …

För att få den länkade koden att fungera är ett viktigt steg att modifiera funktionen LoginAWS och i den fylla i värdet för IdentityPoolId som vi noterade i steg 9 ovan. Där byter man ut xxxxx nedan mot det pool id man fått. När vi gjort det och sparat kan vi nu öppna filen i en webbläsare och testa. Viktigt är att också fylla i samma region som du var i när du skapade poolen i steg 9 ovan.

S3

När vi nu fått ihop vår HTML och JavaScript-kod är vi redo att publicera den till världen. Det gör vi enklast genom att skapa en ny S3-bucket, ladda upp våra filer dit och välja att den ska vara publik samt slå på static website hosting, dessa inställningar hittar du under din S3-buckets inställningar:

Sedan får vi för våra filer slå på public access så att världen har rätt att surfa till filerna. Det gör man enklast genom att markera alla filerna och klicka på Make public.

Klart! Vi har nu skapat en tjänst för bildigenkänning som enkelt kan användas för att förstå vad det var vi fångade på alla de där bilderna vi har.

Jag har publicerat min tjänst på:

http://sparks-image-rekognition.s3-website.eu-north-1.amazonaws.com/Image.html

Som vanligt är det bara höra av dig till mig eller någon av mina kollegor på Sparks om du har några frågor om detta eller något annat i din data-vardag.

All kod hittar du som en zip i länken nedan:

https://s3.eu-north-1.amazonaws.com/sparks-image-rekognition/Rekognition.zip