[PYTHON] Ich habe versucht, die Detect Labels-API von AWS Rekognition zu verwenden

Einführung

Ich habe versucht, die Detect Labels-API von AWS Rekognition, einem AWS-Dienst für maschinelles Lernen, zu verwenden. Es scheint, dass Sie Objekte und Szenen leicht identifizieren können, daher habe ich eine einfache Bildextraktionsanwendung erstellt und verwendet.

Was ist AWS-Anerkennung?

Mit dem von AWS bereitgestellten maschinellen Lernservice können Bilderkennungen wie Bildanalysen und Videoanalysen problemlos durchgeführt werden. Insbesondere werden die folgenden APIs bereitgestellt.

Was ist die DetectLabels-API?

Mit der DetectLabels-API können Sie Tausende von Objekten wie Autos, Haustiere und Möbel kennzeichnen, die anhand von Bildern identifiziert wurden, und eine Vertrauensbewertung erhalten. Die Konfidenzbewertung wird durch einen Wert zwischen 0 und 100 angezeigt, was auf die Möglichkeit hinweist, dass das Identifikationsergebnis korrekt ist. Zitiert aus AWS Rekognitoion Black Belt

Wie oben erwähnt, handelt es sich um eine API, mit der Sie das Eingabebild beschriften und das Beschriftungsergebnis auch über die Verwaltungskonsole überprüfen können, wie unten gezeigt. Sie können sehen, dass die drei Katzen gut identifiziert sind! demo.png

Die Anforderung an die DetectLabels-API lautet wie folgt, wobei das obige Katzenbild als Eingabebeispiel verwendet wird.

{
    "Image": {
        "Bytes": "(Byte-Zeichenfolge des Eingabebildes)"
    }
}

Als Antwort wird der folgende JSON zurückgegeben. Die Struktur besteht aus einem Array von Etiketteninformationen, und die Etiketteninformationen enthalten die folgenden Elemente.

{
    "Labels": [
        {
            "Name": "Cat",
            "Confidence": 99.57831573486328,
            "Instances": [
                {
                    "BoundingBox": {
                        "Width": 0.369978129863739,
                        "Height": 0.7246906161308289,
                        "Left": 0.17922087013721466,
                        "Top": 0.06359343975782394
                    },
                    "Confidence": 92.53639221191406
                },
                {
                    "BoundingBox": {
                        "Width": 0.3405080735683441,
                        "Height": 0.7218159437179565,
                        "Left": 0.31681257486343384,
                        "Top": 0.14111439883708954
                    },
                    "Confidence": 90.89508056640625
                },
                {
                    "BoundingBox": {
                        "Width": 0.27936506271362305,
                        "Height": 0.7497209906578064,
                        "Left": 0.5879912376403809,
                        "Top": 0.10250711441040039
                    },
                    "Confidence": 90.0565414428711
                }
            ],
            "Parents": [
                {
                    "Name": "Mammal"
                },
                {
                    "Name": "Animal"
                },
                {
                    "Name": "Pet"
                }
            ]
        },
        {
            "Name": "Pet",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Animal"
                }
            ]
        },
        {
            "Name": "Kitten",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Mammal"
                },
                {
                    "Name": "Cat"
                },
                {
                    "Name": "Animal"
                },
                {
                    "Name": "Pet"
                }
            ]
        },
        {
            "Name": "Animal",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": []
        },
        {
            "Name": "Mammal",
            "Confidence": 99.57831573486328,
            "Instances": [],
            "Parents": [
                {
                    "Name": "Animal"
                }
            ]
        }
    ],
    "LabelModelVersion": "2.0"
}

Versuchen Sie zu machen

Was zu machen

Die Beschriftung erfolgt aus dem in den S3-Bucket hochgeladenen Bild, der beschriftete Bereich im Bild wird extrahiert und das extrahierte Bild wird in einen anderen S3-Bucket mit dem Tag "label name" = "Zuverlässigkeit" ausgegeben. habe es gerade geschafft.

Diagramm

flow.jpg ① Laden Sie die Bilddatei in den Bucket "rekognition-test-20200530" hoch. ② Lambda "Erkennungstest" wird durch das Ereignis zur Erstellung der Bucket-Datei ausgelöst ③ Lambda "Recognition Test" ruft die DetectLabel-API auf, indem die in S3 hochgeladene Bilddatei eingegeben wird ④ Lambda "Erkennungstest" basiert auf der Antwort der Detect Label API.

  1. Extrahieren Sie für Elemente mit einem auf dem Etikett angegebenen Zielbereich den Zielbereich aus dem hochgeladenen Bild
  2. Fügen Sie dem extrahierten Bild das S3-Tag "label name" = "label trust value" hinzu
  3. Ausgabe in Bucket "rekognition-test-20200530-output"

Einstellungen für jede AWS-Ressource

S3

Eimername Aufbau
rekognition-test-20200530 ・ Einen Eimer erstellen
-Trigger-Einstellung für Lambda "Erkennungstest" zum Zeitpunkt des Dateierstellungsereignisses in S3
rekognition-test-20200530-output ・ Einen Eimer erstellen
- Bucket-Richtlinie hinzugefügt, um der IAM-Rolle des Lambda-Erkennungstests eine Schreibberechtigung zu erteilen.

Lambda Layer Da Pillow zum Extrahieren von Bildern verwendet wird, habe ich Lambda Layer unter Bezugnahme auf diesen Blog registriert.

  1. Starten Sie EC2 von Amazon Linux
  2. Installieren Sie das Kissen an EC2
  3. Komprimieren Sie den Ordner, in dem Pillow installiert ist
  4. Laden Sie die Zip-Datei herunter und registrieren Sie die Zip-Datei bei Lambda Layer

Lambda Laufzeit: python2.7

lambda_function.py


# coding: utf-8
import json
import boto3
from PIL import Image
import uuid
from io import BytesIO


def lambda_handler(event, context):
    #Ereignis S3 und Objekterfassung
    s3 = boto3.client('s3')
    #Bucket-Name, in dem das Ereignis aufgetreten ist
    bucket = event['Records'][0]['s3']['bucket']['name']
    #Objektschlüssel, in dem das Ereignis aufgetreten ist
    photo = event['Records'][0]['s3']['object']['key']
    try:
        #Erfassung der Bilddatei, in der das S3-Ereignis aufgetreten ist
        target_file_byte_string = s3.get_object(Bucket=bucket, Key=event['Records'][0]['s3']['object']['key'])['Body'].read()
        target_img = Image.open(BytesIO(target_file_byte_string))
        #Holen Sie sich die Breite und Höhe der Bilddatei
        img_width, img_height = target_img.size
        #Erkennungs-Client
        rekognition_client=boto3.client('rekognition')
        #DetectLabels API-Aufruf und Erfassung der Beschriftungsergebnisse
        response = rekognition_client.detect_labels(Image={'S3Object':{'Bucket':bucket,'Name':photo}}, MaxLabels=10)
        for label in response['Labels']:
            #Extrahiert ein Bild und gibt es für eine Beschriftung mit einem bestimmten Bereich an S3 aus.
            for bounds in label['Instances']:
                box = bounds['BoundingBox']
                #Bestimmen Sie den Bildextraktionsbereich
                target_bounds = (box['Left'] * img_width, 
                                box['Top'] * img_height,
                                (box['Left'] + box['Width']) * img_width,
                                (box['Top'] + box['Height']) * img_height)
                #Bildextraktion
                img_crop = target_img.crop(target_bounds)
                imgByteArr = BytesIO()
                img_crop.save(imgByteArr, format=target_img.format)
                #S3-Objekt-Tag-Spezifikation
                tag = '{0}={1}'.format(label['Name'], str(label['Confidence']))
                #Ausgabe an S3
                s3.put_object(Key='{0}.jpg'.format(uuid.uuid1()), 
                            Bucket='rekognition-test-20200530-output', 
                            Body=imgByteArr.getvalue(),
                            Tagging=tag)
    except Exception as e:
        print(e)
    return True

Ich habe es versucht!

animal5.jpg

Versuchen Sie, das obige Eingabebild (Dateiname ist animal5.jpg) in S3 hochzuladen. demo2.png Der Upload ist abgeschlossen. demo3.png Nach einer Weile des Wartens wurde das extrahierte Bild an S3 ausgegeben! image.png Lassen Sie uns ein Tag des Bildes überprüfen. image.png Es ist gut markiert. Lassen Sie uns den Inhalt jeder Bildausgabe an S3 überprüfen.

Ich konnte es sicher extrahieren!

Referenzmaterial

AWS Rekognitoion Overview AWS Rekognitoion Black belt

Recommended Posts

Ich habe versucht, die Detect Labels-API von AWS Rekognition zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, einen Transvestitenwettbewerb mit der Detect-API von Face ++ zu bewerten
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe AWS Iot ausprobiert
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe APN (Remote-Benachrichtigung) mithilfe der Parse.com-REST-API ausprobiert
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
[AWS] Ich habe versucht, EC2, RDS, Django zu verwenden. Umweltbau ab 1
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, die Gesichtserkennungs-API von Microsoft für Cognitive Services zu verwenden
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe versucht, eine Quip-API zu erstellen
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden