Automatyczne przycinanie obrazu dzięki Amazon Rekognition

Automatyczne przycinanie obrazu dzięki Amazon Rekognition

Wydawcy cyfrowi nieustannie poszukują sposobów na usprawnienie i zautomatyzowanie przepływów pracy w mediach, aby generować i publikować nowe treści tak szybko, jak to tylko możliwe.

Wielu wydawców ma dużą bibliotekę obrazów stockowych, których używają w swoich artykułach. Te obrazy mogą być wielokrotnie wykorzystywane w różnych historiach, zwłaszcza gdy wydawca ma zdjęcia celebrytów. Dość często dziennikarz może potrzebować wyciąć pożądanego celebrytę ze zdjęcia, aby użyć go w nadchodzącej historii. Jest to ręczne, powtarzalne zadanie, które powinno być zautomatyzowane. Czasami autor może chcieć użyć zdjęcia celebryty, ale zawiera ono dwie osoby, a główny celebryta musi zostać wykadrowany z obrazu. Innym razem może być konieczne ponowne sformatowanie zdjęć celebrytów w celu opublikowania ich na różnych platformach, takich jak urządzenia mobilne, media społecznościowe lub wiadomości cyfrowe. Ponadto autor może potrzebować zmienić proporcje obrazu lub ustawić ostrość na celebrytę.

W tym poście pokazujemy, jak używać Amazon Rekognition przeprowadzić analizę obrazu. Amazon Rekognition ułatwia dodawanie tej funkcji do aplikacji bez wiedzy specjalistycznej w zakresie uczenia maszynowego (ML) i jest dostarczany z różnymi interfejsami API do realizacji takich przypadków użycia, jak wykrywanie obiektów, moderowanie treści, wykrywanie i analiza twarzy oraz rozpoznawanie tekstu i celebrytów, które my użyj w tym przykładzie.

Połączenia funkcja rozpoznawania celebrytów in Amazon Rekognition automatycznie rozpoznaje dziesiątki tysięcy znanych osobistości na obrazach i filmach za pomocą ML. Rozpoznawanie gwiazd może wykryć nie tylko obecność danej gwiazdy, ale także lokalizację na obrazie.

Przegląd rozwiązania

W tym poście pokazujemy, w jaki sposób możemy przekazać zdjęcie, imię i nazwisko celebryty oraz współczynnik proporcji wyjściowego obrazu, aby móc wygenerować przycięty obraz danej gwiazdy, przedstawiający jej twarz na środku.

Podczas pracy z API wykrywania celebrytów Amazon Rekognition, w odpowiedzi zwracanych jest wiele elementów. Oto kilka kluczowych elementów odpowiedzi:

  • Dopasuj pewność – Wynik pewności dopasowania, którego można użyć do kontrolowania zachowania interfejsu API. Zalecamy zastosowanie odpowiedniego progu do tego wyniku w aplikacji, aby wybrać preferowany punkt pracy. Na przykład ustawiając próg 99%, możesz wyeliminować fałszywe alarmy, ale możesz przegapić niektóre potencjalne dopasowania.
  • Nazwa, identyfikator i adresy URL – Nazwisko celebryty, unikalny identyfikator Amazon Rekognition ID oraz lista adresów URL, takich jak IMDb celebryty lub link do Wikipedii w celu uzyskania dalszych informacji.
  • Obwiednia – Współrzędne lokalizacji prostokątnej ramki ograniczającej dla każdej rozpoznanej twarzy celebryty.
  • Znana płeć – Znana tożsamość płciowa dla każdej uznanej gwiazdy.
  • Emocje – Emocje wyrażone na twarzy celebryty, na przykład radość, smutek lub złość.
  • Poza – Pozycja twarzy celebryty, wykorzystująca trzy osie przechyłu, pochylenia i odchylenia.
  • Uśmiech – Czy celebrytka się uśmiecha, czy nie.

Część odpowiedzi API z Amazon Rekognition zawiera następujący 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,
...

W tym ćwiczeniu zademonstrujemy, jak użyć elementu ramki ograniczającej do określenia położenia powierzchni, jak pokazano na poniższym przykładowym obrazie. Wszystkie wymiary są reprezentowane jako stosunki całkowitego rozmiaru obrazu, więc liczby w odpowiedzi mieszczą się w przedziale od 0 do 1. Na przykład w przykładowej odpowiedzi interfejsu API szerokość obwiedni wynosi 0.1, co oznacza, że ​​szerokość twarzy wynosi 10% całkowitej szerokości obrazu.

Ramka ograniczająca Wernera Vogelsa

Dzięki tej ramce ograniczającej możemy teraz użyć logiki, aby upewnić się, że twarz pozostaje w obrębie krawędzi nowego obrazu, który tworzymy. Możemy zastosować trochę wypełnienia wokół tego obwiedni, aby utrzymać twarz na środku.

W poniższych sekcjach pokazujemy, jak utworzyć następujący przycięty obraz wyjściowy z Wernerem Vogelsem z wyraźną ostrością.

