חיתוך תמונה אוטומטי עם אמזון זיהוי

חיתוך תמונה אוטומטי עם אמזון זיהוי

מפרסמים דיגיטליים מחפשים ללא הרף דרכים לייעל ולהפוך את זרימות העבודה במדיה שלהם לאוטומטיות כדי ליצור ולפרסם תוכן חדש במהירות האפשרית.

לבעלי אתרים רבים יש ספרייה גדולה של תמונות מלאי שבהן הם משתמשים למאמרים שלהם. ניתן לעשות שימוש חוזר בתמונות אלו פעמים רבות לסיפורים שונים, במיוחד כאשר למוציא לאור יש תמונות של ידוענים. לעתים קרובות, עיתונאי עשוי להזדקק לחתוך סלבריטי מבוקש מתמונה כדי להשתמש בו עבור הסיפור הקרוב שלו. זוהי משימה ידנית שחוזרת על עצמה שצריכה להיות אוטומטית. לפעמים, מחבר עשוי לרצות להשתמש בתמונה של ידוען, אבל היא מכילה שני אנשים ויש לחתוך את הידוען הראשי מהתמונה. במקרים אחרים, ייתכן שיהיה צורך לאתחל מחדש תמונות של סלבריטאים לפרסום במגוון פלטפורמות כמו נייד, מדיה חברתית או חדשות דיגיטליות. בנוסף, ייתכן שמחבר יצטרך לשנות את יחס הגובה-רוחב של התמונה או לשים את הידוען בפוקוס חד.

בפוסט זה, אנו מדגימים כיצד להשתמש אמזון לבצע ניתוח תמונה. Amazon Rekognition מקלה להוסיף את היכולת הזו ליישומים שלך ללא כל מומחיות למידת מכונה (ML) ומגיעה עם ממשקי API שונים למילוי מקרי שימוש כגון זיהוי אובייקטים, ניהול תוכן, זיהוי וניתוח פנים וזיהוי טקסט וסלבריטאים, אשר אנו השתמש בדוגמה זו.

השמיים תכונת זיהוי מפורסמים in אמזון מזהה אוטומטית עשרות אלפי אישים ידועים בתמונות ובסרטונים באמצעות ML. זיהוי סלבריטאים יכול לזהות לא רק את נוכחותו של הידוען הנתון אלא גם את המיקום בתמונה.

סקירה כללית של הפיתרון

בפוסט זה, אנו מדגימים כיצד אנו יכולים להעביר תמונה, שם של ידוען ויחס רוחב-גובה לתמונה המופקת כדי להיות מסוגל ליצור תמונה חתוכה של הידוען הנתון הלוכד את פניו במרכז.

כאשר עובדים עם Amazon Rekognition API לזיהוי סלבריטאים, אלמנטים רבים מוחזרים בתגובה. להלן כמה מרכיבי תגובה מרכזיים:

  • MatchConfidence - ציון בטחון התאמה שניתן להשתמש בו כדי לשלוט בהתנהגות API. אנו ממליצים להחיל סף מתאים לציון זה בבקשתך כדי לבחור את נקודת הפעולה המועדפת עליך. לדוגמה, על ידי הגדרת סף של 99%, אתה יכול לבטל תוצאות חיוביות שגויות, אך עלול להחמיץ כמה התאמות פוטנציאליות.
  • שם, מזהה וכתובות אתרים – שם הסלבריטאי, מזהה זיהוי ייחודי של אמזון, ורשימת כתובות אתרים כגון קישור IMDb או ויקיפדיה של הידוען למידע נוסף.
  • BoundingBox - קואורדינטות של מיקום התיבה התוחמת המלבנית עבור כל פרצוף ידוען מוכר.
  • מגדר ידוע - זהות מגדרית ידועה לכל מפורסם מוכר.
  • רגשות – רגש המובע על פניו של הידוען, למשל, שמח, עצוב או כועס.
  • פּוֹזָה - תנוחת הפנים של הסלבריטאים, תוך שימוש בשלושה צירים של גלגול, גובה ופיהוק.
  • חיוך - בין אם הידוען מחייך או לא.

חלק מתגובת ה-API מ-Amazon Rekognition כולל את הקוד הבא:

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

בתרגיל זה, אנו מדגימים כיצד להשתמש באלמנט התיבה התוחמת כדי לזהות את מיקום הפנים, כפי שמוצג בתמונה הבאה לדוגמה. כל הממדים מיוצגים כיחסים של גודל התמונה הכולל, כך שהמספרים בתגובה הם בין 0-1. לדוגמה, בתגובת ה-API לדוגמה, רוחב התיבה התוחמת הוא 0.1, מה שמרמז שרוחב הפנים הוא 10% מהרוחב הכולל של התמונה.

ורנר ווגלס תיבת גבולות

עם התיבה התוחמת הזו, אנו יכולים כעת להשתמש בלוגיקה כדי לוודא שהפנים נשארות בקצוות התמונה החדשה שאנו יוצרים. נוכל למרוח מעט ריפוד סביב התיבה התוחמת הזו כדי לשמור על הפנים במרכז.

בסעיפים הבאים, אנו מראים כיצד ליצור את פלט התמונה החתוכה הבאה עם ורנר ווגלס במיקוד חד.

