[PYTHON] Bildverarbeitung mit Lambda + OpenCV (graue Bilderzeugung)

Bildverarbeitung mit Lambda + OpenCV (graue Bilderzeugung)

Dieser Artikel ist ein praktischer Artikel zum Überprüfen und Korrigieren der durch die Entwicklung von Serverless Web App Mosaic gewonnenen Erkenntnisse. Es ist eines von w2or3w / items / 87b57dfdbcf218de91e2).

Es wäre schön, diesen Artikel zu lesen, nachdem man sich Folgendes angesehen hat.

Einführung

Implementieren Sie die Lambda-Funktion in Python 3.6, die eine Bildverarbeitung für das Bild ausführt, die durch das Hochladen des Bildes in S3 ausgelöst wird. OpenCV wird zur Bildverarbeitung verwendet.

Inhalt

Erstellen Sie ein Repository für Lambda-Funktionsprojekte auf Github

Erstellen Sie ein Repository für Ihr Projekt auf GitHub. Der Repository-Name lautet "sample_lambda_py_project".

Klonen Sie das Repository in Cloud9

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

Ein einfaches Programm erstellen

Erstellen Sie einen geeigneten Ordner (hier "Quelle") in sample_vue_project und erstellen Sie darin eine "lambda_function.py" -Datei. Nehmen wir vorerst an, dass der Code in Vorheriger Artikel inline implementiert ist. (Der Inhalt der Protokollnachricht wird ein wenig geändert.)

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

Ich denke, die Cloud 9-Umgebung sieht so aus. Screenshot 2019-12-31 at 15.04.28.png

Komprimieren Sie den Funktionscode in eine Zip-Datei und stellen Sie ihn über S3 bei Lambda bereit

Für einfachen Code ist dies nicht erforderlich, aber wenn Sie eine andere Bibliothek als die Standardbibliothek wie OpenCV verwenden, müssen Sie die Bibliothek als Paket in eine Zip-Datei hochladen.

Lassen Sie uns zunächst über S3 komprimieren und auf Lambda hochladen, ohne die Bibliothek zu verwenden.

Reißverschlusskomprimierung

Komprimieren Sie unter dem Verzeichnis, in dem sich lambda_function.py befindet, mit dem Namen lambda-package.zip. Führen Sie den folgenden Befehl in dem Verzeichnis aus, in dem sich lambda_function.py befindet.

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

Auf S3 hochladen

Laden Sie das erstellte lambda-package.zip in S3 hoch. Führen Sie den folgenden Befehl aus, während Sie das Verzeichnis behalten, in dem sich lambda_function.py befindet.

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

In der Lambda-Konsole bereitstellen

AWS Console> Lambda> Funktionen> S3Trigger ******** - Arbeit Zugreifen. Stellen Sie den Funktionscode wie folgt ein. Codeeintragstyp: Datei-Upload von Amazon S3 Laufzeit: Python 3.6 Handler: lambda_function.lambda_handler Amazon S3-Link-URL: Die Link-URL von lambda-package.zip, die zuvor hochgeladen wurde Screenshot 2019-12-31 at 15.20.46.png Klicken Sie oben rechts auf dem Bildschirm auf die Schaltfläche Speichern.

Funktionsprüfung

Nach dem Hochladen der Datei aus der Web-App sample_vue_project AWS Console> CloudWatch> Protokollgruppe> aws / lambda / S3Trigger ******** - Arbeit Bitte besuchen Sie, um den neuesten Protokolldatenstrom zu sehen. Function Start (deploy from S3) : Bucket=sample-vue-project-bucket-work, Key=public/191231063457-16f5aaa24b1/faceA.jpeg Es ist in Ordnung, wenn ein solches INFO-Protokoll ausgegeben wird. Screenshot 2019-12-31 at 15.35.36.png

OpenCV-Installation

Führen Sie im Verzeichnis "source", in dem sich "lambda_function.py" befindet, den folgenden Befehl aus.

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

Die Lambda-Funktion muss die Bibliothek in das hochzuladende Zip-Paket aufnehmen, also -t . Geben Sie diese Option an und installieren Sie sie im aktuellen Verzeichnis.

Grauer Bildkonverter

Aktualisieren Sie 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)

(* Ich werde hier nicht auf die grundlegende Syntax von Python eingehen. Falls erforderlich, lernen Sie bitte irgendwo.)

Hochgeladen Konvertieren Sie eine Datei wie public / 191231112635-16f5bb5247f / lenna.png in ein graues Bild. Hochladen auf einen Pfad wie verarbeitet / 191231112635-16f5bb5247f / lenna.png.

Lambda Grundeinstellungen

