본문 바로가기
API/AWS API

AWS - 객체 감지 API

by 하니__ 2024. 5. 28.

 

 

 

AWS 에는

 

이런 기능이 있다

 

사진을 올리면

 

 

사진안에 어떤 정보가 있는지

사람이 있는지 차가 있는지 등등

 

 

 

웃는지 우는지 화났는지 등등

분석이나 두 사진을 비교하여 동일인인지 체크하는등 의 기능이 있다

 

이것을 객체 감지

오브젝트 디텍션이라고 하는데 이 기능을 사용해보자

 

 

API 설정

 

사진 업로드 API와 다른것이라고는 경로와

 

별다른 텍스트를 담고 있지 않는 점 정도

 

 

그럼 코드를 작성해보자

 

rekognition.py 작성

 

AWS의 이 기능 이름이 rekognition 이라서 그대로 이름 지어봤다

 

from datetime import datetime 
import boto3
from flask import request
from flask_restful import Resource

from config import Config



class ObjectDetectionResource(Resource) : 
    
    
    def post(self) :

 

우선 사진 업로드 API때와 같은것을 copy&paste  후

 

클래스 이름을 만들고

 

POST로 설정

 

 

if 'photo' not in request.files :
    return{"result" : "fail",
           "error" : "파일을 업로드 하세요"} , 400        

file = request.files['photo']

if 'image' not in request.files :
    return{"result" : "fail",
           "error" : "이미지 파일을 업로드 해주세요"}, 500

current_time = datetime.now()
file_name = current_time.isoformat().replace(':', '_') + file.content_type.split('/')[-1]
file.filename = file_name

파일을 올렸는지 확인,

이미지파일을 올렸는지 확인,

 

그리고 이미지파일이 맞다면 우선 파일 이름을 변경시켜주자

 

이제 위의 그 기능을 사용해 볼건데

그 기능을 사용하기 위해선

 

우선 S3에 파일을 업로드 해놔야 한다

 

client = boto3.client('s3',
             aws_access_key_id = Config.AWS_ACCESS_KEY,
             aws_secret_access_key = Config.AWS_SECRET_ACCESS_KEY)

try:
    client.upload_fileobj(file,
                          Config.S3_BUCKET,
                          file_name,
                          ExtraArgs = {"ACL":"public-read",
                                       "ContentType": "image/jpeg"})

except Exception as e:
    return{"result":"fail",
           'error': str(e)}, 500
           
# 리코그니션 사용
detect_labels(file_name, Config.S3_BUCKET)

return

 

boto3를 이용해 s3에 올려주도록 한다

 

 

 

다음은

 

https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/labels-detect-labels-image.html

 

이미지에서 레이블 감지 - Amazon Rekognition

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다. 이미지에서 레이블 감지 이 DetectLabels작업을 사용하여 이미지에서 레이블 (

docs.aws.amazon.com

사용법에 따라

 

def detect_labels(photo, bucket):

     session = boto3.Session(profile_name='profile-name')
     client = session.client('rekognition')

     response = client.detect_labels(Image={'S3Object':{'Bucket':bucket,'Name':photo}},
     MaxLabels=10,
     # Uncomment to use image properties and filtration settings
     #Features=["GENERAL_LABELS", "IMAGE_PROPERTIES"],
     #Settings={"GeneralLabels": {"LabelInclusionFilters":["Cat"]},
     # "ImageProperties": {"MaxDominantColors":10}}
     )

     print('Detected labels for ' + photo)
     print()
     for label in response['Labels']:
         print("Label: " + label['Name'])
         print("Confidence: " + str(label['Confidence']))
         print("Instances:")

         for instance in label['Instances']:
             print(" Bounding box")
             print(" Top: " + str(instance['BoundingBox']['Top']))
             print(" Left: " + str(instance['BoundingBox']['Left']))
             print(" Width: " + str(instance['BoundingBox']['Width']))
             print(" Height: " + str(instance['BoundingBox']['Height']))
             print(" Confidence: " + str(instance['Confidence']))
             print()

         print("Parents:")
         for parent in label['Parents']:
            print(" " + parent['Name'])

         print("Aliases:")
         for alias in label['Aliases']:
             print(" " + alias['Name'])

             print("Categories:")
         for category in label['Categories']:
             print(" " + category['Name'])
             print("----------")
             print()

     if "ImageProperties" in str(response):
         print("Background:")
         print(response["ImageProperties"]["Background"])
         print()
         print("Foreground:")
         print(response["ImageProperties"]["Foreground"])
         print()
         print("Quality:")
         print(response["ImageProperties"]["Quality"])
         print()

     return len(response['Labels'])

 

이것을 copy&paste 한 다음 

 

session = boto3.Session(profile_name='profile-name')
client = session.client('rekognition')

 

 

부분을 아래와 같이 바꿔준다

 

client = boto3.client('rekognition',
            'ap-northeast-2',
            aws_access_key_id = Config.AWS_ACCESS_KEY,
            aws_secret_access_key = Config.AWS_SECRET_ACCESS_KEY)

 

그리고 실행하면 

 

 

아래와 같은 에러가 뜬다

 

 

 

 

문제는 권한 부여를 설정해야한다

 

그러니 아래 링크를 들어가

https://console.aws.amazon.com/iam/home

 

https://us-east-1.console.aws.amazon.com/iam/home

 

us-east-1.console.aws.amazon.com

 

 

사용자를 눌러 권한을 추가 해주자

 

 

 

추가해야하는 것은 아마존 리코그니션 풀 액세스

AmazonRekognitionFullAcces

 

 

 

권한을 설정후 실행해보면

 

 

 

굉장히 길게 나온다

 

우리는 필요한것만 추려내자

 

for문이 시작되기전 비어있는 리스트를 하나 만들고

레이블의 이름만 그 리스트 안으로 들어오게끔 하고

나머지는 주석처리 혹은 삭제 하자

 

 

 

그리고 윗부분에도 다시

 

오른쪽 처럼 수정해주고 다시 해보면

 

 

 

이런식으로 나오게 할 수 있다

'API > AWS API' 카테고리의 다른 글

AWS - Translate API 사용하기  (0) 2024.05.30
AWS - S3 사진 업로드 API, boto3  (0) 2024.05.28