Amazon Rekognition을 사용한 자동 이미지 자르기

Amazon Rekognition을 사용한 자동 이미지 자르기

디지털 퍼블리셔는 새로운 콘텐츠를 최대한 빠르게 생성하고 게시하기 위해 미디어 워크플로를 간소화하고 자동화하는 방법을 지속적으로 찾고 있습니다.

많은 게시자가 기사에 사용하는 대규모 스톡 이미지 라이브러리를 보유하고 있습니다. 이러한 이미지는 특히 게시자가 유명인의 이미지를 가지고 있는 경우 다양한 스토리에 여러 번 재사용할 수 있습니다. 꽤 자주 기자는 다가오는 기사에 사용하기 위해 이미지에서 원하는 유명인을 잘라야 할 수 있습니다. 이것은 자동화되어야 하는 수동적이고 반복적인 작업입니다. 때로는 작성자가 유명인의 이미지를 사용하고 싶을 수 있지만 여기에는 두 사람이 포함되어 있고 주요 유명인은 이미지에서 잘라야 합니다. 다른 경우에는 모바일, 소셜 미디어 또는 디지털 뉴스와 같은 다양한 플랫폼에 게시하기 위해 유명인 이미지의 형식을 다시 지정해야 할 수 있습니다. 또한 작성자는 이미지 종횡비를 변경하거나 유명인을 선명하게 초점을 맞춰야 할 수 있습니다.

이 게시물에서는 사용 방법을 보여줍니다. 아마존 인식 이미지 분석을 수행합니다. Amazon Rekognition을 사용하면 기계 학습(ML) 전문 지식 없이도 이 기능을 애플리케이션에 쉽게 추가할 수 있으며 객체 감지, 콘텐츠 조정, 얼굴 감지 및 분석, 텍스트 및 유명인 인식과 같은 사용 사례를 충족하는 다양한 API가 함께 제공됩니다. 이 예에서 사용합니다.

XNUMXD덴탈의 유명인 인식 기능 in 아마존 인식 ML을 사용하여 이미지와 비디오에서 수만 명의 잘 알려진 인물을 자동으로 인식합니다. 유명인 인식은 주어진 유명인의 존재뿐만 아니라 이미지 내의 위치도 감지할 수 있습니다.

솔루션 개요

이 게시물에서는 사진, 유명인 이름 및 출력된 이미지의 종횡비를 전달하여 지정된 유명인의 얼굴을 중앙에 캡처하는 잘린 이미지를 생성할 수 있는 방법을 보여줍니다.

함께 작업 할 때 Amazon Rekognition 유명인 감지 API, 많은 요소가 응답에 반환됩니다. 다음은 몇 가지 주요 응답 요소입니다.

  • MatchConfidence – API 동작을 제어하는 ​​데 사용할 수 있는 일치 신뢰도 점수입니다. 애플리케이션에서 이 점수에 적절한 임계값을 적용하여 선호하는 작동 지점을 선택하는 것이 좋습니다. 예를 들어 임계값을 99%로 설정하면 잘못된 긍정을 제거할 수 있지만 일부 잠재적인 일치 항목을 놓칠 수 있습니다.
  • 이름, ID 및 URL – 유명인 이름, 고유한 Amazon Rekognition ID 및 추가 정보를 위한 유명인의 IMDb 또는 Wikipedia 링크와 같은 URL 목록.
  • 바운딩박스 – 인식된 각 유명인 얼굴에 대한 직사각형 경계 상자 위치의 좌표.
  • 알려진 성별 – 알려진 각 유명인의 알려진 성 정체성.
  • 감정 – 유명인의 얼굴에 표현된 감정, 예를 들어 행복, 슬픔, 분노.
  • 자세 – 롤, 피치, 요 XNUMX축을 이용한 유명인 얼굴 포즈.
  • 미소 - 연예인이 웃는지 아닌지.

Amazon Rekognition의 API 응답 일부에는 다음 코드가 포함됩니다.