Uruchamiamy a Amazon Sage Maker notebook, który zapewnia środowisko Pythona, w którym można uruchomić kod, aby przekazać obraz do Amazon Rekognition, a następnie automatycznie zmodyfikować obraz z celebrytą w centrum uwagi.

Przycięty Werner Vogels

Kod wykonuje następujące kroki wysokiego poziomu:

  1. Złóż wniosek do recognize_celebrities API z podanym obrazem i nazwiskiem celebryty.
  2. Przefiltruj odpowiedź pod kątem informacji o obwiedni.
  3. Dodaj trochę wypełnienia do obwiedni, tak aby uchwycić część tła.

Wymagania wstępne

W tej instrukcji należy spełnić następujące wymagania wstępne:

Prześlij przykładowy obraz

Prześlij swój przykładowy obraz celebryty do zasobnika S3.

Uruchom kod

Aby uruchomić kod, używamy notatnika SageMaker, jednak każde IDE działałoby również po zainstalowaniu Pythona, poduszki i Boto3. Tworzymy notatnik SageMaker, a także AWS Zarządzanie tożsamością i dostępem (IAM) z wymaganymi uprawnieniami. Wykonaj następujące kroki:

  1. Utwórz notatnik i nazwij to automatic-cropping-celebrity.

Domyślna polityka wykonywania, która została utworzona podczas tworzenia notatnika SageMaker, ma prostą politykę, która nadaje roli uprawnienia do interakcji z Amazon S3.

  1. Zaktualizuj Resource ograniczenie z nazwą zasobnika S3:
{ "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. Utwórz kolejną politykę, aby dodać ją do roli IAM notatnika SageMaker, aby móc wywoływać Rozpoznaj gwiazdy OGIEŃ:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

Uprawnienia

  1. W konsoli SageMaker wybierz Instancje notebooków w okienku nawigacji.
  2. Zlokalizuj automatic-cropping-celebrity zeszyt i wybierz Otwórz Jupyter.
  3. Dodaj Nowości i conda_python3 jako jądro dla Twojego notebooka.

Notatnik Jupyter

Aby wykonać poniższe kroki, skopiuj bloki kodu do notesu Jupyter i uruchom je, wybierając run.

  1. Najpierw importujemy funkcje pomocnicze i biblioteki:
import boto3
from PIL import Image

  1. Ustaw zmienne
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Utwórz klienta usługi
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Funkcja rozpoznawania celebrytów
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. Funkcja, która pobiera obwiednię danej gwiazdy:
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. Funkcja dodająca trochę wypełnienia do obwiedni, dzięki czemu uchwycimy trochę tła wokół twarzy
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. Funkcja zapisywania obrazu w pamięci notebooka i na 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. Użyj Pythona main() funkcja łącząca poprzednie funkcje w celu zakończenia procesu zapisywania nowego przyciętego obrazu naszej gwiazdy:
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()

Kiedy uruchomisz ten blok kodu, zobaczysz, że znaleźliśmy Wernera Vogelsa i stworzyliśmy nowy obraz z jego twarzą pośrodku.

Przycięty Werner Vogels

Obraz zostanie zapisany w notatniku, a także przesłany do zasobnika S3.

Wyjście notebooka Jupyter

Możesz dołączyć to rozwiązanie do pliku a większy przepływ pracy; na przykład firma wydawnicza może chcieć opublikować tę funkcję jako punkt końcowy do ponownego formatowania i zmiany rozmiaru obrazów w locie podczas publikowania artykułów celebrytów na wielu platformach.

Sprzątanie

Aby uniknąć przyszłych opłat, usuń zasoby:

  1. W konsoli SageMaker wybierz swój notatnik i na Akcje menu, wybierz Stop.
  2. Po zatrzymaniu notebooka na Akcje menu, wybierz Usuń.
  3. W konsoli IAM usuń utworzoną rolę wykonawczą SageMaker.
  4. Na konsoli Amazon S3 usuń obraz wejściowy i wszelkie pliki wyjściowe z zasobnika S3.

Wnioski

W tym poście pokazaliśmy, jak możemy wykorzystać Amazon Rekognition do zautomatyzowania ręcznego zadania modyfikowania obrazów w celu obsługi przepływów pracy z mediami. Jest to szczególnie ważne w branży wydawniczej, gdzie szybkość ma znaczenie w szybkim udostępnianiu świeżych treści na wiele platform.

Aby uzyskać więcej informacji na temat pracy z zasobami multimedialnymi, zobacz Inteligencja medialna właśnie stała się inteligentniejsza dzięki Media2Cloud 3.0


O autorze

Automatic image cropping with Amazon Rekognition PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Marka Watkinsa jest Architektem Rozwiązań w zespole Media and Entertainment. Pomaga klientom w tworzeniu rozwiązań AI/ML, które rozwiązują ich wyzwania biznesowe z wykorzystaniem AWS. Pracował nad kilkoma projektami AI/ML związanymi z wizją komputerową, przetwarzaniem języka naturalnego, personalizacją, ML na krawędzi i nie tylko. Z dala od życia zawodowego uwielbia spędzać czas z rodziną i obserwować dorastającą dwójkę swoich maluchów.

Znak czasu:

Więcej z Uczenie maszynowe AWS