Restful API

[Restful API] S3에 저장한 이미지 객체 탐지하는 API(Rekognition)

건휘맨 2024. 5. 28. 16:56

객체 감지(Object Detection)는 컴퓨터 비전 분야의 한 기술로

이미지나 비디오에서 객체를 인식하고 해당 객체의 위치를 파악하는 작업을 의미

객체 감지 기술은 이미지 내에서 특정 객체(예: 사람, 자동차, 동물 등)를 찾아내고,

그 객체의 boundary box를 표시하여 위치를 식별한다.

 

 

 

포스트맨에서 API 설계 시작

 

 

Visual Studio Code를 실행해 코드를 작성

rekognition을 사용하기 위해서 IAM에서 AmazonRekognitionFullAccess 권한 추가하고 진행한다.

 

Amazon Rekognition 메뉴얼 확인은

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

 

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

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

docs.aws.amazon.com

from flask import request
from flask_restful import Resource

from datetime import datetime

import boto3

from config import Config

class ObjectDetectionResource(Resource):

    def post(self):
        
        # 파일을 올렸는지 확인
        if 'photo' not in request.files:
            return {'result':'fail',
                    'error':'사진은 필수입니다.'}, 400
        
        file = request.files['photo']
		
        # 이미지 파일 올렸는지 확인
        if 'image' not in file.content_type:
            return {'result':'fail',
                    'error':'이미지 파일을 업로드하세요.'}, 400
        
        # 이미지 파일이 맞다면 파일 이름 변경
        current_time = datetime.now()
        file_name = current_time.isoformat().replace(':', '_') + '.jpg'

        file.filename = file_name
		
        
        # rekognition 서비스를 이용하려면 먼저 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
        
        # 리코그니션을 이용한다.
        label_list = self.detect_labels(file_name, Config.S3_BUCKET)
        
        return {'result':'success',
                'labels':label_list}
    


    def detect_labels(self, photo, bucket):
		
        client = boto3.client('rekognition', 
                              'ap-northeast-2',
                              aws_access_key_id = Config.AWS_ACCESS_KEY,
                              aws_secret_access_key = Config.AWS_SECRET_ACCESS_KEY)

        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()
        print(response['Labels'])

        label_list = []

        for label in response['Labels']:
            print("Label: " + label['Name'])
            label_list.append(label['Name'])

        return label_list

 

메뉴얼을 가져와서 필요한 것만 추려내기 위한 수정작업 완료!

 

끘^^