Wir haben das leistungsstarke Gesichtserkennungsmodell von Python auf Heroku implementiert, damit es von mobilen Apps aus aufgerufen werden kann.
Im ersten Teil werde ich den Code auf der Python-Seite und die Bereitstellung in Heroku vorstellen, und im zweiten Teil werde ich den Teil vorstellen, der den bereitgestellten Prozess mit Flutter aufruft.
Weitere Informationen zum Anrufteil im zweiten Flattern finden Sie im folgenden Artikel. Stellen Sie das Python-Gesichtserkennungsmodell für Heroku bereit und verwenden Sie es von Flutter②
Wir twittern über die Entwicklung von Apps, die die Gesichtserkennung auf Twitter nutzen. https://twitter.com/studiothere2
Das Tagebuch der Anwendungsentwicklung ist in Notiz serialisiert. https://note.com/there2
Ich verwende Python face_recognition. https://github.com/ageitgey/face_recognition
Die Dokumentation ist sehr umfangreich und sehr einfach zu bedienen. Mit einer Genauigkeit von 99,38% im Benchmark können Sie eine Leistung erwarten, die mindestens der des Menschen entspricht.
Ich denke nicht zu viel darüber nach, aber ich habe die gewählt, die oft in Heroku verwendet wird und leicht zu sein scheint.
--Web Development Framework: Flask
Es ist das notwendige Minimum, aber Sie können das Wesentliche sehen.
run.py
import face_recognition
from flask import Flask, jsonify, request, redirect
app = Flask(__name__)
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
Importieren Sie zunächst die erforderlichen Bibliotheken und deklarieren Sie Konstanten. Der Variablenname der App wird auch beim Starten von Gunicorn verwendet.
run.py
@app.route('/')
def hello_world():
return 'hello'
Wenn es als root aufgerufen wird, wird einfach nur Hallo angezeigt. Dies ist nützlich, um zu überprüfen, ob der Server aktiv ist.
run.py
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
Stellen Sie beim Senden der Bilddatei sicher, dass die Dateierweiterung png, jpg, jpeg oder gif lautet. Ansonsten wird die Gesichtserkennung nicht verarbeitet.
run.py
@app.route('/embedding', methods=['GET', 'POST'])
def get_embedding():
# Check if a valid image file was uploaded
if request.method == 'POST':
if 'file' not in request.files:
print("file not in request.files")
return redirect(request.url)
file = request.files['file']
if file.filename == '':
print("file name is blank")
return redirect(request.url)
Dies ist die Hauptverarbeitungseinheit für die Gesichtserkennung. Nennen Sie es mit "/ embedded". Nur wenn der Eingabetyp Datei ist und der Dateiname in POST png, jpg, jpeg oder gif lautet, wird er verarbeitet. Andernfalls leiten Sie zurück zum Anrufer. In diesem Fall lautet der "Antwortcode" "302".
run.py
if file and allowed_file(file.filename):
print("file found")
# The image file seems valid! Detect faces and return the result.
img = face_recognition.load_image_file(file)
emb = face_recognition.face_encodings(img)[0]
return jsonify(emb.tolist())
Wenn es im richtigen Dateiformat veröffentlicht wurde, lassen Sie face_recognition die Datei lesen und verwenden Sie sie, um die 128-dimensionale Float-Einbettung zu erhalten.
Mit dieser Einbettung können Sie die Ähnlichkeit mit anderen Gesichtern berechnen.
Da dieser Teil auf der Seite der mobilen Anwendung separat implementiert wird, werden auf der Python-Seite nur die Informationen zur Menge der eingebetteten Gesichtsmerkmale zurückgegeben.
Der Rückgabewert von face_recognition ist ein Numpy-Array. Sie müssen also tolist ()
aufrufen, um daraus ein Python-Array zu machen.
Geben Sie die Json-Version zurück.
run.py
# If no valid image file was uploaded, show the file upload form:
return '''
<!doctype html>
<title>upload</title>
<h1>Please select image and upload</h1>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Upload">
</form>
'''
Beim Aufruf von GET wird HTML für das Hochladen von Dateien ausgegeben, sodass Dateien direkt hochgeladen werden können.
run.py
if __name__ == "__main__":
app.run(host='0.0.0.0')
Starten Sie im Hauptprozess Flask. Wenn Sie den Host auf "0.0.0.0" setzen, kann er in der URL des Heroku-Bereitstellungsziels verwendet werden.
pip install -r requirements.txt
Die erforderlichen Bibliotheken werden in require.txt
zusammengestellt, sodass Sie sie alle zusammen mit dem obigen Befehl installieren können.
Diese require.txt
wird auch bei der Bereitstellung auf Heroku benötigt.
Abhängig von der Version gab es Informationen, dass es mit Heroku nur dann erfolgreich bereitgestellt werden konnte, wenn es in der Reihenfolge "cmake", "dlib", "face_recognition" installiert wurde. Deshalb habe ich es wie folgt in "require.txt" geschrieben.
requirements.txt
boost==0.1
cmake
boost-py
dlib
face_recognition_models
face-recognition
Flask==1.1.2
gunicorn==20.0.4
Versuchen Sie es lokal mit Gunicorn zu starten.
gunicorn run:app --log-file -
Wenn es erfolgreich gestartet wird, sollten Sie Folgendes sehen.
$ gunicorn run:app --log-file -
[2020-05-15 09:02:24 +0900] [11143] [INFO] Starting gunicorn 20.0.4
[2020-05-15 09:02:24 +0900] [11143] [INFO] Listening at: http://127.0.0.1:8000 (11143)
[2020-05-15 09:02:24 +0900] [11143] [INFO] Using worker: sync
[2020-05-15 09:02:24 +0900] [11146] [INFO] Booting worker with pid: 11146
Öffnen wir "http: //127.0.0.1: 8000" im Browser. Wenn "Hallo" angezeigt wird, ist dies erfolgreich.
Wenn Sie als Nächstes auf "http: //127.0.0.1: 8000 / embedded" zugreifen, wird der HTML-Code für die Dateiauswahl wie unten gezeigt angezeigt. Versuchen Sie, eine Datei mit dem Gesichtsbild einer Person hochzuladen.
Wenn Sie ein Array von 128 Float sehen, wie unten gezeigt, sind Sie erfolgreich. Dies ist der Inhalt von Embedding, der Funktion des hochgeladenen Bildes.
https://jp.heroku.com/
Die Bereitstellung ist nicht schwierig. Sie können sich bei Heroku als Benutzer registrieren und die folgenden Schritte ausführen. https://devcenter.heroku.com/articles/getting-started-with-python
Installieren Sie die Befehlszeilentools von Heroku.
sudo snap install heroku --classic
Melden Sie sich bei Heroku an. Der Browser wird gestartet und Sie können sich über den Browser anmelden.
heroku login
Registrieren Sie die App bei Heroku. Die App wird mit einem entsprechenden Namen registriert und kann im Heroku-Dashboard bestätigt werden.
heroku create
Erstellen Sie ein Procfile. Diese Datei zeigt Heroku, wie der Server gestartet wird. Schreiben Sie eine Anweisung, um Gunicorn wie folgt als WEB zu starten.
web: gunicorn run:app --log-file -
Das ist alles zur Vorbereitung. Danach schieben Sie es mit dem Befehl git in das Heroku-Repository und es wird bereitgestellt.
git push heroku master
Jetzt wird es für Heroku bereitgestellt und die URL wird angezeigt. Greifen Sie also auf diese URL zu und überprüfen Sie, ob sie funktioniert.
Bitte beachten Sie, dass die erstmalige Bereitstellung viel Zeit in Anspruch nimmt. Insbesondere da dlib eine in C ++ geschriebene Bibliothek ist und kompiliert werden muss, musste ich lange warten, um die Installation abzuschließen. Es kann ungefähr 30 Minuten gedauert haben. Wenn es nicht mit einem Fehler endet, können Sie gerne warten.
Das nächste Mal möchte ich den Teil vorstellen, der diesen WEB-Service von Flutter aufruft.
Recommended Posts