본문 바로가기
Restful API

[Restful API] 사진을 보내면 해당 사진에 어떤 물체가 있는지 알려주는 API 만들기 (Object detection API, Rekognition)

by dong_su 2023. 12. 18.

Object detection API = 해당 사진에 어떤 물체가 있는지 알려주는 API이다.

-> google Vision API, Amazon Rekognition 등이 있다.


아마존의 Rekognition를 이용)

-> postman에서 http method는 post, url 설정, Body에 form-data엔 Key와 Value(보낼 이미지 파일)을 세팅해논다.

 

    def post(self) :

        file = request.files.get("photo")

        if file is None :
            return {"error" : "파일이 존재하지 않습니다."}, 400
        
        current_time = datetime.now()

        new_file_name = current_time.isoformat().replace(":", "_") + ".jpg"

        file.filename = new_file_name

        s3 = boto3.client("s3", aws_access_key_id = Config.AWS_ACCESS_KEY_ID,
                     aws_secret_access_key = Config.AWS_SECRET_ACCESS_KEY)

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

        except Exception as e :
            print(e)
            return {"error" : str(e)}, 500
        
        # S3에 이미지가 있으니 rekognition 이용해서 object detection 한다.

        label_list = self.detect_labels(new_file_name, Config.S3_BUCKET)
        
        return {"result" : "success", "labels" : label_list, "count" : len(label_list)}, 200
    
    def detect_labels(self, photo, bucket) :

        client = boto3.client('rekognition', 'ap-northeast-2', 
                              aws_access_key_id=Config.AWS_ACCESS_KEY_ID,
                              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()

        label_list = []
        for label in response['Labels']:
            print("Label: " + label['Name'])
            print("Confidence: " + str(label['Confidence']))

            if (label['Confidence']) >= 90 :
                label_list.append(label['Name'])

        return label_list

-> vscode에 위 코드 작성한다.


-> 정상적으로 실행된 모습이다.