[PYTHON] Traitement d'image avec Lambda + OpenCV (création d'image grise)

Traitement d'image avec Lambda + OpenCV (création d'image grise)

Cet article est un article pratique pour passer en revue et corriger les connaissances acquises en développant Serverless Web App Mosaic. C'est l'un des w2or3w / items / 87b57dfdbcf218de91e2).

Ce serait bien de lire cet article après avoir regardé ce qui suit.

introduction

Implémentez la fonction Lambda dans Python 3.6 qui effectue le traitement d'image sur l'image déclenchée en téléchargeant l'image sur S3. OpenCV est utilisé pour le traitement d'image.

contenu

Créer un référentiel pour les projets de fonction Lambda sur Github

Créez un référentiel pour votre projet sur GitHub. Le nom du référentiel est «sample_lambda_py_project».

Cloner le référentiel sur Cloud9

$ git clone https://github.com/{YourGithubID}/sample_lambda_py_project.git

Créer un programme simple

Créez un dossier approprié (ici, source) dans sample_vue_project, et créez-y un fichier lambda_function.py. Pour le moment, supposons que le code soit implémenté en ligne dans Article précédent. (Le contenu du message du journal sera légèrement modifié.)

lambda_function.py


from urllib.parse import unquote_plus
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    logger.info("Function Start (deploy from S3) : Bucket={0}, Key={1}" .format(bucket, key))

Je pense que l'environnement Cloud 9 ressemble à ceci. Screenshot 2019-12-31 at 15.04.28.png

Compressez le code de fonction dans un fichier zip et déployez-le sur Lambda via S3

Ce n'est pas nécessaire pour un code simple tel qu'il est actuellement, mais si vous utilisez une bibliothèque autre que la bibliothèque standard telle qu'OpenCV, vous devez télécharger la bibliothèque sous forme de package dans un fichier zip.

Alors, premièrement, compressons et téléchargeons sur Lambda via S3 sans utiliser la bibliothèque.

compression zip

Compressez sous le répertoire où se trouve lambda_function.py avec le nom lambda-package.zip. Exécutez la commande suivante dans le répertoire où se trouve lambda_function.py.

$ zip -r ../lambda-package.zip *

Télécharger vers S3

Téléchargez le lambda-package.zip créé dans S3. Exécutez la commande suivante tout en conservant le répertoire où se trouve lambda_function.py.

$ aws s3 cp ../lambda-package.zip s3://sample-vue-project-bucket-work/deploy/lambda-package.zip

Déployer dans la console Lambda

AWS Console> Lambda> Fonctions> S3Trigger ******** - travail Accéder. Réglez le code de fonction comme suit. Type d'entrée de code: téléchargement de fichier depuis Amazon S3 Exécution: Python 3.6 Gestionnaire: lambda_function.lambda_handler URL du lien Amazon S3: l'URL du lien de lambda-package.zip téléchargé plus tôt Screenshot 2019-12-31 at 15.20.46.png Cliquez sur le bouton Enregistrer en haut à droite de l'écran.

Contrôle de fonctionnement

Après avoir téléchargé le fichier depuis l'application Web sample_vue_project, AWS Console> CloudWatch> Groupe de journaux> aws / lambda / S3Trigger ******** - travail Veuillez visiter pour voir le dernier flux de journaux. Function Start (deploy from S3) : Bucket=sample-vue-project-bucket-work, Key=public/191231063457-16f5aaa24b1/faceA.jpeg C'est OK si un journal INFO comme celui-ci est émis. Screenshot 2019-12-31 at 15.35.36.png

Installation d'OpenCV

Dans le répertoire source où se trouve lambda_function.py, exécutez la commande suivante.

$ pip --version
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)
$ pip install opencv-python -t .

La fonction Lambda doit inclure la bibliothèque dans le package zip à télécharger, donc -t . Spécifiez cette option et installez-la dans le répertoire courant.

Convertisseur d'image gris

Mettez à jour lambda_function.py.

lambda_function.py


# coding: UTF-8
import boto3
import os
from urllib.parse import unquote_plus
import numpy as np
import cv2
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3 = boto3.client("s3")

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    logger.info("Function Start (deploy from S3) : Bucket={0}, Key={1}" .format(bucket, key))

    fileName = os.path.basename(key)
    orgFilePath = u'/tmp/' + fileName
    processedFilePath = u'/tmp/processed-' + fileName

    if (not key.startswith("public")):
        logger.info("not start with public")
        return

    keyOut = key.replace("public", "processed", 1)
    logger.info("Output local path = {0}".format(processedFilePath))

    try:
        s3.download_file(Bucket=bucket, Key=key, Filename=orgFilePath)

        orgImage = cv2.imread(orgFilePath)
        grayImage = cv2.cvtColor(orgImage, cv2.COLOR_RGB2GRAY)
        cv2.imwrite(processedFilePath, grayImage)

        s3.upload_file(Filename=processedFilePath, Bucket=bucket, Key=keyOut)
        logger.info("Function Completed : processed key = {0}".format(keyOut))

    except Exception as e:
        logger.exception(e)
        raise e
        
    finally:
        if os.path.exists(orgFilePath):
            os.remove(orgFilePath)
        if os.path.exists(processedFilePath):
            os.remove(processedFilePath)

