À partir de l'image envoyée en utilisant la ligne Nous avons créé un robot qui effectue la prédiction du sexe, de l'âge et des expressions faciales.
Comme ça
Lorsque vous envoyez une image, le résultat de l'analyse sera renvoyé (jusqu'à 3 personnes peuvent être vues en même temps)
Le code source est ici (J'étais satisfait quand j'ai essayé de le faire avec une écriture presque solide pour le moment J'ai perdu l'énergie de refactoriser)
Composition comme celle-ci
Puisque vous avez besoin de l'url de l'image lors de l'envoi de l'image au bot de ligne J'ai eu une erreur en essayant de répondre à une image avec le code suivant
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)"
}
l'url était trop longue et s'est mise en colère ...
L'émission d'une URL signée de s3 est trop longue pour être envoyée Créez un nouveau bucket public s3 et J'ai décidé de mettre l'image à envoyer en s3 en lecture seule et d'obtenir l'url
#Donner accès et mettre
client.put_object(ACL='public-read', Bucket=bucketname, Body=image, Key=key)
#l'url est créée par concaténation de chaînes
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
)
)
Je n'ai jamais utilisé l'accès public s3 Examinons l'autorité d'accès, etc. Il a fallu beaucoup de temps pour jouer avec.
Pour dessiner le BoundingBox sur l'image J'ai eu une erreur en essayant d'importer un module PIL
Unable to import module 'lambda_function': cannot import name '_imaging'
Cela fonctionne localement, mais s'il s'agit de lambda, le module PIL ne peut pas être importé et une erreur se produit. Quand j'ai demandé au professeur de Google, il semble que la bibliothèque de Pillow a une partie qui dépend du système d'exploitation. Donc, il semble que vous ayez besoin de la bibliothèque Pillow installée dans l'environnement où fonctionne lambda (= Amazon Linux)
Site de référence: https://michimani.net/post/aws-use-pillow-in-lambda/
Dans l'article ci-dessus, la bibliothèque est créée à l'aide de docker, ~~ Cela semblait gênant ~~, j'ai donc décidé de créer une bibliothèque en utilisant cloud9
--Création d'un environnement cloud9
--Importer lambda
--Installez la bibliothèque Pillow dans le dossier cible
python3 -m pip install Pillow -t ./
--Téléchargez le dossier cible, téléchargez-le sur s3 et déployez-le
Je ne veux pas dépenser autant d'argent que possible L'environnement cloud9 a été utilisé uniquement pour créer la bibliothèque Pillow
Lorsqu'il est téléchargé depuis cloud9, il est compressé avec zip, Comme il est compressé pour chaque dossier, si vous déployez lambda tel quel, la fonction ne peut pas être appelée et une erreur se produit (1 perte)
--Refactoring
--Organisation autour des autorisations AWS
―― ~~ C'est compliqué de penser à diverses choses ~~, le rôle iam de lambda a des privilèges inutiles
Je veux m'organiser pour ne pas avoir de privilèges inutiles
--Conception DynamoDB
――Depuis que je n'ai touché que RDB jusqu'à présent, je ne sais pas comment l'utiliser ni ses mérites.
L'usage est devenu comme RDB, je voudrais donc approfondir mes connaissances et réfléchir à nouveau au design.
Recommended Posts