Déployez le modèle de reconnaissance faciale Python sur Heroku et utilisez-le depuis Flutter ①

Nous avons déployé le puissant modèle de reconnaissance faciale de Python sur Heroku afin qu'il puisse être appelé à partir d'applications mobiles.

Dans la première partie, je présenterai le code côté Python et le déploiement sur Heroku, et dans la seconde partie, je présenterai la partie qui appelle le processus déployé avec Flutter.

Veuillez vous référer à l'article suivant pour la partie appel dans le deuxième Flutter. Déployez le modèle de reconnaissance faciale Python sur Heroku et utilisez-le depuis Flutter②

À propos de l'affiche de cet article

Nous tweetons sur le développement d'applications qui utilisent la reconnaissance faciale sur Twitter. https://twitter.com/studiothere2

Le journal de développement des applications est sérialisé en note. https://note.com/there2

Modèle de reconnaissance faciale

Bibliothèque utilisée

J'utilise Python face_recognition. https://github.com/ageitgey/face_recognition

La documentation est très riche et très simple à utiliser. Avec une précision de 99,38% dans le benchmark, vous pouvez vous attendre à des performances égales ou supérieures à celles des humains.

Autre bibliothèque utilisée

Je n'y pense pas trop, mais j'ai choisi celui qui est souvent utilisé dans Heroku et qui semble léger.

Explication du code source Python

C'est le minimum nécessaire, mais vous pouvez voir l'essentiel.

run.py


import face_recognition
from flask import Flask, jsonify, request, redirect
app = Flask(__name__)
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

Tout d'abord, importez les bibliothèques requises et déclarez les constantes. Le nom variable de l'application est également utilisé lors du démarrage de Gunicorn.

run.py


@app.route('/')
def hello_world():
    return 'hello'

Lorsqu'il est appelé en tant que root, il affiche simplement bonjour. Ceci est utile pour vérifier si le serveur est actif.

run.py


def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

Lorsque le fichier image est envoyé, assurez-vous que le fichier porte l'extension png, jpg, jpeg ou gif. En dehors de ceux-ci, le traitement de reconnaissance faciale est exclu.

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)

Il s'agit de la principale unité de traitement de reconnaissance faciale. Appelez-le avec / embedding. Ce n'est que lorsque le type d'entrée est fichier et que le nom de fichier est png, jpg, jpeg ou gif dans POST, qu'il est traité. Sinon, redirigez vers l'appelant. Dans ce cas, le "code de réponse" sera "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())

