Serverlose Gesichtserkennungs-API mit Python

Dieser Artikel ist der Artikel zum 16. Tag von Python-AdventCalandar-2016.

Hallo. Spielst du Python? Erkennst du dein Gesicht? Bist du serverlos?

Dieser Artikel richtet sich an Benutzer, die auf einfache Weise einen Gesichtserkennungs-API-Server in Python einrichten möchten. Ich dachte daran, eine akademische Geschichte in den Adventskalender zu schreiben, aber ich entschied mich für dieses Thema, weil das Timing gut war.

Zunächst werde ich es deklarieren, aber dieses Mal werde ich AWS voll ausnutzen.

Über Gesichtserkennung

Mit OpenCV ist das sehr einfach, aber dieses Mal werden wir AWS voll ausnutzen! Daher werde ich den auf der diesjährigen re: invent angekündigten Dienst "Amazon Rekognition" nutzen.

Mit einem Wort, es ist ein großartiger Dienst, der Objekte und Gesichter mit hoher Genauigkeit erkennen und durchsuchen kann (Verschiedenes)

Weitere Informationen finden Sie unter https://aws.amazon.com/jp/rekognition/.

Die Preisliste ist wie folgt. Bitte beachten Sie, dass je mehr Sie es verwenden, desto mehr kostet es Sie.

スクリーンショット 2016-12-16 13.38.03.png

https://aws.amazon.com/jp/rekognition/pricing/

Über serverlose Architektur

In AWS lautet die serverlose Architektur "API Gateway + Lambda".

Dieses Mal werden wir sie mit einer Bibliothek namens "Chalice" von Python verwalten.

https://github.com/awslabs/chalice

Versuchen Sie es mit Kelch

Versuchen Sie "Hallo Welt" vorerst mit dem Befehl "Kelch".

$ pip install chalice

#Bitte verwenden Sie einen geeigneten Projektnamen für den Freko-Teil
$ chalice new-project freko && cd freko
$ cat app.py

from chalice import Chalice

app = Chalice(app_name="helloworld")

@app.route("/")
def index():
    return {"hello": "world"}

$ chalice deploy
...
Your application is available at: https://endpoint/dev

$ curl https://endpoint/dev
{"hello": "world"}

Sobald dies erledigt ist, müssen Sie nur noch die S3- und Rekognition-APIs drücken.

Verwenden Sie die AWS-API

AWS-Einstellungen

Ich bin sicher, dass viele Leute es bereits erstellt haben, aber verwenden Sie zuerst aws-cli, um die Einstellungen zu exportieren.

In dieser Stichprobe ist die Region "eu-west-1". Jede Region, die von Rekognition unterstützt wird, ist ausreichend.

$ pip install awscli
$ aws configure

https://github.com/aws/aws-cli

Installieren Sie auch das von Python erstellte AWS-SDK namens boto3.

$ pip install boto3

https://github.com/boto/boto3

Laden Sie Bilder in S3 hoch

Da es schwierig ist, es mit der GUI zu machen, werde ich alles mit der API machen.

REGION = 'eu-west-1'

BUCKET = 'freko-default'
S3 = boto3.resource('s3')

#Erstellen Sie einen Bucket in S3, wenn der angegebene Bucket-Name nicht vorhanden ist
def create_s3_bucket_if_not_exists():
    exists = True
    try:
        S3.meta.client.head_bucket(Bucket=BUCKET)
    except botocore.exceptions.ClientError as ex:
        error_code = int(ex.response['Error']['Code'])
        if error_code == 404:
            exists = False
    if exists:
        return
    else:
        try:
            S3.create_bucket(Bucket=BUCKET, CreateBucketConfiguration={
                'LocationConstraint': REGION})
        except Exception as ex:
            raise ChaliceViewError("fail to create bucket s3. error = " + ex.message)
    return

#Laden Sie die Datei in S3 hoch
def upload_file_s3_bucket(obj_name, image_file_name):
    try:
        s3_object = S3.Object(BUCKET, obj_name)
        s3_object.upload_file(image_file_name)
    except Exception as ex:
        raise ChaliceViewError("fail to upload file s3. error = " + ex.message)

