Automatisk bildbeskärning med Amazon Rekognition

Automatisk bildbeskärning med Amazon Rekognition

Digitala publicister letar ständigt efter sätt att effektivisera och automatisera sina mediearbetsflöden för att generera och publicera nytt innehåll så snabbt de kan.

Många förlag har ett stort bibliotek med stockbilder som de använder för sina artiklar. Dessa bilder kan återanvändas många gånger för olika berättelser, speciellt när förlaget har bilder på kändisar. Ganska ofta kan en journalist behöva beskära en önskad kändis från en bild för att använda för sin kommande berättelse. Detta är en manuell, repetitiv uppgift som bör automatiseras. Ibland kanske en författare vill använda en bild av en kändis, men den innehåller två personer och den primära kändisen måste beskäras från bilden. Andra gånger kan kändisbilder behöva formateras om för publicering på en mängd olika plattformar som mobil, sociala medier eller digitala nyheter. Dessutom kan en författare behöva ändra bildens bildförhållande eller sätta kändisen i skarpt fokus.

I det här inlägget visar vi hur man använder Amazon-erkännande att utföra bildanalys. Amazon Rekognition gör det enkelt att lägga till denna förmåga till dina applikationer utan någon maskininlärningsexpertis (ML) och kommer med olika API:er för att uppfylla användningsfall som objektdetektering, innehållsmoderering, ansiktsdetektering och analys samt text- och kändisigenkänning, som vi använd i detta exempel.

Smakämnen kändisigenkänningsfunktion in Amazon-erkännande känner automatiskt igen tiotusentals välkända personligheter i bilder och videor med hjälp av ML. Kändisigenkänning kan upptäcka inte bara närvaron av den givna kändisen utan också platsen i bilden.

Översikt över lösningen

I det här inlägget visar vi hur vi kan skicka in ett foto, ett kändisnamn och ett bildförhållande för den utmatade bilden för att kunna generera en beskuren bild av den givna kändisen som fångar deras ansikte i mitten.

När du arbetar med Amazon Rekognition kändisdetektions-API, returneras många element i svaret. Följande är några viktiga svarselement:

  • MatchConfidence – En matchkonfidenspoäng som kan användas för att kontrollera API-beteende. Vi rekommenderar att du tillämpar en lämplig tröskel för denna poäng i din ansökan för att välja önskad driftpunkt. Till exempel, genom att sätta ett tröskelvärde på 99 %, kan du eliminera falska positiva resultat men kan missa några potentiella matchningar.
  • Namn, id och webbadresser – Kändisnamnet, ett unikt Amazon-identifierings-ID och lista över webbadresser som kändisens IMDb- eller Wikipedia-länk för ytterligare information.
  • BoundingBox – Koordinater för den rektangulära begränsningsrutans placering för varje igenkänd kändisansikte.
  • Känt Kön – Känd könsidentitet för varje erkänd kändis.
  • Känslor – Känslor som uttrycks i kändisens ansikte, till exempel glad, ledsen eller arg.
  • Pose – Posera av kändisansiktet, med hjälp av tre axlar av roll, pitch och yaw.
  • Ler – Oavsett om kändisen ler eller inte.

En del av API-svaret från Amazon Rekognition inkluderar följande kod:

{ "CelebrityFaces": [ { "Urls": [ "www.wikidata.org/wiki/Q2536951" ], "Name": "Werner Vogels", "Id": "23iZ1oP", "Face": { "BoundingBox": { "Width": 0.10331031680107117, "Height": 0.20054641366004944, "Left": 0.5003396272659302, "Top": 0.07391933351755142 }, "Confidence": 99.99765014648438,
...

I den här övningen visar vi hur man använder begränsningsramselementet för att identifiera platsen för ansiktet, som visas i följande exempelbild. Alla dimensioner representeras som förhållanden av den totala bildstorleken, så siffrorna i svaret är mellan 0–1. Till exempel, i exempel-API-svaret är bredden på begränsningsrutan 0.1, vilket innebär att ansiktsbredden är 10 % av bildens totala bredd.

Werner Vogels Bounding box

Med den här begränsningsramen kan vi nu använda logik för att se till att ansiktet förblir inom kanterna på den nya bilden vi skapar. Vi kan applicera lite stoppning runt denna avgränsning för att hålla ansiktet i mitten.

I följande avsnitt visar vi hur du skapar följande beskurna bildutdata med Werner Vogels i skarpt fokus.

Vi lanserar en Amazon SageMaker notebook, som tillhandahåller en Python-miljö där du kan köra koden för att skicka en bild till Amazon Rekognition och sedan automatiskt modifiera bilden med kändisen i fokus.

Werner Vogels beskuren

Koden utför följande steg på hög nivå:

  1. Gör en förfrågan till recognize_celebrities API med den angivna bilden och kändisnamnet.
  2. Filtrera svaret för information om begränsningsrutan.
  3. Lägg till lite utfyllnad till begränsningsrutan så att vi fångar en del av bakgrunden.

Förutsättningar

För detta genomgång bör du ha följande förutsättningar:

Ladda upp exempelbilden

Ladda upp ditt exempel på en kändisbild till din S3-hink.

Kör koden

För att köra koden använder vi en SageMaker-anteckningsbok, men vilken IDE som helst skulle också fungera efter installation av Python, pillow och Boto3. Vi skapar en SageMaker-anteckningsbok såväl som AWS identitets- och åtkomsthantering (IAM) roll med nödvändiga behörigheter. Slutför följande steg:

  1. Skapa anteckningsboken och namnge det automatic-cropping-celebrity.

Standardexekveringspolicyn, som skapades när du skapade SageMaker-anteckningsboken, har en enkel policy som ger rollen behörighet att interagera med Amazon S3.

  1. Uppdatera Resource begränsning med S3-hinkens namn:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3::: # your-s3-bucket-name " ] } ]
}

  1. Skapa en annan policy att lägga till SageMaker notebook IAM-rollen för att kunna anropa Känn igen kändisar API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

IAM-behörigheter

  1. Välj på SageMaker-konsolen Notebook-instanser i navigeringsfönstret.
  2. Leta reda på automatic-cropping-celebrity anteckningsbok och välj Öppna Jupyter.
  3. Välja Nya och conda_python3 som kärnan för din anteckningsbok.

Jupyter anteckningsbok

För följande steg, kopiera kodblocken till din Jupyter-anteckningsbok och kör dem genom att välja Körning.

  1. Först importerar vi hjälpfunktioner och bibliotek:
import boto3
from PIL import Image

  1. Ställ in variabler
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Skapa en tjänsteklient
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Funktion för att känna igen kändisarna
def recognize_celebrity(photo): with open(photo, 'rb') as image: response = rek.recognize_celebrities(Image={'Bytes': image.read()}) image=Image.open(photo) file_type=image.format.lower() path, ext=image.filename.rsplit(".", 1) celeb_faces = response['CelebrityFaces'] print(f'Detected {len(celeb_faces)} faces for {photo}') return celeb_faces, image, path, file_type 

  1. Funktion för att få begränsningsrutan för den givna kändisen:
def get_bounding_box(celeb_faces, img_width, img_height, celeb): bbox = None for celebrity in celeb_faces: if celebrity['Name'] == celeb: box = celebrity['Face']['BoundingBox'] left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * box['Height'] print('Left: ' + '{0:.0f}'.format(left)) print('Top: ' + '{0:.0f}'.format(top)) print('Face Width: ' + "{0:.0f}".format(width)) print('Face Height: ' + "{0:.0f}".format(height)) #dimenions of famous face inside the bounding boxes x1=left y1=top x2=left+width y2=top+height bbox = [x1,y1,x2,y2] print(f'Bbox coordinates: {bbox}') if bbox == None: raise ValueError(f"{celeb} not found in results") return bbox

  1. Funktion för att lägga till lite stoppning till begränsningsrutan, så att vi fångar lite bakgrund runt ansiktet
def pad_bbox(bbox, pad_width=0.5, pad_height=0.3): x1, y1, x2, y2 = bbox width = x2 - x1 height = y2 - y1 #dimenions of new image with padding x1= max(x1 - (pad_width * width),0) y1= max(y1 - (pad_height * height),0) x2= max(x2 + (pad_width * width),0) y2= max(y2 + (pad_height * height),0) #dimenions of new image with aspect ratio, 1 is square, 1.5 is 6:4, 0.66 is 4:6 x1= max(x1-(max((y2-y1)*max(aspect_ratio,1)-(x2-x1),0)/2),0) y1= max(y1-(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) x2= max(x2+(max((y2-y1)*max((aspect_ratio),1)-(x2-x1),0)/2),0) y2= max(y2+(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) print('x1-coordinate after padding: ' + '{0:.0f}'.format(x1)) print('y1-coordinate after padding: ' + '{0:.0f}'.format(y1)) print('x2-coordinate after padding: ' + "{0:.0f}".format(x2)) print('y2-coordinate after padding: ' + "{0:.0f}".format(y2)) return [x1,y1,x2,y2]

  1. Funktion för att spara bilden till notebook-lagringen och till Amazon S3
def save_image(roi, image, path, file_type): x1, y1, x2, y2 = roi image = image.crop((x1,y1,x2,y2)) image.save(f'{path}-cropped.{file_type}') s3.upload_file(f'{path}-cropped.{file_type}', bucket, f'{path}-cropped.{file_type}') return image

  1. Använd Python main() funktion för att kombinera de föregående funktionerna för att slutföra arbetsflödet för att spara en ny beskuren bild av vår kändis:
def main(): # Download S3 image to local s3.download_file(bucket, file, './'+file) #Load photo and recognize celebrity celeb_faces, img, file_name, file_type = recognize_celebrity(file) width, height = img.size #Get bounding box bbox = get_bounding_box(celeb_faces, width, height, celeb) #Get padded bounding box padded_bbox = pad_bbox(bbox) #Save result and display result = save_image(padded_bbox, img, file_name, file_type) display(result) if __name__ == "__main__": main()

När du kör det här kodblocket kan du se att vi hittade Werner Vogels och skapade en ny bild med hans ansikte i centrum.

Werner Vogels beskuren

Bilden kommer att sparas i anteckningsboken och även laddas upp till S3-hinken.

Jupyter notebook-utgång

Du kan inkludera denna lösning i en större arbetsflöde; till exempel kan ett förlag vilja publicera denna möjlighet som en slutpunkt för att omformatera och ändra storlek på bilder i farten när de publicerar kändisartiklar på flera plattformar.

Städar upp

För att undvika framtida avgifter, ta bort resurserna:

  1. På SageMaker-konsolen väljer du din bärbara dator och på Handlingar meny, välj Sluta.
  2. Efter att anteckningsboken har stoppats, på Handlingar meny, välj Radera.
  3. Ta bort SageMaker-exekveringsrollen som du skapade på IAM-konsolen.
  4. På Amazon S3-konsolen, radera ingångsbilden och alla utdatafiler från din S3-hink.

Slutsats

I det här inlägget visade vi hur vi kan använda Amazon Rekognition för att automatisera en annars manuell uppgift att modifiera bilder för att stödja mediearbetsflöden. Detta är särskilt viktigt inom förlagsbranschen där snabbhet är avgörande för att få ut färskt innehåll snabbt och till flera plattformar.

För mer information om att arbeta med mediatillgångar, se Mediaintelligens blev precis smartare med Media2Cloud 3.0


Om författaren

Automatisk bildbeskärning med Amazon Rekognition PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Mark Watkins är en lösningsarkitekt inom media- och underhållningsteamet. Han hjälper kunder att skapa AI/ML-lösningar som löser deras affärsutmaningar med hjälp av AWS. Han har arbetat med flera AI/ML-projekt relaterade till datorseende, naturlig språkbehandling, personalisering, ML vid kanten med mera. Bortsett från yrkeslivet älskar han att spendera tid med sin familj och se sina två små växa upp.

Tidsstämpel:

Mer från AWS maskininlärning