{ "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%임을 의미합니다.

Werner Vogels 바운딩 박스

이 경계 상자를 사용하면 이제 논리를 사용하여 얼굴이 우리가 만드는 새 이미지의 가장자리 내에 남아 있는지 확인할 수 있습니다. 이 경계 상자 주위에 약간의 패딩을 적용하여 얼굴을 중앙에 유지할 수 있습니다.

다음 섹션에서는 Werner Vogels가 선명하게 초점을 맞춘 다음 잘린 이미지 출력을 만드는 방법을 보여줍니다.

우리는 아마존 세이지 메이커 코드를 실행하여 Amazon Rekognition에 이미지를 전달한 다음 유명인에 초점을 맞춰 이미지를 자동으로 수정할 수 있는 Python 환경을 제공하는 노트북.

Werner Vogels 크롭

이 코드는 다음과 같은 상위 수준 단계를 수행합니다.

  1. 에 요청하기 recognize_celebrities 주어진 이미지와 유명인의 이름을 가진 API.
  2. 경계 상자 정보에 대한 응답을 필터링합니다.
  3. 일부 배경을 캡처하도록 경계 상자에 약간의 패딩을 추가합니다.

사전 조건

이 연습에서는 다음과 같은 전제 조건이 있어야합니다.

샘플 이미지 업로드

샘플 유명인 이미지를 S3 버킷에 업로드합니다.

코드 실행

코드를 실행하기 위해 SageMaker 노트북을 사용하지만 Python, pillow 및 Boto3를 설치한 후에도 모든 IDE가 작동합니다. 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. 호출할 수 있도록 SageMaker 노트북 IAM 역할에 추가할 또 다른 정책을 생성합니다. 유명인사 알아보기 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. 노트북 스토리지와 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. 파이썬 사용 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()

이 코드 블록을 실행하면 Werner Vogels를 찾아 중앙에 그의 얼굴이 있는 새 이미지를 생성한 것을 볼 수 있습니다.

Werner Vogels 크롭

이미지는 노트북에 저장되고 S3 버킷에도 업로드됩니다.

주피터 노트북 출력

이 솔루션을 더 큰 워크플로; 예를 들어 출판사는 유명인의 기사를 여러 플랫폼에 게시할 때 이미지를 즉시 다시 포맷하고 크기를 조정하기 위해 이 기능을 끝점으로 게시할 수 있습니다.

청소

향후 요금이 발생하지 않도록 하려면 리소스를 삭제하세요.

  1. SageMaker 콘솔에서 노트북을 선택하고 행위 메뉴, 선택 중지.
  2. 노트북이 중지된 후 행위 메뉴, 선택 ..
  3. IAM 콘솔에서 생성한 SageMaker 실행 역할을 삭제합니다.
  4. Amazon S3 콘솔에서 입력 이미지와 S3 버킷의 모든 출력 파일을 삭제합니다.

결론

이 게시물에서는 Amazon Rekognition을 사용하여 미디어 워크플로를 지원하기 위해 이미지를 수정하는 수동 작업을 자동화하는 방법을 보여주었습니다. 이는 최신 콘텐츠를 신속하게 여러 플랫폼에 제공하는 데 있어 속도가 중요한 출판 업계에서 특히 중요합니다.

미디어 자산 작업에 대한 자세한 내용은 다음을 참조하십시오. Media2Cloud 3.0으로 더욱 스마트해진 미디어 인텔리전스


저자에 관하여

Amazon Rekognition PlatoBlockchain Data Intelligence를 사용한 자동 이미지 자르기. 수직 검색. 일체 포함.

마크 왓킨스 미디어 및 엔터테인먼트 팀의 솔루션 아키텍트입니다. 그는 고객이 AWS를 사용하여 비즈니스 문제를 해결하는 AI/ML 솔루션을 생성하도록 돕습니다. 그는 컴퓨터 비전, 자연어 처리, 개인화, 에지에서의 ML 등과 관련된 여러 AI/ML 프로젝트에 참여했습니다. 직업 생활을 떠나 가족과 함께 시간을 보내고 어린 두 아이가 자라는 것을 지켜보는 것을 좋아합니다.

타임 스탬프 :

더보기 AWS 기계 학습