Rekognition을 활용한 서버리스 이미지 처리 방법

4분 분량
콘텐츠 수준: 중급
0

Amazon Rekognition은 이미지 및 비디오의 데이터를 분석할 수 있는 서비스입니다. 이를 이용하여 S3에 업로드 이벤트를 트리거 삼아 Amazon Lambda 에서 boto3 SDK를 통해 이미지의 텍스트를 인식하고 Amazon DynamoDB에 저장하는 방법에 대해 설명합니다.

현재 문서에서 사용하는 서비스들의 간략한 설명

AWS Lambda은 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 고가용성 컴퓨팅 인프라에서 코드를 실행하고 서버와 운영 체제 유지 관리, 용량 프로비저닝 및 자동 조정, 코드 및 보안 패치 배포, 로깅 등 모든 컴퓨팅 리소스 관리를 수행합니다.

Amazon S3는 업계 최고 수준의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 고객은 규모와 업종에 관계없이 원히는 양의 데이터를 저장하고 보호하여 데이터 레이크, 클라우드 네이티브 애플리케이션 및 모바일 앱과 같은 거의 모든 사용 사례를 지원할 수 있습니다.

Amazon DynamoDB는 모든 규모에서 고성능 애플리케이션을 실행하도록 설계된 완전관리형의 서버리스 키-값 NoSQL 데이터베이스입니다. DynamoDB는 기본 제공 보안, 지속적인 백업, 자동화된 다중 리전 복제, 인 메모리 캐시 및 데이터 가져오기/내보내기 도구를 제공합니다.

Amazon Rekognition은 이미지 및 비디오에서 정보와 인사이트를 추출하기 위해 사전 훈련된 컴퓨터 비전(CV) 및 사용자가 지정 가능한 CV 기능을 제공합니다.

솔루션 개요

아래 그림은 이번 가이드에서 제공하는 솔루션에 대한 전체 아키텍처를 나타냅니다. S3에 이미지를 업로드시, 이를 트리거 삼아 Lambda에서 감지합니다. Lambda에서는 트리거된 S3의 이미지를 불러와 Rekognition으로 분석한후 텍스트를 추출합니다. 추출한 텍스트를 이미지 이름과 함께 DynamoDB에 저장합니다.

여기에 이미지 설명 입력

Step1. 이미지 업로드할 S3 버킷 생성

  1. Amazon S3에 접속하여 [버킷 만들기]를 클릭합니다.
  2. [버킷이름]에 <reokognition-bucket-이름> 으로 버킷을 생성합니다.
  3. 모든 구성을 기본구성으로 한뒤 [버킷 만들기]를 클릭하여 버킷을 생성합니다.

Step2. Lambda 실행역할에 필요한 IAM 역할 생성

  1. 정책생성: IAM 콘솔에서 [정책], [정책생성],[JSON]을 클릭하고 아래의 JSON을 붙여넣은뒤 s3-trigger-tutorial 로 정책을 생성합니다.

[+] https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example.html#with-s3-example-create-policy

{
"Version": "2012-10-17",
    "Statement": [
        {
"Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogGroup",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
"Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::*/*"
        }
    ]
}
  1. IAM 역할,[역할 생성], [Lambda] 클릭후, s3-trigger-tutorial 정책을 추가한뒤 Lambda_S3_DynamoDB_Rekognition 라는 이름으로 역할을 생성합니다.
  2. 위에서 생성한 IAM역할에 AmazonDynamoDBFullAccess, AmazonRekognitionFullAccess 정책을 추가합니다.

여기에 이미지 설명 입력

Step3. Lambda 함수 생성하기

  1. Lambda 페이지에서 [함수 생성]을 클릭합니다.
  2. 함수이름에 Rekognition_Serverless_Function 이라는 이름을 입력하고 런타임을 Python 3.11로 설정합니다.
  3. [기본 실행 역할 변경]을 클릭한뒤 [기존역할]에서 Lambda_S3_DynamoDB_Rekognition 를 선택한뒤 함수를 생성합니다.

여기에 이미지 설명 입력

Step4. Lambda의 S3 트리거 설정하기

  1. 만들어진 Lambda 함수에서 트리거 추가를 클릭합니다.
  2. [트리거 구성]에서 S3를 클릭한뒤 이전 단계에서 생성한 버킷(<reokognition-bucket-이름>)을 지정합니다.
  3. 이후 기본적인 설정을 유지하고 [Recursive invocation] 을 동의하고 [추가]를 클릭합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

Step5. DynamoDB 테이블 생성

  1. DynamoDB 에서 [테이블 생성]을 클릭합니다.
  2. 테이블 이름은 S3_Recokgintion_DB로 설정합니다.
  3. 파티션 키는 테이블의 기본키로 여기에서는 image 이름(image_id)으로 지정하겠습니다.
  4. 이후 나머지 설정은 기본값으로 유지한채 [테이블 생성]을 클릭합니다.

여기에 이미지 설명 입력

Step6. Lambda의 코드를 수정한뒤 배포

(* 아래의 링크를 통해 참고한 코드 및 문서를 확인해주세요.[1][2][3])

  1. 이전단계에서 만들었던 Lambda 함수에서 [코드]를 클릭합니다.
  2. 아래의 소스 코드를 붙여넣은뒤 Ctrl + S를 눌러서 저장합니다.
  3. 이후 [Deploy]를 눌러서 해당 코드를 배포합니다.
import json
import urllib.parse
import boto3

s3 = boto3.client('s3')

def detect_text(photo, bucket):
    client = boto3.client('rekognition')
    response = client.detect_text(Image={'S3Object': {'Bucket': bucket, 'Name': photo}})
    lst=[]
    textDetections = response['TextDetections']
    for text in textDetections:
        if 'ParentId' in text:
            continue
        lst.append(text['DetectedText'])
    return ' '.join(lst)

def insert_data(image_id,detect_text):
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('S3_Recokgintion_DB')
    data={"image_id":image_id,"detect_text":detect_text}
    response = table.put_item(Item=data)


def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    photo= urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    text=detect_text(photo,bucket)
    try:
        insert_data(photo,text)
    except Exception as e:
        raise Exception

Step7. S3 버킷으로 업로드 한뒤 DynamoDB 테이블에서 확인

  1. 이전에 만들어둔 S3 버킷에 텍스트 인식을 원하는 이미지를 업로드 합니다.
  2. 인식할 이미지를 선택한뒤 드래그 앤 드랍으로 S3 버킷에 업로드 합니다.

여기에 이미지 설명 입력

Step8. DynamoDB 테이블에서 확인

  1. DynamoDB 에서 [테이블] 클릭한뒤 이전에 만들었던 [S3_Recokgintion_DB]을 클릭합니다.
  2. [표 항목 탐색]을 누른뒤 [항목 스캔 또는 쿼리]에서 실행을 누르면 image 이름과 감지된 내용을 확인할 수 있습니다.

여기에 이미지 설명 입력

리소스 정리

Amazon DynamoDB

  • DynamoDB 테이블을 삭제합니다.

Amazon Lambda

  • 생성한 람다함수를 삭제합니다.

Amazon S3

  • 생성한 S3 버킷을 삭제합니다

참고:

[1] 이미지에서 텍스트 감지

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/text-detecting-text-procedure.html

[2] Amazon Rekognition: DetectText

https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectText.html

[3] DynamoDB : put_item

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/put_item.html

profile pictureAWS
지원 엔지니어
게시됨 9달 전335회 조회