Sie können den Speicher und das Zeitlimit in den Grundeinstellungen von Lambda festlegen. Standardmäßig ist Speicher = 128 MB und Timeout 25 Sekunden. Fotos, die mit neueren Smartphones aufgenommen wurden, sind groß. Wenn Sie also die Standardeinstellungen beibehalten, geht Ihnen möglicherweise der Speicher aus und es kann zu einer Ausnahme kommen. Wenn Sie die von Lambda in Zukunft durchgeführte Verarbeitung erhöhen, wird Ihnen möglicherweise die Zeit und die Zeit ausgehen. Passen Sie die Grundeinstellungen von Lambda nach Bedarf an. (* In Bezug auf die Größe des Bildes halte ich es für besser, es vor dem Hochladen auf der Clientseite zu komprimieren.)

Bereitstellungs- und Betriebsprüfung

Bitte komprimieren Sie es, laden Sie es in S3 hoch, stellen Sie es in Lambda bereit und laden Sie das Bild dann von der Web-App hoch. Es ist in Ordnung, wenn das Schwarzweißbild unter den S3-Bucket hochgeladen wird. Überprüfen wir auch das CloudWatch-Protokoll. lenna.png lenna (1).png (Lena ist wunderschön)

Nachwort

Wenn Sie wie in diesem Beispielprogramm von der Lambda-Fraktion auf S3 aus arbeiten, die die Triggerquelle ist, wird die Lambda-Funktion von dieser Operation aufgerufen. Wenn Sie nicht aufpassen, erhalten Sie eine Endlosschleife von Lambda. Seien Sie also vorsichtig.

Wenn Sie versehentlich in eine Lambda-Endlosschleife fallen, sollten Sie dies sofort bemerken, aber wenn Sie es nicht sofort bemerken, möchten Sie nicht darüber nachdenken. Die automatische Abrechnungsmaschine wird ihre Arbeit ohne zu zögern fortsetzen.

Die Möglichkeit, die Endlosschleife Lambda zu stoppen, besteht darin, entweder die Funktion zu entfernen oder den Funktionscode hochzuladen, der die Ausnahme auslöst. Ich denke, es ist eine gute Idee, den Funktionscode hochzuladen, der die Ausnahme auslöst, da das Löschen einer Funktion das erneute Erstellen und Konfigurieren umständlich macht. Aber gibt es einen anderen besseren Weg? Lass es mich wissen, bitte.

In jedem Fall müssen Sie es mit zitternden Händen bedienen. Beim seltsamen Schwitzen.

Außerdem habe ich den von Lambda aufgerufenen Python-Code noch nicht getestet. Es scheint, dass Sie mit Cloud9 debuggen können. Sobald Sie es gelernt haben, können Sie effizienter mit der Entwicklung fortfahren. Wenn Sie es beherrschen, versuchen Sie, einen Artikel zu schreiben.

Recommended Posts

Bildverarbeitung mit Lambda + OpenCV (graue Bilderzeugung)
Grundlagen der Echtzeit-Bildverarbeitung mit opencv
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Leichte Bildverarbeitung mit Python x OpenCV
Bildverarbeitung mit MyHDL
Bildverarbeitung mit PIL
XavierNX beschleunigt die OpenCV-Bildverarbeitung mit GPU (CUDA)
Bildverarbeitung mit Python (Teil 2)
Bildverarbeitung mit PIL (Pillow)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Bildbearbeitung mit Python OpenCV
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Holen Sie sich Bildfunktionen mit OpenCV
Bilderkennung mit Keras + OpenCV
[Python] Bildverarbeitung mit Scicit-Image
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Versuchen Sie, das Bild mit opencv2 zu verwischen
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
Erstellen Sie mit PySimpleGUI einen Bildverarbeitungs-Viewer
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Bildaufnahme von der Kamera mit Python + OpenCV
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter
[Bildverarbeitung] Posterisierung
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Python-Bildverarbeitung
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Erstellen eines Bildbeschneidungswerkzeugs mit OpenCV, Vorsichtsmaßnahmen für die Projektionskonvertierung (nur wenig)
So beschneiden Sie ein Bild mit Python + OpenCV
Bildverarbeitung von Grund auf mit Python (4) Konturextraktion
Bildverarbeitung mit Python Environment Setup für Windows
[Kleine Geschichte] Testen Sie die Bilderzeugung mit Python / OpenCV
Bildverarbeitung 100 Schläge ①
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Erstellen verschiedener Photoshop-Videos mit Python + OpenCV ② Erstellen Sie Photoshop-Standbilder
Bilden Sie Lambda-Schichten mit Lambda
Datensätze mit Pandas verarbeiten (1)
Katze zurück mit OpenCV erkennen
Lesen Sie die digitale Bildverarbeitung
Sprites mit OpenCV drehen
Parallelverarbeitung mit Mehrfachverarbeitung
Datenerweiterung mit openCV
Einfache TopView mit OpenCV
Stolpern Sie mit opencv3 von Homebrew
Berücksichtigen Sie bei der Verarbeitung von DynamoDB Stream mit Lambda (Python) die allgemeine Vorverarbeitung.
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
"Müll nach Bild klassifizieren!" App-Erstellungstagebuch Tag2 ~ Feinabstimmung mit VGG16 ~
Fügen Sie mit Python / OpenCV PNG mit Alphakanal als transparentes Bild ein
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen