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②
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
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.
Je n'y pense pas trop, mais j'ai choisi celui qui est souvent utilisé dans Heroku et qui semble léger.
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.
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.
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.
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.
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