Automatisch bijsnijden van afbeeldingen met Amazon Rekognition

Automatisch bijsnijden van afbeeldingen met Amazon Rekognition

Digitale uitgevers zijn voortdurend op zoek naar manieren om hun mediaworkflows te stroomlijnen en te automatiseren om zo snel mogelijk nieuwe inhoud te genereren en te publiceren.

Veel uitgevers hebben een grote bibliotheek met stockfoto's die ze gebruiken voor hun artikelen. Deze afbeeldingen kunnen vele malen worden hergebruikt voor verschillende verhalen, vooral wanneer de uitgever afbeeldingen van beroemdheden heeft. Heel vaak moet een journalist een gewenste beroemdheid uit een afbeelding halen om te gebruiken voor hun aanstaande verhaal. Dit is een handmatige, repetitieve taak die moet worden geautomatiseerd. Soms wil een auteur een afbeelding van een beroemdheid gebruiken, maar deze bevat twee personen en de primaire beroemdheid moet uit de afbeelding worden geknipt. Soms moeten afbeeldingen van beroemdheden mogelijk opnieuw worden geformatteerd voor publicatie op verschillende platforms, zoals mobiel, sociale media of digitaal nieuws. Bovendien moet een auteur mogelijk de beeldverhouding wijzigen of de beroemdheid scherp in beeld brengen.

In dit bericht laten we zien hoe te gebruiken Amazon Rekognition beeldanalyse uit te voeren. Amazon Rekognition maakt het gemakkelijk om deze mogelijkheid toe te voegen aan je applicaties zonder enige expertise op het gebied van machine learning (ML). Het wordt geleverd met verschillende API's om te voldoen aan use cases zoals objectdetectie, inhoudsmoderatie, gezichtsdetectie en -analyse, en tekst- en beroemdheidsherkenning, die we gebruiken in dit voorbeeld.

De herkenningsfunctie voor beroemdheden in Amazon Rekognition herkent automatisch tienduizenden bekende persoonlijkheden in afbeeldingen en video's met behulp van ML. Beroemdheidsherkenning kan niet alleen de aanwezigheid van de betreffende beroemdheid detecteren, maar ook de locatie binnen de afbeelding.

Overzicht van de oplossing

In dit bericht laten we zien hoe we een foto, de naam van een beroemdheid en een beeldverhouding voor de uitgevoerde afbeelding kunnen doorgeven om een ​​bijgesneden afbeelding te genereren van de betreffende beroemdheid die hun gezicht in het midden vastlegt.

Bij het werken met de Amazon Rekognition-API voor het detecteren van beroemdheden, worden veel elementen geretourneerd in het antwoord. Hier volgen enkele belangrijke responselementen:

  • MatchVertrouwen – Een match-betrouwbaarheidsscore die kan worden gebruikt om het API-gedrag te controleren. We raden aan om in uw toepassing een geschikte drempel toe te passen op deze score om uw gewenste werkpunt te kiezen. Door bijvoorbeeld een drempel van 99% in te stellen, kunt u valse positieven elimineren, maar mist u mogelijk enkele potentiële overeenkomsten.
  • Naam, ID en URL's - De naam van de beroemdheid, een unieke Amazon Rekognition-ID en een lijst met URL's zoals de IMDb- of Wikipedia-link van de beroemdheid voor meer informatie.
  • Begrenzingsbox – Coördinaten van de locatie van het rechthoekige begrenzingskader voor elk herkend gezicht van een beroemdheid.
  • BekendGeslacht – Bekende genderidentiteit voor elke erkende beroemdheid.
  • Emoties – Emotie uitgedrukt op het gezicht van de beroemdheid, bijvoorbeeld blij, verdrietig of boos.
  • Pose - Pose van het gezicht van de beroemdheid, met behulp van drie assen van rollen, stampen en gieren.
  • glimlach - Of de beroemdheid lacht of niet.

Een deel van de API-reactie van Amazon Rekognition bevat de volgende code:

