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.
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.
https://aws.amazon.com/jp/rekognition/pricing/
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 "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.
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
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)
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.
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
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)
Ich werde Lena für den Test verwenden.
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": {
...
}
}
}
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