๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[AWS]Rekognition - Flask Restful Api๋กœ ์•ˆ๋ฉด ๊ฐ์ง€ ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

๐Ÿ–ฅ๏ธAWS/Rekognition

[AWS]Rekognition - Flask Restful Api๋กœ ์•ˆ๋ฉด ๊ฐ์ง€ ๊ธฐ๋Šฅ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฃจ๋ฆฌ์•ผใ…‘ 2024. 1. 20. 23:50
๋ฐ˜์‘ํ˜•

 

๋ณธ์ธ์€ flask ํ”„๋ ˆ์ž„์›Œํฌ๋กœ restful api ๋ฅผ ํ™œ์šฉํ•  ์˜ˆ์ •์ด๋‹ค.
์•ž์—์„œ์˜ ํ™˜๊ฒฝ์„ค์ •์„ ๋จผ์ € ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•œ๋‹ค.

https://ruriruriya.tistory.com/171

 

[AWS]Rekognition - Flask RestFul Api์—์„œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒํ•œ์„ค์ •

๋ณธ์ธ์€ Flask RestFul Api์—์„œ ํ™œ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋จผ์ € AWS ๊ณ„์ • ํ”„๋ฆฌํ‹ฐ์–ด ๊ณ„์ •์ด ํ•„์š”ํ•˜๊ณ  VScode ํˆด๋กœ ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•  ๊ณ„ํš์ด๋‹ค. 1. IAM -> ์‚ฌ์šฉ์ž -> ๊ถŒํ•œ์ถ”๊ฐ€ ํด๋ฆญ ํ•˜๋‹จ์— ๊ถŒํ•œ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•œ๋‹ค. 2. ๊ถŒํ•œ

ruriruriya.tistory.com

 

1. post์— S3๋กœ ์ €์žฅ

def post(self) :
        # 1 ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
        file = request.files.get('photo')
        # 2 S3์— ์ €์žฅํ•œ๋‹ค.
        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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ.        
# boto3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š”, AWS์˜ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ
        # ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. => pip install boto3 ์„ค์น˜
        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
        # 3 S3์— ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋‹ˆ,
        # rekognition ์„ ์ด์šฉํ•ด์„œ,
        # object detection ํ•œ๋‹ค.
        region = 'ap-northeast-2'
        faces_list = self.detect_faces(new_file_name,Config.S3_BUCKET,region)

 

2. ์–ผ๊ตด ๊ฐ์ง€ ํ•จ์ˆ˜ ์ž‘์„ฑ

def detect_faces(self, photo, bucket, region):   
        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_faces(Image={'S3Object':{'Bucket':bucket,'Name':photo}},
                                   Attributes=['ALL'])
        print('Detected faces for ' + photo)
        faces_list = []
        for faceDetail in response['FaceDetails']:
            face_info = {
                "์„ฑ๋ณ„": str(faceDetail['Gender']),
                '์˜ˆ์ƒ ์—ฐ๋ น๋Œ€ ': str(faceDetail['AgeRange']['Low'])
                + ' ~ ' + str(faceDetail['AgeRange']['High']) + '์„ธ',
 				"์›ƒ๊ณ ์žˆ๋Š”๊ฐ€?": str(faceDetail['Smile']),
                "์•ˆ๊ฒฝ ์ฐฉ์šฉ ์—ฌ๋ถ€": str(faceDetail['Eyeglasses']),
                "์–ผ๊ตด ๊ฐ€๋ ค์ง ์—ฌ๋ถ€": str(faceDetail['FaceOccluded']),
                "ํ‘œ์ •": str(faceDetail['Emotions'][0]),
                "๋ˆˆ ๋œฌ ์—ฌ๋ถ€": str(faceDetail['EyesOpen'])
            }
            faces_list.append(face_info)
            print("์„ฑ๋ณ„: " + str(faceDetail['Gender']))
            print("์›ƒ๊ณ ์žˆ๋Š”๊ฐ€?: " + str(faceDetail['Smile']))
            print("์•ˆ๊ฒฝ ์ฐฉ์šฉ ์—ฌ๋ถ€: " + str(faceDetail['Eyeglasses']))
            print("์–ผ๊ตด ๊ฐ€๋ ค์ง ์—ฌ๋ถ€: " + str(faceDetail['FaceOccluded']))
            print("ํ‘œ์ •: " + str(faceDetail['Emotions'][0]))
            print('์˜ˆ์ƒ ์—ฐ๋ น๋Œ€: ' + str(faceDetail['AgeRange']['Low'])
                + '์„ธ ~ ' + str(faceDetail['AgeRange']['High']) + '์„ธ')            
            print("๋ˆˆ ๋œฌ ์—ฌ๋ถ€" + str(faceDetail['EyesOpen']))
        return (faces_list)

 

3. post์— S3๋กœ ์ €์žฅ ํ›„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ ์ž‘์„ฑ

def post(self) :
        # 1 ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
        file = request.files.get('photo')
        # 2 S3์— ์ €์žฅํ•œ๋‹ค.
        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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ.        
# boto3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š”, AWS์˜ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ
        # ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. => pip install boto3 ์„ค์น˜
        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
        # 3 S3์— ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์œผ๋‹ˆ,
        # rekognition ์„ ์ด์šฉํ•ด์„œ,
        # object detection ํ•œ๋‹ค.
        region = 'ap-northeast-2'
        faces_list = self.detect_faces(new_file_name,Config.S3_BUCKET,region)
        
        
        // ์ถ”๊ฐ€๋œ ๋ฆฌํ„ด๋ถ€๋ถ„

        return {'result' : 'success',
                'list' : faces_list,
                'count' : len(faces_list)
                }, 200

 

4. ์‹คํ–‰ ๊ฒฐ๊ณผ

์œค์„๋ ฌ ๋Œ€ํ†ต๋ น์˜ ์‚ฌ์ง„์„ ๊ฐ์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•˜๋‹ค.

๊ฒฐ๊ณผ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ์—
์„ฑ๋ณ„๊ณผ ์—ฐ๋ น๋Œ€๋ฅผ ๋„ฃ์–ด์„œ ์‹คํ–‰ํ•ด๋ณด์•˜๋”๋‹ˆ
๋‚จ์ž์ธ ๊ฒƒ๊ณผ ์—ฐ๋ น๋Œ€๋ฅผ ๋น„์Šทํ•˜๊ฒŒ ๋งž์ถ”์—ˆ๋‹ค. ์‹ ๊ธฐํ•˜๋‹ค..

VS code ํ„ฐ๋ฏธ๋„ ์ฐฝ.

 

 

- ๋‹ค์ˆ˜ ์ธ์›์ด ๋“ค์–ด๊ฐˆ ๋•Œ

ํฌ์ŠคํŠธ๋งจ ์‹คํ–‰ ์‘๋‹ต์„ ๋ณด๋‹ˆ

๋ฆฌ์ŠคํŠธ๊ฐ€ 2๊ฐœ๋กœ ๋‚˜๋‰˜์–ด ๋‚˜์˜ค๊ณ 
์„ฑ๋ณ„ ์—ฐ๋ น๋Œ€ ํ‘œ์ • ์•ˆ๊ฒฝ์—ฌ๋ถ€ ๋“ฑ์ด ์ž˜ ๋‚˜์˜ค๊ณ  ์žˆ๋‹ค.

 

์‹ ๊ธฐํ•˜๋‹ค.

๋‚˜์ค‘์— ์ข€๋” ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•„์•ผ ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•