Stellen Sie das Python-Gesichtserkennungsmodell für Heroku bereit und verwenden Sie es von Flutter ①

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②

Über das Poster dieses Artikels

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

Gesichtserkennungsmodell

Bibliothek verwendet

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.

Andere verwendete Bibliotheken

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

Erklärung des Python-Quellcodes

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.

Funktionsprüfung

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.

image.png

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.

image.png

Cloud-Umgebung

Verwendung von Heroku

https://jp.heroku.com/

Ich habe mich für Heroku entschieden, weil es mit Python verwendet werden kann, einfach bereitzustellen und zu skalieren ist und ich der Meinung war, dass die Nutzungsgebühr angemessen war. Sie können es kostenlos verwenden, wenn Sie es als Testversion verwenden. Als Gegenmaßnahme habe ich auch die Cloud-Funktion von Firebase in Betracht gezogen. Da dieses Modell jedoch einige Last zum Laden benötigt, dachte ich, dass der VM-Typ, der immer ausgeführt wird, besser ist als die Cloud-Funktion, die jedes Mal gestartet wird. Wenn Heroku auch eine kostenlose Version ist, wird die Instanz gelöscht, wenn sie 30 Minuten lang nicht verwendet wird, und sie wird beim Aufruf gestartet. Wenn Sie jedoch die kostenpflichtige Version verwenden, wird die Instanz nicht gelöscht. Sie können bei Bedarf zur kostenpflichtigen Version wechseln. In Heroku bereitstellen

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

Stellen Sie das Python-Gesichtserkennungsmodell für Heroku bereit und verwenden Sie es von Flutter ②
Stellen Sie das Python-Gesichtserkennungsmodell für Heroku bereit und verwenden Sie es von Flutter ①
Stellen Sie das in Python unter SQL Server erstellte Vorhersagemodell bereit und verwenden Sie es
Lesen und verwenden Sie Python-Dateien aus Python
Verwenden Sie das von fastText trainierte Modell von Python
Installieren Sie mecab auf dem gemeinsam genutzten Sakura-Server und rufen Sie es von Python aus auf
Firebase: Verwenden Sie Cloud Firestore und Cloud Storage von Python
Verknüpfung von PHP und Python von Grund auf auf Laravel
Bis zur Verwendung von PhantomJS mit Python auf Heroku
Verwenden Sie Python auf Raspberry Pi 3, um die LED zu beleuchten, wenn es dunkel wird!
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Ich habe versucht, regelmäßig E-Mails von sendgrid mit Heroku und Python zu senden
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Ubuntu 20.04 auf Himbeer-Pi 4 mit OpenCV und mit Python verwenden
Verwenden Sie thingspeak aus Python
Verwenden Sie fließend Python
Verwenden Sie MySQL aus Python
Verwenden Sie MySQL aus Python
Verwenden Sie BigQuery aus Python.
Verwenden Sie mecab-ipadic-neologd von Python
Installieren Sie Mecab und CaboCha auf ubuntu16.04LTS, damit es aus der Python3-Serie verwendet werden kann
Setzen Sie Ubuntu in Raspi ein, setzen Sie Docker darauf und steuern Sie GPIO mit Python aus dem Container
So stellen Sie Pybot, das einfachste Python-Lehrbuch, auf Heroku bereit
Ein Hinweis beim Berühren der Gesichtserkennungs-API von Microsoft mit Python
Installieren Sie pyenv auf MacBookAir und wechseln Sie Python zur Verwendung
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
Python auf Ruby und wütend Ruby auf Python
Verwenden Sie MySQL von Anaconda (Python)
Stellen Sie die Masonite-App auf Heroku 2020 bereit
Verwenden Sie das Django-Modell vom Interpreter
Versuchen Sie die Gesichtserkennung mit Python
Verwenden Sie Python unter Windows (PyCharm)
Verwenden Sie die e-Stat-API von Python
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
So installieren Sie OpenCV in Cloud9 und führen es in Python aus
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Installieren Sie lp_solve unter Mac OSX und rufen Sie es mit Python auf.
[Python + Heroku] Vom Zustand ohne Python zur Anzeige von etwas mit Heroku (Teil 2)
Alles vom Erstellen einer Python-Umgebung bis zur Ausführung unter Windows