אנחנו משיקים א אמזון SageMaker מחברת, המספקת סביבת Python שבה אתה יכול להריץ את הקוד כדי להעביר תמונה ל-Amazon Rekognition ולאחר מכן לשנות את התמונה באופן אוטומטי עם הידוען בפוקוס.

ורנר ווגלס חתך

הקוד מבצע את השלבים הבאים ברמה גבוהה:

  1. הגש בקשה ל recognize_celebrities ממשק API עם התמונה הנתונה ושם הסלבריטאי.
  2. סנן את התגובה עבור מידע התיבה התוחמת.
  3. הוסף קצת ריפוד לתיבה התוחמת כך שנצלם חלק מהרקע.

תנאים מוקדמים

לפריצת דרך זו, יהיו עליכם התנאים המוקדמים הבאים:

העלה את התמונה לדוגמה

העלה את תמונת הסלבריטאים לדוגמה שלך לדלי S3 שלך.

הפעל את הקוד

כדי להפעיל את הקוד, אנו משתמשים במחברת SageMaker, אולם כל IDE יעבוד גם לאחר התקנת Python, Pillow ו-Boto3. אנו יוצרים מחברת SageMaker כמו גם את AWS זהות וניהול גישה תפקיד (IAM) עם ההרשאות הנדרשות. השלם את השלבים הבאים:

  1. צור את המחברת ואת שם זה automatic-cropping-celebrity.

למדיניות ביצוע ברירת המחדל, שנוצרה בעת יצירת המחברת של SageMaker, יש מדיניות פשוטה המעניקה לתפקיד הרשאות אינטראקציה עם Amazon S3.

  1. עדכן את Resource אילוץ עם שם הדלי 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. צור מדיניות נוספת כדי להוסיף לתפקיד IAM מחברת SageMaker כדי להיות מסוגל להתקשר ל- זיהוי סלבריטאים API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

הרשאות IAM

  1. במסוף SageMaker בחר מופעי מחברת בחלונית הניווט.
  2. אתר את automatic-cropping-celebrity מחברת ובחר פתח את צדק.
  3. בחרו חדש ו conda_python3 בתור הגרעין למחברת שלך.

מחברת צדק

עבור השלבים הבאים, העתק את בלוקי הקוד למחברת Jupyter שלך והפעל אותם על ידי בחירה הפעלה.

  1. ראשית, אנו מייבאים פונקציות וספריות מסייעות:
import boto3
from PIL import Image

  1. הגדר משתנים
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. צור לקוח שירות
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. פונקציה לזהות את המפורסמים
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. פונקציה לקבל את התיבה התוחמת של הידוען הנתון:
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. פונקציה להוסיף קצת ריפוד לקופסה התוחמת, כך נלכד קצת רקע סביב הפנים
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. פונקציה לשמירת התמונה באחסון המחברת ובאמזון 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. השתמש בפייתון main() פונקציה לשילוב הפונקציות הקודמות כדי להשלים את זרימת העבודה של שמירת תמונה חתוכה חדשה של הסלבריטאי שלנו:
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()

כשמריצים את בלוק הקוד הזה, אפשר לראות שמצאנו את ורנר ווגלס ויצרנו תמונה חדשה עם הפנים שלו במרכז.

ורנר ווגלס חתך

התמונה תישמר במחברת ותועלה גם לדלי S3.

פלט מחברת Jupyter

אתה יכול לכלול פתרון זה ב-a זרימת עבודה גדולה יותר; לדוגמה, חברת הוצאה לאור עשויה לרצות לפרסם את היכולת הזו כנקודת קצה לעיצוב מחדש ושינוי גודל של תמונות תוך כדי פרסום מאמרים של מפורסמים במספר פלטפורמות.

ניקיון

כדי להימנע מחיובים עתידיים, מחק את המשאבים:

  1. במסוף SageMaker, בחר את המחברת שלך וב- פעולות בתפריט, בחר עצור.
  2. לאחר עצירת המחברת, על פעולות בתפריט, בחר מחק.
  3. במסוף IAM, מחק את תפקיד הביצוע של SageMaker שיצרת.
  4. בקונסולת Amazon S3, מחק את תמונת הקלט וכל קבצי הפלט מדלי ה-S3 שלך.

סיכום

בפוסט זה הראינו כיצד אנו יכולים להשתמש בזיהוי אמזון כדי להפוך משימה ידנית אחרת של שינוי תמונות כדי לתמוך בזרימות עבודה של מדיה. זה חשוב במיוחד בתעשיית ההוצאה לאור, שבה המהירות חשובה בהוצאה מהירה של תוכן טרי ולמספר פלטפורמות.

למידע נוסף על עבודה עם נכסי מדיה, עיין ב מודיעין מדיה זה עתה נעשה חכם יותר עם Media2Cloud 3.0


על המחבר

חיתוך תמונה אוטומטי עם Amazon Rekognition PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

מארק ווטקינס הוא אדריכל פתרונות בצוות המדיה והבידור. הוא עוזר ללקוחות ליצור פתרונות AI/ML הפותרים את האתגרים העסקיים שלהם באמצעות AWS. הוא עבד על מספר פרויקטים של AI/ML הקשורים לראייה ממוחשבת, עיבוד שפה טבעית, התאמה אישית, ML בקצה ועוד. הרחק מהחיים המקצועיים, הוא אוהב לבלות עם משפחתו ולראות את שני הקטנים שלו גדלים.

בול זמן:

עוד מ למידת מכונות AWS