(* Je ne parlerai pas de la syntaxe de base de Python ici. Si nécessaire, apprenez quelque part.)

Téléchargé Convertissez un fichier comme public / 191231112635-16f5bb5247f / lenna.png en une image grise, Téléchargement vers un chemin tel que traité / 191231112635-16f5bb5247f / lenna.png.

Paramètres de base Lambda

Vous pouvez spécifier la mémoire et le délai d'expiration dans les paramètres de base de Lambda. Par défaut, mémoire = 128 Mo et délai d'attente de 25 secondes. Les photos prises avec des smartphones récents sont de grande taille, donc si vous conservez les paramètres par défaut, vous risquez de manquer de mémoire et une exception peut se produire. À l'avenir, lorsque nous augmenterons le traitement effectué par Lambda, nous pourrions manquer de temps et de temps. Ajustez les paramètres de base de Lambda selon vos besoins. (* Concernant la taille de l'image, je pense qu'il vaut mieux la compresser côté client avant de la télécharger.)

Vérification du déploiement et du fonctionnement

Veuillez le compresser, le télécharger sur S3, le déployer sur Lambda, puis télécharger l'image à partir de l'application Web. C'est OK si l'image monochrome est téléchargée sous le compartiment S3. Vérifions également le journal CloudWatch. lenna.png lenna (1).png (Lena est belle)

Épilogue

Si vous opérez à partir de la faction Lambda sur S3 qui est la source de déclenchement comme cet exemple de programme, la fonction Lambda sera appelée par cette opération. Si vous ne faites pas attention, vous vous retrouverez avec une boucle infinie de Lambda, alors soyez prudent.

Si vous tombez par inadvertance dans une boucle infinie Lambda, vous devriez le remarquer tout de suite, mais si vous ne le remarquez pas tout de suite, vous ne voulez pas y penser. La machine de facturation automatique continuera à faire son travail sans hésitation.

La façon d'arrêter la boucle infinie Lambda consiste soit à supprimer la fonction, soit à télécharger le code de fonction qui déclenche l'exception. Je pense que c'est une bonne idée de télécharger le code de fonction qui soulève l'exception, car la suppression d'une fonction peut être fastidieuse à créer et à configurer à nouveau, mais y a-t-il un autre moyen? S'il vous plaît, faites-moi savoir.

Dans tous les cas, vous devrez le faire fonctionner avec vos mains tremblantes. En transpirant étrangement.

De plus, je n'ai pas encore débogué le code Python appelé par Lambda. Il semble que vous puissiez déboguer avec Cloud9, donc une fois que vous l'aurez appris, vous pourrez procéder au développement plus efficacement. Une fois que vous l'avez maîtrisé, essayez d'écrire un article.

Recommended Posts

Traitement d'image avec Lambda + OpenCV (création d'image grise)
Principes de base du traitement d'image en temps réel avec opencv
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image léger avec Python x OpenCV
Traitement d'image avec MyHDL
Traitement d'image avec PIL
XavierNX accélère le traitement d'image OpenCV avec GPU (CUDA)
Traitement d'image avec Python (partie 2)
Traitement d'image avec PIL (Pillow)
"Traitement Apple" avec OpenCV3 + Python3
Édition d'image avec python OpenCV
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Obtenez des fonctionnalités d'image avec OpenCV
Reconnaissance d'image avec Keras + OpenCV
[Python] Traitement d'image avec scicit-image
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Traitement d'image avec la binarisation Python 100 knocks # 3
Essayez de brouiller l'image avec opencv2
100 traitement d'image par Python Knock # 2 Échelle de gris
Traitement d'image par Python 100 knock # 10 filtre médian
Créer une visionneuse de traitement d'image avec PySimpleGUI
100 traitement d'image avec Python Knock # 8 Max Pooling
Traitement d'image par Python 100 knock # 12 motion filter
Acquisition d'images depuis une caméra avec Python + OpenCV
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
[Traitement d'image] Postérisation
J'ai essayé de "lisser" l'image avec Python + OpenCV
traitement d'image python
J'ai essayé de "différencier" l'image avec Python + OpenCV
Création d'un outil de recadrage d'image avec OpenCV, précautions pour la conversion de projection (seulement un peu)
Comment recadrer une image avec Python + OpenCV
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image avec la configuration de l'environnement Python pour Windows
[Petite histoire] Tester la génération d'images avec Python / OpenCV
Traitement d'image 100 coups ①
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
Créez diverses vidéos Photoshop avec Python + OpenCV ② Créez une image fixe Photoshop
Créer des couches Lambda avec Lambda
Traitement des ensembles de données avec des pandas (1)
Détecter le retour du chat avec OpenCV
Lire le traitement d'image numérique
Faire pivoter les sprites avec OpenCV
Traitement parallèle avec multitraitement
Augmentation des données avec openCV
TopView facile avec OpenCV
Trébucher avec opencv3 de homebrew
Tenez compte du prétraitement courant lors du traitement du flux DynamoDB avec Lambda (Python)
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
"Classer les déchets par image!" Journal de création d'application day2 ~ Mise au point avec VGG16 ~
Coller le png avec le canal alpha comme une image transparente avec Python / OpenCV
[Jouons avec Python] Traitement d'image en monochrome et points
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV