한 개인 개발자로서 얼굴인식을 활용한 앱을 개발 중이었는데 사용자들이 얼굴 사진이 아닌 다른 사진을 업로드할 경우, 앱이 올바르게 작동하지 않는 문제가 발생했다. 이 문제를 해결하기 위해 얼굴사진을 인식하는 기능을 개발해야만 했다.
하지만 다행히도, 내가 참가한 교육 프로그램에서 이를 해결할 수 있는 API 개발 방법을 배울 수 있었다.
이 교육을 통해 얼굴인식 기능을 구현할 수 있는 방법으로 생각해 볼 수 있게 되었는데 이러한 경험에서 내가 배운 것들을 블로깅으로 기록하고자 한다. 이번 블로깅을 통해 다른 개발자들에게도 도움이 되었으면 한다.
이번 블로깅은 AWS Cloud9과 Streamlit을 이용하여 손쉬운 개발환경을 구축하고, Rekognition을 활용하여 이미지 분석을 진행해보려고 한다.
<진행순서>
💡 <진행순서>
1. AWS Cloud9 개념 설명 및 실습
2. 파이썬 Streamlit 라이브러리를 사용한 실습 진행
3. AWS Rekognition 개념 설명 및 실습
우선 각 기능들의 간단한 개념을 알아보고 환경을 생성해 보자.
1. AWS Cloud9이란
- 클라우드 기반의 통합 개발 환경(IDE)이다.
- 개발자들의 웹브라우저만으로 코드를 작성 및 디버깅, 실행할 수 있도록 지원해준다.
- AWS의 다른 서비스와 통합되어 있어, AWS 리소스와 함께 개발 환경을 설정하고 애플리케이션을 배포하는데 도움을 준다.
참고: https://docs.aws.amazon.com/ko_kr/cloud9/latest/user-guide/welcome.html
실습을 통해 AWS Cloud9을 생성하고 웹페이지가 구동되는 것을 확인해보자.
1-1) Cloud9 생성
- AWS Console에서 Cloud9을 검색하여 create Enviroment를 선택한다.
- Name과 Description을 입력해준다. Environment type에 New EC2 instance와 Existing compute 두 개의 선택 사항이 있는데 기존의 연결할 EC2가 있는 경우 Existing compute를 선택. 그렇지 않고 새로운 EC2를 만들고 연결할 경우 New EC2 instance를 선택한다. 우리는 새로운 EC2를 생성해보자.
1-2) Cloud9 생성 완료
- 방금 만들었던 cloud9_test가 성공적으로 만들어졌다.
- 이제 Cloud9 IDE의 Open을 클릭해준다.
1-3) Cloud9 접속
- Cloud9 IDE를 오픈하면 볼 수 있는 Cloud9 접속화면이다.
- 하단 terminal에서 아래 명령어를 입력해준다.
- flask는 웹 어플리케이션을 개발하기 위한 경량 웹 프레임워크이다.
1-4) 코드 작성
- root 경로에 main.py 생성 후 아래 코드를 작성한다.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "hello~\n"
@app.route("/hello/<name>")
def hello_world(name):
return f"hello~, {name}!\n"
if __name__ == '__main__':
app.run()
1-5) 코드 실행
작성을 하고 Cloud9 terminal에서 python main.py로 실행을 해주면 아래와 같은 error 메시지를 볼 수 있는데 당연히 안될것이 우리는 EC2의 보안그룹에서 인바운드 규칙을 아무것도 적용해주지 않았기 때문이다.
1-6) 인바운드 규칙 편집
자, 이제 수정해보자.
먼저 Cloud9의 코드에서 외부에서 접근 가능하도록 host를 0.0.0.0 으로 설정해주고 port를 8080으로 변경해주자. 그리고 EC2의 보안그룹 인바운드 규칙을 편집해보자!
app.run(host="0.0.0.0", port="8080")
외부에서 접근 가능하도록 Network 설정해주자
- 만들었던 AWS EC2 인스턴스로 가보자.
- 좌측 메뉴 : 인스턴스 → 인스턴스 목록에서 ID클릭 → 하단 보안 탭 → 보안그룹 클릭한다.
- 인바운드 규칙 편집 → 규칙 추가 → 아래와 같이 입력 후 → 규칙 을 저장한다.
- 좌측 메뉴 : 인스턴스 → 인스턴스 목록에서 체크
- 퍼블릭 IPv4 주소 복사한다.( 또는 퍼블릭 IPv4 DNS 복사 )
- 브라우저에서 아래 url 로 접속해보자.
- http://{복사한 ip}:8080
- http://{복사한 ip}:8080/hello/aws
짜잔~ 이제 정상적으로 웹 페이지가 동작하는걸 구경해볼 수 있다.
다음은 Cloud9에서 streamlit 라이브러리를 사용하여 간단한 웹서비스를 만들어 보도록 하자.
우선 Streamlit에 대해 간단하게 알아보도록 하자.
2. Streamlit이란
- 웹 애플리케이션을 빠르고 쉽게 개발할 수 있도록 도와주는 오픈소스 Python 라이브러리이다.
- 데이터 시각화, 웹 애플리케이션 개발 등 다양한 목적으로 사용할 수 있다.
- 직관적이고 interactive한 웹 애플리케이션을 빠르게 개발할 수있도록 도와준다.
- 데이터 분석가나 개발자는 더욱 직관적으로 데이터를 시각화하고 이해할 수 있다.
실습을 통해 간단한 웹페이지를 만들어보도록 하자.
2-1) requirements.txt 파일 생성
- Cloud9으로 접속 후 requirements.txt 파일을 만들고 필요한 라이브러리를 입력해 준다.
streamlit==1.20.0
이렇게 requirements.txt 안에 필요한 라이브러리들을 입력해준 후에 terminal에서 아래 명령어로 설치를 진행해준다.
여기서 주의해야할 점은 반드시 저장한 후에 아래 명령어를 입력해야한다는 점이다.
저장을 하지 않을 경우 “Defaulting to user installation because normal site-packages is not writeable” 이라는 error 메시지가 뜨면서 설치가 되지 않는다.
2-2) 코드 작성
이제 streamlit 웹 페이지를 띄울 main.py를 작성해보자!
import streamlit as st
st.title("Streamlit Test")
input_user_name = st.text_input(label="User Name", value="default value")
check_1 = st.checkbox(label="agree", value=False)
if st.button("Confirm"):
con = st.container()
con.caption("Result")
con.write(f"User Name is {str(input_user_name)}")
con.write(f"agree : {check_1}")
2-3) 인스턴스 보안그룹 설정
main.py를 작성한 후에 우리는 외부에서 접속이 가능하도록 인스턴스의 보안그룹을 수정해주어야 한다.
- 외부에서 접속 가능하도록 EC2 → 해당 인스턴스 → 보안그룹 → 인바운드 규칙 으로 접속한다.
- streamlit 은 8501번 포트를 사용한다.
- 포트 범위는 8500-8600 으로 입력, 소스는 Anywhere-IPv4 로한다.
- 저장 후 인스턴스에서 퍼블릭 IPv4 주소 또는 퍼블릭 IPv4 DNS 주소 복사 한다.
2-4) 웹페이지 실행 확인
- 터미널에서 아래 명령어로 실행한다.브라우저 열고 주소창에 http://{위 주소 중 하나}:8501 입력한다.
- External URL로 들어가면 아래 Streamlit 웹 페이지가 정상적으로 실행되는걸 확인할 수 있다.
이제는 cloud9과 streamlit을 사용하여 간단한 웹페이지를 만들고 aws에서 제공하는 Rekognition을 이용하여 얼굴을 인식하고 분석할 수 있는 페이지를 개발해보자!
우선은 AWS Rekognition이 무엇인지 알아보자.
3. AWS Rekognition이란
- AWS 에서 제공하는 이미지 및 비디오 인식 서비스이다.
- 기계 학습 알고리즘을 활용하여 이미지와 비디오에서 객체, 얼굴 텍스트 , 라벨등을 인식하고 분석할 수 있다.
- 얼굴 인식, 물체 및 장면 인식, 텍스트 인식, 안전 감시 기능을 제공한다.
- AWS 서비스와 연동하여 사용할 수 있다.
참고: https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/what-is.html
3-1) 라이브러리 설치
Cloud9 접속 후 root 디렉토리에 requirements.txt에 필요한 라이브러리들을 기입해준후에 terminal에서 “pip install -r requirements.txt” 입력하여 라이브러리들을 설치해준다.
# requirements.txt 파일
streamlit==1.20.0
numpy==1.21.6
opencv-python-headless==4.5.1.48
boto3==1.26.107
Pillow==9.5.0
flask==2.2.3
# 터미널에 작성
pip install -r requirements.txt
- import
import json
import cv2
import boto3
import numpy as np
import streamlit as st
- 업로드 된 File 에서 bytes 와 numpy array (image) 생성하는 function
def prepare_image(file):
file_bytes = file.read()
nd_bytes = np.asarray(bytearray(file_bytes), dtype=np.uint8)
return file_bytes, cv2.imdecode(nd_bytes, 1)
- bound box 를 그리는 function
def draw_bbox(img, bbox):
h, w, _ = img.shape
x1 = int(bbox['Left'] * w)
y1 = int(bbox['Top'] * h)
x2 = int((bbox['Left'] + bbox['Width']) * w)
y2 = int((bbox['Top'] + bbox['Height']) * h)
cv2.rectangle(im, (x1, y1), (x2, y2), (0, 255, 0), 2)
- Amazon session 과 rekognition client 초기화
session = boto3.Session(profile_name='default')
client = session.client('rekognition')
- Title 과 Upload File Component 생성
st.title("rekognition FaceDetections")
uploaded_file = st.file_uploader("Choose a image")
- rekognition api 호출
response = client.detect_faces(Image={'Bytes': file_bytes}, Attributes=['ALL'])
- file 이 업로드 되면 실행되는 코드
if uploaded_file is not None:
file_bytes, im = prepare_image(uploaded_file)
response = client.detect_faces(Image={'Bytes': file_bytes}, Attributes=['ALL'])
for faceDetail in response['FaceDetails']:
st.text('The detected face is between ' + str(faceDetail['AgeRange']['Low']) + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old')
print('Here are the other attributes:')
print(json.dumps(faceDetail, indent=4, sort_keys=True))
st.text("Gender: " + str(faceDetail['Gender']))
st.text("Smile: " + str(faceDetail['Smile']))
st.text("Eyeglasses: " + str(faceDetail['Eyeglasses']))
st.text("Emotions: " + str(faceDetail['Emotions'][0]))
draw_bbox(im, faceDetail['BoundingBox'])
st.image(im, channels="BGR")
전체 소스
- file name : face.py
import json
import cv2
import boto3
import numpy as np
import streamlit as st
def prepare_image(file):
file_bytes = file.read()
nd_bytes = np.asarray(bytearray(file_bytes), dtype=np.uint8)
return file_bytes, cv2.imdecode(nd_bytes, 1)
def draw_bbox(img, bbox):
h, w, _ = img.shape
x1 = int(bbox['Left'] * w)
y1 = int(bbox['Top'] * h)
x2 = int((bbox['Left'] + bbox['Width']) * w)
y2 = int((bbox['Top'] + bbox['Height']) * h)
cv2.rectangle(im, (x1, y1), (x2, y2), (0, 255, 0), 2)
session = boto3.Session(profile_name='default')
client = session.client('rekognition')
st.title("rekognition FaceDetections")
uploaded_file = st.file_uploader("Choose a image")
if uploaded_file is not None:
file_bytes, im = prepare_image(uploaded_file)
response = client.detect_faces(Image={'Bytes': file_bytes}, Attributes=['ALL'])
for faceDetail in response['FaceDetails']:
st.text('The detected face is between ' + str(faceDetail['AgeRange']['Low']) + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old')
print('Here are the other attributes:')
print(json.dumps(faceDetail, indent=4, sort_keys=True))
st.text("Gender: " + str(faceDetail['Gender']))
st.text("Smile: " + str(faceDetail['Smile']))
st.text("Eyeglasses: " + str(faceDetail['Eyeglasses']))
st.text("Emotions: " + str(faceDetail['Emotions'][0]))
draw_bbox(im, faceDetail['BoundingBox'])
st.image(im, channels="BGR")
실행(terminal)
- streamlit run face.py 명령어를 사용하여 실행한다.
- instance public IPv4로 접속한다. ( 앞서 다른 실습과 마찬가지로 해당 실습도 보안 그룹에서 해당 port에 대한 인바운드 규칙이 필요하다.)
- port는 streamlit 실행 시 확인할 수 있다.
접속
- instance public IPv4 로 접속한다. (보안그룹에서 해당 port에 대한 인바운드 규칙 필요)
- port 는 streamlit 실행 시 확인할 수 있다.
External URL 주소로 입력하여 들어가면 해당 rekognition FaceDetections 페이지를 확인해 볼 수 있다.
인식정보는 나이, 성별 , 감정, 안경 착용 유무 총 이렇게 5가지를 확인해 볼 수 있다. (신기하다..이렇게 간단하게 만들 수 있다니...ᐟ )
이번 블로그에서는 AWS Cloud9과 Streamlit을 활용하여 Rekognition을 이용한 이미지 분석 기능을 구현해봤다. 이를 통해 손쉽게 이미지 인식 기능을 구현할 수 있으며, 이를 활용하여 다양한 분야에서 유용한 애플리케이션을 개발할 수 있고 지금 사이드 프로젝트에 개발 중인 얼굴인식 기능도 이 기능을 활용하여 개발을 진행해보려고 한다. 이번 블로깅을 통해 다른분들도 AWS Cloud9과 Streamlit을 활용하여 다양한 이미지 인식 기능을 구현해보길 바란다.
참고: https://important-owner-fb5.notion.site/AWS-ec48c3e723854c1aabe6c10f21c35fda
'AWS > 기능 소개 및 에러처리' 카테고리의 다른 글
AWS EC2 SSH X-shell로 연결하기 (0) | 2023.07.05 |
---|---|
[AWS Ec2] Failed to connect to your instance, Error establishing SSH connection to your instance 에러 해결법 (0) | 2023.06.26 |
DNN학습에서의 AWS EC2 g4dn xlarge vs 2xlarge 성능 및 과금비교 (0) | 2023.04.18 |
AWS SageMaker Immersion Day (0) | 2023.02.07 |
AWS 모니터링을 위한 Slack 연동(with AWS lambda, CloudWatch) (6) | 2023.01.30 |