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
사용법에 따라
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
사용자를 눌러 권한을 추가 해주자
추가해야하는 것은 아마존 리코그니션 풀 액세스
AmazonRekognitionFullAcces
권한을 설정후 실행해보면
굉장히 길게 나온다
우리는 필요한것만 추려내자
for문이 시작되기전 비어있는 리스트를 하나 만들고
레이블의 이름만 그 리스트 안으로 들어오게끔 하고
나머지는 주석처리 혹은 삭제 하자
그리고 윗부분에도 다시
오른쪽 처럼 수정해주고 다시 해보면
이런식으로 나오게 할 수 있다
'API > AWS API' 카테고리의 다른 글
AWS - Translate API 사용하기 (0) | 2024.05.30 |
---|---|
AWS - S3 사진 업로드 API, boto3 (0) | 2024.05.28 |