[PYTHON] J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image

Aperçu

À 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 スクリーンショット 2020-01-23 22.38.40.png スクリーンショット 2020-01-23 22.40.02.png

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)

Langue et technologie

Constitution

Composition comme celle-ci コメント 2020-01-24 093650.jpg

Où je me suis fait prendre

Lorsque j'essaie d'envoyer une image à l'aide de l'URL signée de s3, je ne peux pas l'envoyer

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.

Le module PIL ne peut pas être lu par lambda

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)

Problèmes actuels, ce que vous voulez faire, etc.

--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

J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai fait un bot mou qui m'informe de la température
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai créé un bot LINE qui me dit le type et la force de Pokémon dans la région de Garal avec Heroku + Flask + PostgreSQL (Heroku Postgres)
Création d'un bot Slack qui confirme et notifie à AWS Lambda la date d'expiration d'un certificat SSL
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 1)
J'ai fait une image ponctuelle de l'image d'Irasutoya. (partie 2)
Je veux un bot Slack qui calcule et me dit le salaire d'un emploi à temps partiel à partir du calendrier de Google Agenda!
J'ai créé une application Twitter qui identifie et enregistre l'image d'un personnage spécifique sur la chronologie de Twitter par pytorch transfer learning
Une formule qui calcule simplement l'âge à partir de la date de naissance
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
[Python] J'ai créé un robot qui me dit la température actuelle lorsque j'entre un nom de lieu sur LINE
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé une IA qui prédit des anecdotes et m'a fait déduire mes anecdotes. Hee-AI
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
[Discode Bot] J'ai essayé de créer un Bot qui me dit la valeur de race de Pokemon
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
Il semble que l'API de messagerie ait été récemment publiée par LINE, j'ai donc créé un BOT qui analyse simplement la morphologie comme d'habitude.
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai créé et publié une image Docker qui lit RSS et tweete automatiquement régulièrement.
Créez un BOT qui raccourcit l'URL Discord
J'ai créé un système avec Raspberry Pi qui mesure périodiquement l'indice d'inconfort de la pièce et envoie une notification LINE s'il s'agit d'une valeur dangereuse
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
Un mémo qui détecte le visage de l'image acquise à partir de la caméra Web avec OpenCV de Django et le renvoie.
LINE Bot qui vous informe des stocks d'intérêt
[Python / C] J'ai créé un appareil qui fait défiler sans fil l'écran d'un PC à distance.
J'ai fait un calendrier qui met à jour automatiquement le calendrier de distribution de Vtuber (édition Google Calendar)
J'ai créé un programme en Python qui change les données de 1 minute de FX en une heure arbitraire (1 heure, etc.)
J'ai converti le temps en un entier, je l'ai décomposé en facteurs premiers et j'ai fait un bot pour tweeter le résultat (matériel xkcd)
Je veux découper uniquement le visage d'une image de personne avec Python et l'enregistrer ~ Détection de visage et rognage avec face_recognition ~
J'ai créé une application avec Lambda qui notifie LINE de "j'aime" à l'aide de l'API Qiita.
Un exemple de mécanisme qui renvoie une prédiction par HTTP à partir du résultat de l'apprentissage automatique
Lorsque j'ai créé un scan ECR à partir d'un CDK, je pouvais voir l'arrière du scan
Je veux trouver l'intersection d'une courbe de Bézier et d'une ligne droite (méthode de découpage de Bézier)
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai essayé d'utiliser PI Fu pour générer un modèle 3D d'une personne à partir d'une image
Comment créer un LINE BOT 004 interactif (répondre à la date de clôture d'une société cotée)
Récupérer une image d'une page Web et la redimensionner
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation
J'ai fait une fonction pour vérifier le modèle de DCGAN
Je souhaite envoyer un message de Python à LINE Bot
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai écrit un script qui divise l'image en deux