๋ฐ์ํ
Notice
Recent Posts
Recent Comments
Link
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ํ๋ค์ค๊ณต๋ถ
- serverless
- ํ์ด์ฌ
- Streamlit๊ธฐ์ด
- ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ
- Pandas
- ์๋ฐ๊ธฐ์ด
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ
- ์น๋์๋ณด๋ ์ ์
- java
- MySQL
- ์๋ฐ
- RESTful API
- Android
- ์๋๋ก์ด๋ ์คํ๋์ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Streamlit๊ธฐ๋ณธ
- ์๋ฐํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ์ด๋ณด
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํ๋ค์ค
- ์คํธ๋ฆผ๋ฆฟ
- ์คํธ๋ฆผ๋ฆฟ ๊ธฐ๋ณธ
- Flutter
- JavaScript
- ์น๋์๋ณด๋ ๊ธฐ์ด
- ์๋ฐ๊ณต๋ถ
- ํ์ด์ฌ๊ณต๋ถ
- streamlit
- db
Archives
- Today
- Total
ruriruriya
[AWS]Rekognition - Flask Restful Api๋ก ์๋ฉด ๋น๊ต ๊ธฐ๋ฅ(๋ ์ผ๊ตด ์ ์ฌ๋) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๋ณธ๋ฌธ
๐ฅ๏ธAWS/Rekognition
[AWS]Rekognition - Flask Restful Api๋ก ์๋ฉด ๋น๊ต ๊ธฐ๋ฅ(๋ ์ผ๊ตด ์ ์ฌ๋) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋ฃจ๋ฆฌ์ผใ 2024. 1. 22. 09:28๋ฐ์ํ
AWS Rekognition์ ํ์ฉํ๋ฉด ์๋ฉด์ ์ฝ๊ฒ ์ธ์ํ๊ณ ๋ ์ผ๊ตด์ ๋น๊ตํ์ฌ ์ ์ฌ๋๋ฅผ ์ ์ ์๋ค.
VS code์์ Flask ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ์ฌ api๋ฅผ ์ค๊ณํ๋ค.
1. ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ ์ด๋ฏธ์ง ํ์ผ์ Bytes ํ์์ผ๋ก ๋ณ๊ฒฝ.
def post(self) :
# ํฌ์คํธ๋งจ์์ Body๋ฅผ from-data๋ก ๋ฐ์์จ๋ค.
sourceFile = request.files.get("sourceFile")
targetFile = request.files.get("targetFile")
if sourceFile is None or targetFile is None :
return {"error" : "ํ์ผ ๋๊ฐ๋ฅผ ์ฌ๋ ค์ฃผ์ธ์."}, 400
def compare_faces(self, sourceFile, targetFile) :
# boto3์ client๋ฅผ ์ฌ์ฉํ์ฌ AWS Rekognition ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑ
client = boto3.client('rekognition', region_name='ap-northeast-2', aws_access_key_id=Config.AWS_ACCESS_KEY_ID, aws_secret_access_key=Config.AWS_SECRET_ACCESS_KEY)
#ํฌ์คํธ๋งจ์์ ๊ฐ์ ธ์จ ์ด๋ฏธ์งํ์ผ์ Bytesํ์์ผ๋ก ๋ณ๊ฒฝํ๋ค
imageSource = BytesIO(sourceFile.read())
imageTarget = BytesIO(targetFile.read())
2. ์ผ๊ตด ๋น๊ต compare_faces() ํจ์ ์์ฑ
#AWS Rekognition ์๋น์ค์ compare_faces ์ผ๊ตด์ ๋น๊ตํ๋ ํจ์ ์์ฑ
response = client.compare_faces(SimilarityThreshold=0, SourceImage={'Bytes': imageSource.read()}, TargetImage={'Bytes': imageTarget.read()})
# ์ด๋ฏธ์ง๋ฅผ ์ด์ด ์ผ๊ตด ์ขํ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ, ์ด๋ฏธ์ง ๋ค์ ๋ถ๋ฌ์ค๊ธฐ
imageTarget.seek(0)
# ๊ฐ์ฒด๋ก ์์ฑ
target_image = Image.open(imageTarget)
# draw๊ฐ์ฒด๋ฅผ ์์ฑํด ์ด๋ฏธ์ง์ ๋ํ๋ฑ์ ๊ทธ๋ฆด์ ์๊ฒ ๋ง๋ ๋ค
draw = ImageDraw.Draw(target_image)
[๋ฐ์ดํธ ํ์์ผ๋ก ๋ฐ๊พธ๋ ์ด์ ]
API ์๋ฒ ๊ฐ๋ฐ ์ request ๋ฐฉ์ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋๋ AWS ์์ฒญ ๋ฐฉ์ ๊ฐ์ด๋
{
"SourceImage": {
"Bytes": "/9j/4AAQSk2Q==..."
},
"TargetImage": {
"Bytes": "/9j/4O1Q==..."
},
"SimilarityThreshold": 70
}
3. ์ผ๊ตด BoundingBox๋ก ์ผ๊ตด ์์น์ ํฌ๊ธฐ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
#๋น ๋ฆฌ์คํธ๋ฅผ ์์ฑ
similarity_list = []
for faceMatch in response['FaceMatches']:
# ์ผ๊ตด์ BoundingBox ๊ฐ์ ๊ฐ์ ธ์ ์ผ๊ตด์ ์์น์ ํฌ๊ธฐ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
position = faceMatch['Face']['BoundingBox']
#์ผ๊ตด์ ์ผ์น์ ๋ณด๋ฅผ ๋ฌธ์์ด๋ก ์ ์ฅํฉ๋๋ค
similarity = str(faceMatch['Similarity'])
#๊ฐ ์ผ๊ตด์ ์ผ์น ํ๋ฅ ์ similarity_list์ ์ถ๊ฐํฉ๋๋ค.
similarity_list.append(similarity)
# ์ผ๊ตด ์ขํ๋ฅผ ํฝ์
๋จ์๋ก ๋ณํ
# ์ด๋ฏธ์ง์ ๊ฐ๋ก,์ธ๋ก๊ฐ์ ์
ํ
imgWidth, imgHeight = target_image.size
# ๊ฐ๋ก,์ธ๋ก๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ขํ๋ฅผ ์
ํ
left = imgWidth * position['Left']
top = imgHeight * position['Top']
width = imgWidth * position['Width']
height = imgHeight * position['Height']
#์ผ๊ตด์ ์ํ์ข์ฐ์ ๊ผญ์ง์ ์ ๋ง๋ ๋ค
points = (
(left, top),
(left + width, top),
(left + width, top + height),
(left, top + height),
(left, top)
)
#๊ผญ ์ง์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋ํ์ผ๋ก ์ผ๊ตด์ ๊ฐ์ผ๋ค
draw.line(points, fill='#ff0000', width=2)
# ์ผ์น ํ๋ฅ ์ ์ด๋ฏธ์ง์ ํ์ ์์์ 3์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ
similarity = round(float(similarity), 3)
# ์์ ํ ํ๋ฅ ๊ฐ์ ์ด๋ฏธ์ง์ ํ์
draw.text((left + width + 5, top), f"similarity : {similarity}%", fill='#ff0000')
# ์์ ํ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ด๋ค
target_image.show()
imageSource.close()
imageTarget.close()
print(response['FaceMatches'])
return similarity_list
4. ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ธ์ค๋ ์ฝ๋ ์์ฑ
def post(self) :
# ํฌ์คํธ๋งจ์์ Body๋ฅผ from-data๋ก ๋ฐ์์จ๋ค.
sourceFile = request.files.get("sourceFile")
targetFile = request.files.get("targetFile")
if sourceFile is None or targetFile is None :
return {"error" : "ํ์ผ ๋๊ฐ๋ฅผ ์ฌ๋ ค์ฃผ์ธ์."}, 400
# compare_faces๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๋ฅผ FaceMatches๋ก ์ด๊ธฐํํ๋ค.
FaceMatches = self.compare_faces(sourceFile, targetFile)
return {"result" : "success", "FaceMatches" : FaceMatches}, 200
5. ์คํ ๊ฒฐ๊ณผ
๋ฐ์ํ