S'il a été POSTÉ dans le format de fichier correct, demandez à face_recognition de lire le fichier et de l'utiliser pour obtenir l'incorporation de flotteurs à 128 dimensions. Avec cette incorporation, vous pouvez calculer la similitude avec d'autres faces. Étant donné que cette partie est implémentée séparément du côté de l'application mobile, seules les informations de quantité de caractéristiques faciales intégrées sont renvoyées du côté Python. La valeur de retour de face_recognition est un tableau Numpy, vous devez donc appeler tolist () pour en faire un tableau Python. Renvoyez la version Json de celui-ci.

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>
    '''

Lorsqu'il est appelé par GET, le code HTML pour le téléchargement de fichiers est généré afin que les fichiers puissent être téléchargés directement.

run.py


if __name__ == "__main__":
    app.run(host='0.0.0.0')

Dans le processus principal, démarrez Flask. En définissant host sur 0.0.0.0, il peut être utilisé dans l'URL de la destination de déploiement Heroku.

Contrôle de fonctionnement

pip install -r requirements.txt

Les bibliothèques requises sont rassemblées dans requirements.txt, vous pouvez donc toutes les installer avec la commande ci-dessus. Ce requirements.txt est également requis lors du déploiement sur Heroku. Selon la version, il y avait des informations selon lesquelles il ne pouvait pas être déployé avec succès avec Heroku à moins qu'il ne soit installé dans l'ordre de cmake, dlib, face_recognition, donc je l'ai écrit dans requirements.txt comme suit.

requirements.txt


boost==0.1
cmake
boost-py
dlib
face_recognition_models
face-recognition
Flask==1.1.2
gunicorn==20.0.4

Essayez de le lancer localement en utilisant gunicorn.

gunicorn run:app --log-file -

S'il démarre correctement, vous devriez voir quelque chose comme ce qui suit.

$ 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

Ouvrons http: //127.0.0.1: 8000 dans le navigateur. Si "bonjour`" est affiché, cela réussit.

Ensuite, lorsque vous accédez à http: //127.0.0.1: 8000 / embedding, vous verrez le code HTML pour la sélection de fichiers comme indiqué ci-dessous. Essayez de télécharger un fichier de l'image du visage d'une personne.

image.png

Si vous voyez un tableau de 128 Float comme indiqué ci-dessous, vous avez réussi. C'est le contenu de l'intégration, qui est la fonctionnalité de l'image téléchargée.

image.png

Environnement cloud

Utilisation d'Heroku

https://jp.heroku.com/

J'ai choisi Heroku comme destination pour le déploiement des services WEB. J'ai choisi Heroku car il peut être utilisé avec Python, il est facile à déployer et à mettre à l'échelle, et j'ai trouvé que les frais d'utilisation étaient raisonnables. Vous pouvez l'utiliser gratuitement si vous l'utilisez comme essai.

En guise de contre-mesure, j'ai également considéré la fonction cloud de Firebase, mais comme ce modèle prendra une certaine charge à charger, j'ai pensé que le type de VM qui fonctionne toujours est meilleur que la fonction cloud qui est démarrée à chaque fois.

Si Heroku est également une version gratuite, l'instance sera supprimée si elle n'est pas utilisée pendant 30 minutes et elle démarrera lors de l'appel, mais si vous utilisez la version payante, l'instance ne sera pas supprimée. Vous pouvez passer à la version payante si nécessaire.

Déployer sur Heroku

Le déploiement n'est pas difficile. Vous pouvez vous inscrire en tant qu'utilisateur avec Heroku et suivre la procédure de configuration ci-dessous. https://devcenter.heroku.com/articles/getting-started-with-python

Installez les outils de ligne de commande de Heroku.

sudo snap install heroku --classic

Connectez-vous à Heroku. Le navigateur sera lancé et vous pourrez vous connecter à partir du navigateur.

heroku login

Enregistrez l'application avec Heroku. L'application sera enregistrée avec un nom approprié et pourra être confirmée sur le tableau de bord Heroku.

heroku create

Créez un fichier Procfile. Ce fichier enseigne à Heroku comment démarrer le serveur. Écrivez une instruction pour démarrer gunicorn en WEB comme suit.

web: gunicorn run:app --log-file -

C'est tout pour la préparation. Après cela, poussez-le dans le référentiel heroku avec la commande git et il sera déployé.

git push heroku master

Maintenant, il sera déployé sur Heroku et l'URL sera affichée, veuillez donc accéder à cette URL et vérifier qu'elle fonctionne.

Veuillez noter que le déploiement initial prendra un temps considérable. D'autant plus que dlib est une bibliothèque écrite en C ++ et doit être compilée, j'ai dû attendre longtemps pour terminer l'installation. Cela peut avoir pris environ 30 minutes. Si cela ne se termine pas par une erreur, n'hésitez pas à attendre.

La prochaine fois, j'aimerais vous présenter la partie qui appelle ce service WEB de Flutter.

Recommended Posts

Déployez le modèle de reconnaissance faciale Python sur Heroku et utilisez-le depuis Flutter ②
Déployez le modèle de reconnaissance faciale Python sur Heroku et utilisez-le depuis Flutter ①
Déployer et utiliser le modèle de prédiction créé en Python sur SQL Server
Lire et utiliser des fichiers Python à partir de Python
Utiliser le modèle entraîné fastText de Python
Installez mecab sur le serveur partagé Sakura et appelez-le depuis python
Firebase: utilisez Cloud Firestore et Cloud Storage depuis Python
Lier PHP et Python à partir de zéro sur Laravel
Jusqu'à l'utilisation de PhantomJS avec Python sur Heroku
Utilisez python sur Raspberry Pi 3 pour éclairer la LED quand il fait noir!
Installez le sélénium sur votre Mac et essayez-le avec python
J'ai essayé d'envoyer des courriels depuis sendgrid régulièrement avec heroku, avec python
Recevoir des e-mails de Gmail et étiqueter avec Python3
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
Utilisez Thingsspeak de Python
Utiliser fluentd de python
Utilisez MySQL depuis Python
Utiliser MySQL depuis Python
Utilisez BigQuery depuis Python.
Utilisez mecab-ipadic-neologd de Python
Installez Mecab et CaboCha sur ubuntu16.04LTS afin qu'il puisse être utilisé à partir de la série python3
Mettez Ubuntu dans Raspi, mettez Docker dessus et contrôlez GPIO avec python à partir du conteneur
Comment déployer Pybot, le manuel Python le plus simple, sur Heroku
Une note quand j'ai touché l'API de reconnaissance faciale de Microsoft avec Python
Installez pyenv sur MacBookAir et basculez Python à utiliser
J'ai essayé de reconnaître le visage de la vidéo (OpenCV: version python)
[Python] J'ai installé le jeu depuis pip et j'ai essayé de jouer
Python sur Ruby et Ruby en colère sur Python
Utiliser MySQL depuis Anaconda (python)
Déployer l'application Masonite sur Heroku 2020
Utiliser le modèle django de l'interpréteur
Essayez la reconnaissance faciale avec Python
Utiliser Python sur Windows (PyCharm)
Utilisez l'API e-Stat de Python
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Comment installer OpenCV sur Cloud9 et l'exécuter en Python
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (Partie 1)
Installez lp_solve sur Mac OSX et appelez-le avec python.
[Python + heroku] De l'état sans Python à l'affichage de quelque chose avec heroku (partie 2)
Tout, de la création d'un environnement Python à son exécution sous Windows