14
1 Amazon Rekognition 을 이용한 Twitter Bot 만들기 Hands-on Lab Guide

AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

Embed Size (px)

Citation preview

Page 1: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

1

Amazon Rekognition을 이용한

Twitter Bot 만들기

Hands-on Lab Guide

Page 2: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

2

Amazon Rekognition을 이용한 Twitter Bot

본 워크샵에서는 Twitter 에 올라온 사진을 변경하거나 이미지에 대한 다양한 특징을

분석해서 새로운 트윗을 자동으로 올리는 Twitter Bot 을 만들어보겠습니다.

딥러닝 기반의 이미지 분석 서비스인 Amazon Rekognition 과 더불어 아래와 같은

다양한 AWS 서비스를 활용합니다.

AWS Lambda

Amazon DynamoDB

Amazon S3

Amazon EC2, Amazon EC2 SSM (Simple System Manager), AWS

Autoscaling, AWS VPC

AWS IAM

본 워크샵에서 사용될 AWS 자원들은 AWS CloudFormation 템플릿 형태로 사전

정의되어 있고, 아래 3 개 리전 중에 하나를 이용해서 구성합니다. 본 예제에서는

오레곤 리전을 사용하겠습니다.

버지니아 리전 (us-east-1)

오레곤 리전 (us-west-2)

아일랜드 리전 (eu-west-1)

Twitter Bot 을 만들기 위해서 Twitter API 를 이용하며, Twitter Application 생성이

필요하고, Python 언어를 사용하게 됩니다.

Page 3: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

3

필수 준비

AWS 계정

본 워크샵을 진행하려면 AWS 기본 계정을 준비해야 합니다. AWS IAM, S3,

DynamoDB, Lambda, EC2, Rekognition 에 접근할 수 있어야 하며, 본 가이드는

한명이 하나의 AWS 계정을 사용한다고 가정합니다. 다른 사람과 계정을

공유하려고하면 특정 리소스에 대해 충돌이 발생하므로 권장하지 않습니다.

본 워크샵의 일환으로 시작하는 대부분의 리소스는 AWS 계정이 12 개월 미만인

경우, 제공하는 AWS 프리티어로 충분히 가능합니다. 프리티어를 넘어서는 경우,

과금일 될 수도 있습니다. 따라서, 새로운 실습용 계정을 만드시길 권장합니다.

자세한 내용은 AWS 프리 티어 페이지를 참조하십시오.

AWS 명령 행 인터페이스

본 워크샵의 첫 번째 모듈을 완료하려면 여러분이 사용하는 컴퓨터에 AWS CLI

(Command Line Interface)가 설치되어 있어야합니다. CLI 를 사용하여 개체를 S3 웹

사이트 버킷에 복사하고, Rekogtion API 를 호출합니다.

AWS CLI 시작하기 안내서에 따라 시스템에 CLI 를 설치 및 구성하십시오.

실습 모듈

이 워크샵은 여섯 가지 실습 모듈로 나뉩니다. 다음으로 진행하기 전에 각 모듈을

완료해야합니다.

모듈 1. Twitter App 생성하기

모듈 2. CloudFormation 스택 시작하기

모듈 3. 테스트 트윗 보내기

모듈 4. 어떻게 동작하는 걸까요

모듈 5. 다양한 Rekognition 기능 이용해보기

워크샵을 마친 후에는 자원 삭제 가이드에 따라 생성 된 모든 리소스를 삭제할 수

있습니다.

Page 4: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

4

모듈 1. Twitter App 생성하기

본 워크샵은 Twitter 계정이 필요합니다. 만약 Twitter 계정이 없는 경우, 계정은 우선

생성해주세요.

1. Twitter Application 을 만들기 위해, https://apps.twitter.com 사이트를

오픈하세요.

2. “Create New App” 버튼을 클릭해서 새로운 App 을 만드는 화면으로 이동합니다.

3. Twitter App 정보를 입력합니다.

Page 5: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

5

4. Twitter App 을 이용하기 위한 몇가지 credential 정보를 생성합니다. 아래 값들은

CloudFormation 스택 생성에 필요하니, 텍스트 편집기 등에 저장해주세요.

Page 6: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

6

모듈 2. CloudFormation 스택 시작하기

실습에 사용할 Lambda 함수 및 관련 인프라 서비스를 구성하기 위해서 직접 하나씩

구성하는 방법대신, CloudFormation 을 이용해서 자동으로 생성하겠습니다. 실습에

사용할 AWS 리전은 아래 3 개 중에 선택하시고, 리전에 해당하는 CloudFormation

템플릿을 다운로드 받아놓으세요.

AWS 리전 AWS CloudFormation 템플릿

us-east-1 (N. Virginia) http://bit.ly/awsdevday1

us-west-2 (Oregon) http://bit.ly/awsdevday2

eu-west-1 (Ireland) http://bit.ly/awsdevday3

1. CloudFormation 콘솔을 열고, “Create Stack” 버튼을 클릭합니다.

2. “Upload a template to Amazon S3”를 선택하고, 다운로드 받은 CloudFormation

템플릿 파일을 업로드합니다. 업로드가 완료되었으면, “Next” 버튼을 눌러주세요.

Page 7: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

7

3. 인프라 및 프로그램 구성에 필요한 정보를 입력합니다. 이 정보들은 Twitter

App 을 생성하면서 만들어진 Credential 값들입니다. 이전 모듈에서 기록해 놓은

값들을 사용합니다.

4. “Next” 버튼을 클릭하고, 모든 리소스가 생성될 때까지 기다립니다. 리소스

생성에 대한 상태는 이벤트 탭을 누르면 확인할 수 있습니다. 리소스가 모두

생성되면, 스택의 상태가 “CREATE_COMPLETE”로 바뀝니다.

Page 8: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

8

모듈 3. 테스트 트윗 보내기

사람 얼굴이 포함된 사진과 함께 트윗 메시지를 보냅니다. 이때, 꼭 트윗 메시지에

본인의 이름은 맨션합니다. 그리고, #AWSDevDaySeoul 해쉬태크도 꼭 넣어주세요.

이후, 테스트에서도 본인 이름 맨션 및 해쉬태그를 꼭 추가해주세요.

예) Hey! Ninja Me. @muhyunkim #AWSDevDaySeoul

조금 후, 다음과 같이 얼굴에 닌자 그림이 나오게 변경되면 성공!

Page 9: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

9

모듈 4. 어떻게 작동하는 걸까요?

소스 코드는 다음 awslabs git 에서 찾아볼 수 있습니다.

https://github.com/awslabs/aws-rekognition-workshop-twitter-bot

/streaming_app/stream.py

1. EC2 인스턴스에서 트위터 API 를 이용해서 사용자의 스트림 내용을 계속

살펴보고 있다가, 트윗 메시지가 있으면 해당 내용을 Kinesis Streams 에

넣습니다.

/lambda_functions/process_stream.py

2. Kinesis Streams 를 트리거로 등록한 Lambda 함수가 호출됩니다.

3. Lambda 함수는 Streams 에 들어온 트윗 내용을 확인하고,

1) 트윗 메시지에 본인의 Screen Name 이 있는지,

2) 그림 파일이 포함되어 있는지,

3) RT 가 아닌지

를 확인하고, 모두 충족하는 경우 아래 과정을 수행합니다.

4. 이미지를 S3 버킷에 저장하고, 트윗 메시지 내용을 DynamoDB 에 저장합니다.

5. Is_nsfw() 함수를 호출해서, Rekognition 의 Image Moderation API 를 호출해서,

적절한 이미지인지 확인합니다. 적절한 이미지이면 다음을 진행합니다.

6. Ninjafy() 함수에서 Rekognition 의 얼굴 분석 API 를 이용해서 얼굴들을 찾고, 각

얼굴의 위치에 NINJA 얼굴 사진을 붙여줍니다.

7. 위 과정이 모두 성공하면, 변조된 이미지를 S3 버켓에 저장하고 새로운 메시지를

트윗 합니다.

Page 10: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

10

모듈 5. 다양한 Rekognition 기능 이용해보기

이 모듈을 수행하기 위해서는 EC2 인스턴스 (t2.micro)를 생성한 후, 해당

인스턴스에 SSH 로 로그인해서 아래와 같이 필요한 파일을 clone 을 합니다.

git clone https://github.com/awslabs/aws-rekognition-workshop-twitter-bot.git

aws-rekognition-workshop-twitter-bot/lambda_functions 디렉터리에서 아래

과제를 수행합니다.

1. Mask.png 파일을 원하는 얼굴 파일로 바꾼 후, Lambda 함수 ZIP 파일

업데이트해서 다른 얼굴로 바꾸기

힌트: 파일을 변경하고, Lambda 함수 및 파일을 아래 명령어로 압축한 후,

Lambda 함수를 업데이트 합니다.

# 압축 파일 생성

./build.sh process_stream.zip process_stream.py mask.png

# Lambda 함수 업데이트

aws lambda update-function-code --function-name <Lambda 함수 이름> --zip-

file fileb://process_stream.zip

/lambda_functions/process_stream.py 함수를 수정해서 다음과 같은 기능을

추가해보세요.

Process_stream.py 파일을 변경한 후, 아래와 같이 Lambda 함수 압축 파일을

업데이트하고, Lambda 함수를 업데이트 하세요.

# 압축 파일 생성

zip -9 process_stream.zip process_stream.py

# Lambda 함수 업데이트

aws lambda update-function-code --function-name <Lambda 함수 이름> --zip-

file fileb://process_stream.zip

Page 11: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

11

2. 수염이 있거나, 안경을 낀 사람을 찾아서 트윗 메시지에 표시하기

힌트: lambda_handler 함수안에서 “processed = ninjafy(s3obj, MASK)”

이전에 아래 코드를 이용해서 얼굴 특징을 분석한 후, 결과에 따라서

mention_str 에 원하는 문구를 넣어보세요.

http://boto3.readthedocs.io/en/latest/reference/services/rekognition.htm

l#Rekognition.Client.detect_faces

response = client.detect_faces(

Image={

'Bytes': b'bytes',

'S3Object': s3obj

},

Attributes=[

'Beard','Mustache','Eyeglasses'

]

)

3. 유명인이 있는지 찾아보고 있으면 이름을 메시지에 표시하기

힌트: lambda_ handler 함수안에서 “processed = ninjafy(s3obj, MASK)”

이전에 아래 코드를 이용해서 유명인 검색 후, 결과에 따라서

mention_str 에 원하는 문구를 넣어보세요.

http://boto3.readthedocs.io/en/latest/reference/services/rekognition.htm

l#Rekognition.Client.recognize_celebrities

response = rekognition.recognize_celebrities(

Image={

'Bytes': b'bytes',

'S3Object': s3obj

}

)

Page 12: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

12

4. Rekognition 의 친구 Collection 을 만들어서 특정 인물들을 인덱싱하고, 해당

인물이 있는지 찾아서 있으면 메시지에 이름을 표시하기

얼굴을 인덱싱해서 저장할 Collection 을 생성 (오레곤 리전 사용을 가정. 다른

리전 사용시, --region 값을 해당 리전에 맞도록 변경)

aws rekognition create-collection --collection-id "friend" --region us-west-2

인덱싱할 사람이 포함된 사진을 S3 bucket 에 올리기

S3 bucket 에 저장된 사진을 1)에서 만든 Collection 에 인덱싱으로 추가하기

aws rekognition index-faces --collection-id friend --image

"S3Object={Bucket=<S3 Bucket 이름>,Name=<사진 이름>}" --external-image-

id "My Friend" --region us-west-2

Process_stream.py 에 아래 코드를 응용해서 기능 추가

힌트: lambda_ handler 함수안에서 “processed = ninjafy(s3obj, MASK)”

이전에 아래 코드를 이용해서 얼굴 검색 후, 결과에 따라서 mention_str 에

원하는 문구를 넣어보세요.

http://boto3.readthedocs.io/en/latest/reference/services/rekognition.htm

l#Rekognition.Client.search_faces_by_image

response = rekognition.search_faces_by_image(

CollectionId='friend',

Image={

'Bytes': b'bytes',

'S3Object': s3obj

},

MaxFaces=10,

FaceMatchThreshold=90

)

Page 13: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

13

워크샵 정리 가이드

이 페이지는 이전 모듈에서 작성된 자원을 정리하는 지시 사항을 제공합니다.

CloudFormation 스택 삭제

1. AWS Management 콘솔에서, Services 를 클릭한 다음 CloudFormation 을

선택하십시오.

2. 모듈 2 에서 생성한 스택을 선택하세요.

3. Actions 드롭 다운 메뉴를 펼쳐서 Delete Stack 을 선택하십시오.

4. Status 가 “DELETE COMPLETE”가 아니면, Resource 탭을 선택해서 삭제되지

않은 리소스를 확인하고 직접 삭제를 해주세요. 보통, S3 버킷에 객체가 남아

있으면 삭제되지 않는 경우이니, 해당 버킷의 객체를 모두 삭제하고 버킷을 직접

삭제해주시면 됩니다. 제공된 AWS CloudFormation 템플릿을 사용하려 모듈

1 을 완성한 경우, AWS CloudFormation 콘솔을 사용하여 스택을 삭제하기만

하면 됩니다. 그렇지 않다면, 모듈 1 에서 생성한 Amazon S3 버킷을

삭제하십시오.

S3 버킷 삭제

1. AWS Management 콘솔에서 Services 를 선택한 다음 Storage 에서 S3 를

선택하십시오.

2. 모듈 2 에서 지정한 CloudFormation Stack 이름으로 시작하는 버킷들을

선택하십시오.

3. Delete bucket 을 선택하십시오.

4. 확인 메시지가 나타나면 버킷의 이름을 입력하고 확인(confirm)을 선택하십시오.

EC2 인스턴스 삭제

1. AWS Management 콘솔에서 Services 를 선택한 EC2 를 선택하십시오.

2. 모듈 5 에서 생성한 EC2 인스턴스를 선택하고, “Action” > “Instance State” >

“Terminate”를 클릭해서 인스턴스를 삭제하세요.

CloudWatch Logs

Page 14: AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇

14

AWS Lambda 는 Amazon CloudWatch Logs 에 함수당 새로운 로그 그룹을

자동으로 생성하고 함수가 호출 될 때마다 로그를 기록합니다. 모듈 2 에서 지성한

CloudFormation Stack 이름으로 시작하는 함수에 대한 로그 그룹을

삭제해야합니다.

1. AWS Management 콘솔 에서 Services 를 클릭한 다음 Management Tools 에서

CloudWatch 를 선택하십시오.

2. 네비게이션 메뉴에서 Logs 를 선택하십시오.

3. /aws/lambda/<CloudFormation Stack 이름>… 로그 그룹을 선택하십시오.

4. Actions 드롭 다운 메뉴에서 Delete log group 를 선택하십시오.

5. 확인 메시지가 나타나면 Yes, Delete 를 선택하십시오.