{ "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,
...

In deze oefening laten we zien hoe u het begrenzingskaderelement kunt gebruiken om de locatie van het gezicht te identificeren, zoals weergegeven in de volgende voorbeeldafbeelding. Alle dimensies worden weergegeven als verhoudingen van de totale afbeeldingsgrootte, dus de getallen in het antwoord liggen tussen 0 en 1. In het voorbeeld van een API-antwoord is de breedte van het begrenzingsvak bijvoorbeeld 0.1, wat inhoudt dat de gezichtsbreedte 10% is van de totale breedte van de afbeelding.

Werner Vogels Begrenzingsdoos

Met dit begrenzingskader kunnen we nu logica gebruiken om ervoor te zorgen dat het gezicht binnen de randen blijft van de nieuwe afbeelding die we maken. We kunnen wat opvulling aanbrengen rond dit begrenzingskader om het gezicht in het midden te houden.

In de volgende secties laten we zien hoe u de volgende bijgesneden afbeelding kunt maken met Werner Vogels scherp in beeld.

We lanceren een Amazon Sage Maker notebook, die een Python-omgeving biedt waar u de code kunt uitvoeren om een ​​afbeelding door te geven aan Amazon Rekognition en vervolgens de afbeelding automatisch kunt wijzigen met de beroemdheid in focus.

Werner Vogels bijgesneden

De code voert de volgende stappen op hoog niveau uit:

  1. Doe een aanvraag bij de recognize_celebrities API met de opgegeven afbeelding en naam van de beroemdheid.
  2. Filter het antwoord voor informatie over het begrenzingsvak.
  3. Voeg wat opvulling toe aan het selectiekader zodat we een deel van de achtergrond vastleggen.

Voorwaarden

Voor deze walkthrough moet u aan de volgende vereisten voldoen:

Upload de voorbeeldafbeelding

Upload uw voorbeeldafbeelding van een beroemdheid naar uw S3-bucket.

Voer de code uit

Om de code uit te voeren, gebruiken we een SageMaker-notebook, maar elke IDE zou ook werken na installatie van Python, pillow en Boto3. We maken zowel een SageMaker-notitieboekje als de AWS Identiteits- en toegangsbeheer (IAM) rol met de vereiste machtigingen. Voer de volgende stappen uit:

  1. Maak het notitieboekje en noem het automatic-cropping-celebrity.

Het standaarduitvoeringsbeleid, dat is gemaakt bij het maken van de SageMaker-notebook, heeft een eenvoudig beleid dat de rol toestemming geeft om te communiceren met Amazon S3.

  1. Werk het Resource beperking met de S3-bucketnaam:
{ "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. Maak een ander beleid om toe te voegen aan de IAM-rol van het SageMaker-notebook om de Herken Beroemdheden API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

IAM-machtigingen

  1. Kies op de SageMaker-console Notebook-exemplaren in het navigatievenster.
  2. Zoek de automatic-cropping-celebrity notitieboekje en kies Jupyter openen.
  3. Kies New en conda_python3 als de kernel voor uw notebook.

Jupyter notitieboek

Kopieer voor de volgende stappen de codeblokken naar uw Jupyter-notebook en voer ze uit door te kiezen lopen.

  1. Eerst importeren we helperfuncties en bibliotheken:
import boto3
from PIL import Image

  1. Stel variabelen in
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Maak een serviceclient aan
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Functie om de beroemdheden te herkennen
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. Functie om het begrenzingsvak van de gegeven beroemdheid te krijgen:
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. Functie om wat opvulling toe te voegen aan het selectiekader, zodat we wat achtergrond rond het gezicht vastleggen
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. Functie om de afbeelding op te slaan in de notebookopslag en in 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. Gebruik de Python main() functie om de voorgaande functies te combineren om de workflow van het opslaan van een nieuwe bijgesneden afbeelding van onze beroemdheid te voltooien:
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()

Als je dit codeblok uitvoert, kun je zien dat we Werner Vogels hebben gevonden en een nieuwe afbeelding hebben gemaakt met zijn gezicht in het midden.

Werner Vogels bijgesneden

De afbeelding wordt opgeslagen in de notebook en ook geüpload naar de S3-bucket.

Jupyter-notebookuitvoer

U kunt deze oplossing opnemen in een grotere werkstroom; een uitgeverij zou deze mogelijkheid bijvoorbeeld willen publiceren als een eindpunt om afbeeldingen on-the-fly opnieuw te formatteren en van grootte te veranderen bij het publiceren van artikelen van beroemdheden op meerdere platforms.

Schoonmaken

Verwijder de bronnen om toekomstige kosten te voorkomen:

  1. Selecteer op de SageMaker-console uw notebook en op de Acties menu, kies stop.
  2. Nadat de notebook is gestopt, op de Acties menu, kies Verwijder.
  3. Verwijder op de IAM-console de SageMaker-uitvoeringsrol die u hebt gemaakt.
  4. Verwijder op de Amazon S3-console de invoerafbeelding en eventuele uitvoerbestanden uit uw S3-bucket.

Conclusie

In dit bericht hebben we laten zien hoe we Amazon Rekognition kunnen gebruiken om een ​​anders handmatige taak van het wijzigen van afbeeldingen te automatiseren om mediaworkflows te ondersteunen. Dit is met name belangrijk in de uitgeverijsector, waar snelheid van belang is om snel nieuwe inhoud naar meerdere platforms te krijgen.

Raadpleeg voor meer informatie over het werken met media-items Media-intelligentie is zojuist slimmer geworden met Media2Cloud 3.0


Over de auteur

Automatisch bijsnijden van afbeeldingen met Amazon Rekognition PlatoBlockchain Data Intelligence. Verticaal zoeken. Ai.

Marc Watkins is een Solutions Architect binnen het Media en Entertainment team. Hij helpt klanten bij het creëren van AI/ML-oplossingen die hun zakelijke uitdagingen oplossen met behulp van AWS. Hij heeft gewerkt aan verschillende AI/ML-projecten met betrekking tot computervisie, natuurlijke taalverwerking, personalisatie, ML aan de rand en meer. Buiten het professionele leven brengt hij graag tijd door met zijn gezin en kijkt hij naar zijn twee kleintjes die opgroeien.

Tijdstempel:

Meer van AWS-machine learning