Gesichtserkennung mit der ReKognition API


REKOGNITION = boto3.client('rekognition')

#Gesichtserkennung durch Angabe der Datei im S3-Bucket
def detect_faces(name):
    try:
        response = REKOGNITION.detect_faces(
            Image={
                'S3Object': {
                    'Bucket': BUCKET,
                    'Name': name,
                }
            },
            Attributes=[
                'DEFAULT',
            ]
        )
        return response
    except Exception as ex:
        raise ChaliceViewError("fail to detect faces. error = " + ex.message)

Weitere Informationen erhalten Sie, indem Sie für Attribute "ALL" angeben.

Richtlinie ändern

Chalice untersucht die API, die zum Zeitpunkt der Bereitstellung im Code verwendet wurde, und legt die Richtlinie ohne Erlaubnis fest. Da es sich jedoch immer noch um eine Vorschauversion handelt, werden anscheinend nicht alle APIs unterstützt. Die beim Hochladen der Datei in S3 verwendete "upload_file" usw. wurde nicht gelesen. ..

Fügen Sie S3 und ReKognition zur Anweisung in policy.json hinzu. (Weil es zum Testen ist, mache ich es voll)

$ vim .chalice/policy.json

"Statement": [
    {
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    {
      "Action": [
        "rekognition:*"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }

    ...

]

Der Befehl zum Bereitstellen ohne automatische Generierung einer Richtlinie lautet: Lassen Sie uns ein geeignetes Makefile erstellen und es registrieren.

$ chalice deploy --no-autogen-policy

API-Schlüssel festlegen

Ich befürchte, dass ich den Endpunkt so oft erreichen kann, wie ich möchte, daher werde ich die Authentifizierung per API-Schlüssel vornehmen und vorerst eine Einschränkung anfordern.

Weitere Informationen finden Sie unter http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-api-keys.html.

Wenn Sie in Chalice "api_key_required = True" festlegen, verfügen Sie über eine API, für die eine API-Schlüsselauthentifizierung erforderlich ist.

@app.route('/face', methods=['POST'], content_types=['application/json'], api_key_required=True)

Versuchen Sie, die bereitgestellte API zu treffen

Ich werde Lena für den Test verwenden.

lena.jpg

Geben Sie für API-Parameter name = Dateiname, base64 = eine base64-codierte Zeichenfolge von Bildern ein.

Bitte legen Sie den API-Schlüssel und die URL selbst fest.

$ (echo -n '{"name":"lenna.jpg ", "base64": "'; base64 lenna.jpg; echo '"}') | curl -H "x-api-key:your-api-key" -H "Content-Type:application/json" -d @- https://your-place.execute-api.eu-west-1.amazonaws.com/dev/face | jq

Wenn Sie nur feststellen möchten, ob das Bild ein Gesicht hat, reicht es aus, um festzustellen, ob die FaceDetails einen Wert haben und der Wert && Confidence hoch ist.

{
  "exists": true,
  "response": {
    "FaceDetails": [
      {
        "BoundingBox": {
          "Width": 0.4585798680782318,
          "Top": 0.3210059106349945,
          "Left": 0.34467455744743347,
          "Height": 0.4585798680782318
        },
        "Landmarks": [
          {
            "Y": 0.501218318939209,
            "X": 0.5236561894416809,
            "Type": "eyeLeft"
          },
          {
            "Y": 0.50351482629776,
            "X": 0.6624458432197571,
            "Type": "eyeRight"
          },
          {
            "Y": 0.5982820391654968,
            "X": 0.6305037140846252,
            "Type": "nose"
          },
          {
            "Y": 0.6746630072593689,
            "X": 0.521257758140564,
            "Type": "mouthLeft"
          },
          {
            "Y": 0.6727028489112854,
            "X": 0.6275562644004822,
            "Type": "mouthRight"
          }
        ],
        "Pose": {
          "Yaw": 30.472450256347656,
          "Roll": -1.429526448249817,
          "Pitch": -5.346992015838623
        },
        "Quality": {
          "Sharpness": 160,
          "Brightness": 36.45581817626953
        },
        "Confidence": 99.94509887695312
      }
    ],
    "ResponseMetadata": {
      ...
    },
    "OrientationCorrection": "ROTATE_0"
  }
}

Wenn das Gesicht nicht erkannt wird, lautet die Antwort übrigens wie folgt.

{
  "exists": false,
  "response": {
    "FaceDetails": [],
    "ResponseMetadata": {
      ...
    }
  }
}

Schließlich

Es ist ein Artikel wie die Verwendung von AWS-SDK geworden ... Ohne darüber nachzudenken, möchte ich etwas Cooles tun, wie das nächste Mal Rekognition aufzurufen, wenn es auf S3 gestellt wird.

Der vollständige Code ist unten. Ich bin froh, wenn Sie es als Referenz verwenden können.

https://github.com/gotokatsuya/freko

Recommended Posts

Serverlose Gesichtserkennungs-API mit Python
Versuchen Sie die Gesichtserkennung mit Python
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Einfacher Slack API-Client mit Python
[python, openCV] base64 Gesichtserkennung in Bildern
Gesichtserkennung mit Edison
[Python3] [Ubuntu16] [Docker] Versuchen Sie die Gesichtserkennung mit OpenFace
Mit Python mit Kelch ganz einfach ohne Server
Gesichtserkennung mit OpenCV von Python
Verwenden Sie die Twitter-API mit Python
Ich habe einen Blackjack mit Python gemacht!
Gesichtserkennung durch Amazon Rekognition
Web-API mit Python + Falcon
Rufen Sie die API mit python3 auf.
Verwenden Sie die Unterschall-API mit Python3
Ich habe mit Python einen Blackjack gemacht.
Othello gemacht mit Python (wie GUI)
Ich habe Wordcloud mit Python gemacht.
Machen Sie es sich mit Serverless Python Requirements einfach
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Ein Hinweis beim Berühren der Gesichtserkennungs-API von Microsoft mit Python
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Mit Flask erstellte SNS Python-Grundlagen
Erstellen Sie Awaitable mit der Python / C-API
Holen Sie sich Bewertungen mit Python Googlemap API
Führen Sie Rotrics DexArm mit der Python-API aus
Gesichtserkennung mit Lambda (Python) + Erkennung
Numer0n mit Elementen, die mit Python erstellt wurden
Quine Post mit Qiita API (Python)
Ich habe mit Python eine Lotterie gemacht.
Klicken Sie mit Python auf die Etherpad-Lite-API
Othello-Spieleentwicklung mit Python
Python x Tensoflow x Gesichtserkennung
Erste Anime-Gesichtserkennung mit Chainer
Schneiden Sie das Gesicht mit Python + OpenCV aus
Ich habe mit Python einen Daemon erstellt
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Ich habe eine Python-Wrapper-Bibliothek für die Docomo-Bilderkennungs-API erstellt.
Sammeln von Informationen von Twitter mit Python (Twitter API)
Englische Spracherkennung mit Python [Rede zu Text]
Erstellen Sie automatisch eine Python-API-Dokumentation mit Sphinx
Holen Sie sich Lebensmitteldaten mit Amazon API (Python)
Ich habe mit Python einen Zeichenzähler erstellt
Einfache Einführung der Spracherkennung mit Python
Probieren Sie schnell die Microsoft Face API in Python aus
[Python] Erstellen Sie schnell eine API mit Flask
Ich habe mit Python eine Hex-Map erstellt
[Python] Python-Paketinformationen mit der PyPI-API abrufen
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Berühren Sie AWS mit Serverless Framework und Python
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Othello App (iOS App) erstellt mit Python (Kivy)
REST-API eines mit Python erstellten Modells mit Watson Machine Learning (CP4D-Edition)
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python