이미지로부터 인물의 성별, 나이를 추측하는 Line bot를 만들어 보았다
6781 단어 람다파이썬ReKognitionlinebotAWS
개요
line을 사용하여 보낸 이미지에서
성별, 연령 예상, 표정 분석을 실시하는 bot를 작성했습니다.
이런 느낌
이미지를 보내면 분석 결과가 반환됩니다 (3 명까지 동시에 찍어 OK)
소스 코드는 여기
(거의 글씨로 일단 만들어 보면 만족해 버립니다.
리팩토링하는 기력이 없어져 버렸다)
사용 언어, 기술
구성
이런 느낌의 구성
걸린 곳
s3 서명 url을 사용하여 이미지를 보내려고하면 보낼 수 없습니다.
line bot에 이미지를 보낼 때 이미지 url이 필요하므로,
아래와 같은 코드로 이미지를 다시 보내려고하면 오류가 발생했습니다.
s3_url = generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': BUCKET,
'Key': KEY
},
ExpiresIn=60,
HttpMethod='GET'
)
line_bot_api.reply_message(
reply_token=event.reply_token,
messages=ImageSendMessage(
original_content_url=s3_url,
preview_image_url=s3_url
)
)
LineBotApiError: status_code=400, request_id=xxxxx-xxx-xxx-xxx-xxxxxxxxxx, error_response=
{
"details": [
{
"message": "Length must be between 0 and 1000",
"property": "messages[0].originalContentUrl"
},
{
"message": "Length must be between 0 and 1000",
"property": "messages[0].previewImageUrl"
}
],
"message": "The request body has 2 error(s)"
}
url 너무 길고 화가났다 ...
s3 서명 된 URL을 발행하면 URL이 너무 길어서 보낼 수 없으므로
새롭게 공개적인 s3 버킷을 만들고,
보낼 이미지를 read-only로 s3에 넣어 url을 얻기로 결정했습니다.
# アクセス権を付与してput
client.put_object(ACL='public-read', Bucket=bucketname, Body=image, Key=key)
# urlは文字列結合で作成
s3_pub_url = 'https://' + bucketname + '.s3-ap-northeast-1.amazonaws.com/' + key
line_bot_api.reply_message(
reply_token=event.reply_token,
messages=ImageSendMessage(
original_content_url=s3_pub_url,
preview_image_url=s3_pub_url
)
)
s3의 공개 액세스는 사용한 적이 없으며,
액세스 권한의 모습을 보자 보니 여러가지 만지면 시간이 걸렸다.
lambda에서 PIL 모듈을 로드할 수 없음
BoundingBox를 이미지에 그리기 위해,
PIL 모듈을 가져오려고 하면 오류가 발생했습니다.
Unable to import module 'lambda_function': cannot import name '_imaging'
로컬에서 작동하지만 lambda는 PIL 모듈을 가져올 수 없어 오류가 발생합니다.
Google 선생님에게 물어 보면, Pillow의 라이브러리는 os에 의존하는 부분이있는 것 같습니다.
그래서 lambda가 움직이는 환경 (= Amazon Linux)에 설치 한 Pillow 라이브러리가 필요하다.
참고 사이트:
htps // 미치마. 네 t/포 st/아 ws-우세-핏 w-인-ぁ mb다/
위의 기사에서는 docker를 사용하여 라이브러리를 만들었지만,
뭔가 귀찮을 것 같았기 때문에 cloud9를 사용하여 라이브러리를 작성하기로 결정했습니다.
s3 서명 url을 사용하여 이미지를 보내려고하면 보낼 수 없습니다.
line bot에 이미지를 보낼 때 이미지 url이 필요하므로,
아래와 같은 코드로 이미지를 다시 보내려고하면 오류가 발생했습니다.
s3_url = generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': BUCKET,
'Key': KEY
},
ExpiresIn=60,
HttpMethod='GET'
)
line_bot_api.reply_message(
reply_token=event.reply_token,
messages=ImageSendMessage(
original_content_url=s3_url,
preview_image_url=s3_url
)
)
LineBotApiError: status_code=400, request_id=xxxxx-xxx-xxx-xxx-xxxxxxxxxx, error_response=
{
"details": [
{
"message": "Length must be between 0 and 1000",
"property": "messages[0].originalContentUrl"
},
{
"message": "Length must be between 0 and 1000",
"property": "messages[0].previewImageUrl"
}
],
"message": "The request body has 2 error(s)"
}
url 너무 길고 화가났다 ...
s3 서명 된 URL을 발행하면 URL이 너무 길어서 보낼 수 없으므로
새롭게 공개적인 s3 버킷을 만들고,
보낼 이미지를 read-only로 s3에 넣어 url을 얻기로 결정했습니다.
# アクセス権を付与してput
client.put_object(ACL='public-read', Bucket=bucketname, Body=image, Key=key)
# urlは文字列結合で作成
s3_pub_url = 'https://' + bucketname + '.s3-ap-northeast-1.amazonaws.com/' + key
line_bot_api.reply_message(
reply_token=event.reply_token,
messages=ImageSendMessage(
original_content_url=s3_pub_url,
preview_image_url=s3_pub_url
)
)
s3의 공개 액세스는 사용한 적이 없으며,
액세스 권한의 모습을 보자 보니 여러가지 만지면 시간이 걸렸다.
lambda에서 PIL 모듈을 로드할 수 없음
BoundingBox를 이미지에 그리기 위해,
PIL 모듈을 가져오려고 하면 오류가 발생했습니다.
Unable to import module 'lambda_function': cannot import name '_imaging'
로컬에서 작동하지만 lambda는 PIL 모듈을 가져올 수 없어 오류가 발생합니다.
Google 선생님에게 물어 보면, Pillow의 라이브러리는 os에 의존하는 부분이있는 것 같습니다.
그래서 lambda가 움직이는 환경 (= Amazon Linux)에 설치 한 Pillow 라이브러리가 필요하다.
참고 사이트:
htps // 미치마. 네 t/포 st/아 ws-우세-핏 w-인-ぁ mb다/
위의 기사에서는 docker를 사용하여 라이브러리를 만들었지만,
뭔가 귀찮을 것 같았기 때문에 cloud9를 사용하여 라이브러리를 작성하기로 결정했습니다.
python3 -m pip install Pillow -t ./
돈을 최대한 쓰고 싶지 않은 정신이므로,
cloud9 환경은 Pillow 라이브러리를 만드는 데에만 사용되었습니다.
cloud9에서 다운로드하면 zip으로 압축되지만,
폴더 당 압축이므로 그대로 lambda를 배포하면 함수를 호출 할 수 없어 오류가 발생합니다 (1 패)
현재의 과제, 하고 싶은 것 등
리팩토링
적어도 DB에 액세스하는 처리 정도는 분리하고 싶다
AWS 권한 주위 정리
여러가지 생각하는 것이 귀찮아서, lambda의 iam롤에 필요하지 않은 권한이 붙어 버릴 필요가 없는 권한은 가지지 않게 정리하고 싶다
DynamoDB 설계
Reference
이 문제에 관하여(이미지로부터 인물의 성별, 나이를 추측하는 Line bot를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ve_sono/items/3eaef85efbf20f99314f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)