[PYTHON] J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ③

1.Tout d'abord

Dernière fois J'ai même créé un modèle d'apprentissage.

Cette fois, nous allons créer une application Web réelle en utilisant le modèle d'apprentissage et même la déployer.

L'image terminée ressemble à ceci スクリーンショット 2020-08-04 21.01.56.png

2. Créé avec Flask

main.py


#Module d'importation
import cv2
import os
from flask import Flask, request, redirect, url_for, render_template, flash
from werkzeug.utils import secure_filename
from keras.models import Sequential, load_model
from keras.preprocessing import image
from PIL import Image
import tensorflow as tf
import numpy as np
from datetime import datetime
import face_recognition

#Nom de joueur
classes = ['Hinako Shibuno', 'Petite fête Sakura', 'Erika Hara']
num_classes = len(classes)
image_size = 64

#Fichier pour enregistrer l'image téléchargée
UPLOAD_FOLDER = "uploads/"
#Spécifiez l'extension qui permet le téléchargement
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

#Configurer une instance de la classe Flask
app = Flask(__name__)

#Définir une fonction pour vérifier l'extension des fichiers téléchargés
def allowed_file(filename):
    #Première condition: dans le nom de fichier variable'.'Contient-il les caractères?
    #Deuxième condition: nom de fichier variable.La chaîne de caractères après est AUTORISÉE_Laquelle des EXTENSIONS est applicable
    #Dans rsplit, l’ordre du délimiteur est «1» à partir de la fin de la chaîne de caractères. inférieur convertit les chaînes en caractères inférieurs
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


#Détecter le visage(haarcascade)
def detect_face(img_path):
    image = face_recognition.load_image_file(img_path)
    faces = face_recognition.face_locations(image)
    if len(faces)>0:
        face_max = [(abs(faces[i][0]-faces[i][2])) * (abs(faces[i][1]-faces[i][3])) for i in range(len(faces))]
        top, right, bottom, left = faces[face_max.index(max(face_max))]#Il n'y a pas de problème car une seule personne est affichée
        faceImage = image[top:bottom, left:right]
        final = Image.fromarray(faceImage)

        final = np.asarray(final.resize((image_size,image_size)))
        final = Image.fromarray(final)

        basename = datetime.now().strftime("%Y%m%d-%H%M%S")
        filepath = UPLOAD_FOLDER + basename+".png "
        final.save(filepath)

        return final
    else:
        return "Veuillez saisir une image de visage"

#Charger le modèle entraîné
model = load_model('./golfer.h5', compile=False)

graph = tf.get_default_graph()

# app.route()Associez l'URL spécifiée dans la fonction avec./ http://127.0.0.1:5000/Spécifiez l'URL suivante
@app.route('/', methods=['GET', 'POST'])
def upload_file():
    global graph
    # as_default()Spécifiez le graphique cible avec
    with graph.as_default():
        #Si la méthode HTTP est POST
        if request.method == 'POST':
            #La requête POST contient-elle des données de fichier?
            if 'file' not in request.files:
                flash('Pas de fichier')
                #redirection est une fonction qui redirige vers l'argument URL
                return redirect(request.url)
            file = request.files['file']
            if file.filename == '':
                flash('Pas de fichier')
                return redirect(request.url)
            
            #Si le fichier est dans un format autorisé
            if file and allowed_file(file.filename):
                #S'il y a une chaîne de caractères dangereuse dans le nom de fichier, désactivez-la.
                filename = secure_filename(file.filename)
                #Enregistrer dans le dossier des téléchargements
                file.save(os.path.join(UPLOAD_FOLDER, filename))
                #Créer un chemin de fichier
                filepath = os.path.join(UPLOAD_FOLDER, filename)
                
                # #Lisez l'image reçue et convertissez-la au format np
                img = image.load_img(filepath, grayscale=False, target_size=(image_size,image_size))
                #Détecter la partie du visage
                img = detect_face(filepath)

                if type(img)!=str:
                    img = image.img_to_array(img)
                    data = np.array([img])
                    #Transmettre les données transformées au modèle pour la prédiction
                    result = model.predict(data)[0]
                    predicted = result.argmax()
                    pred_answer = "Cette femme professionnelle" + str(classes[predicted]) + "est"

                    return render_template("index.html",answer=pred_answer)
                else:
                    return render_template("index.html",answer=img)


        return render_template("index.html",answer="")

#Résolvez le problème que CSS n'est pas reflété lors du développement d'applications Web avec Flask
@app.context_processor
def override_url_for():
    return dict(url_for=dated_url_for)

def dated_url_for(endpoint, **values):
    if endpoint == 'static':
        filename = values.get('filename', None)
        if filename:
            file_path = os.path.join(app.root_path,
                                 endpoint, filename)
            values['q'] = int(os.stat(file_path).st_mtime)
    return url_for(endpoint, **values)


if __name__ == "__main__":
    port = int(os.environ.get('PORT', 8080))
    app.run(host ='0.0.0.0',port = port)

3. index.html et feuille de style

index.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Jugement de golfeuse professionnelle</title>
    <!-- <link rel="stylesheet" href="./static/stylesheet.css"> -->
    <link rel= "stylesheet" type= "text/css" 
            href= "{{ url_for('static',filename='stylesheet.css') }}">
</head>
<body>
    <header>   
        <a class="header-logo" href="#">Jugement de la golfeuse professionnelle</a>
    </header>

    <div class="main">    
        <h2>Identifie le visage de l'image</h2>
        <p>Veuillez envoyer l'image</p>
        <form method="POST" enctype="multipart/form-data">
            <input class="file_choose" type="file" name="file">
            <input class="btn" value="submit!" type="submit">
        </form>
        <div class="answer">{{answer}}</div>
    </div>

    <footer>
    </footer>
</body>
</html>

stylesheet.css


header {
    background-color: rgb(100, 81, 255);
    height: 100px;
    margin: -8px;
    display: flex;
    flex-direction: row-reverse;
    justify-content: space-between;
}

.header-logo {
    color: #fff;
    font-size: 30px;
    margin: auto;
}

.header_img {
    height: 25px;
    margin: 15px 25px;
}

.main {
    height: 370px;
}

h2 {
    color: #444444;
    margin: 90px 0px;
    text-align: center;
}

p {
    color: #444444;
    margin: 70px 0px 30px 0px;
    text-align: center;
}

.answer {
    margin: 70px 0px 30px 0px;
    text-align: center;
    font-size: 30px;
    color: blue;
    font-weight: bold;
}

form {
    text-align: center;
}

h2 {
    color: #444444;
    text-align: center;
}

footer {
    background-color: #F7F7F7;
    height: 110px;
    margin: -8px;
    position: relative;
}

.footer_img {
    height: 25px;
    margin: 15px 25px;
}

small {
    margin: 15px 25px;
    position: absolute;
    left: 0;
    bottom: 0;
}

4. Structure des fichiers

La structure du fichier est la suivante スクリーンショット 2020-08-04 21.38.29.png

Index.html dans le dossier des modèles stylesheet.css dans le dossier statique

Veuillez vous référer à cet article pour les fichiers restants [Version complète] Procédure de déploiement de l'API créée avec Flask sur Heroku (Remarque)

5. Déployez sur heroku

5-1. Inscrivez-vous en tant que membre d'Heroku

Heroku Inscrivez-vous ici

5-2. Connectez-vous à Heroku

$ heroku login

5-3. Paramètres

Créer une nouvelle application ⇨ Entrez le nom de l'application pour enregistrer votre pays aux États-Unis. Accédez à la page de l'application, accédez à Setteings et cliquez sur Ajouter un pack de construction pour ajouter Python.

5-4. Exécutez les opérations suivantes à partir du terminal

git init

__ * Uniquement la première fois. Si vous le faites deux fois, vous ne pourrez pas effectuer le déploiement avec succès. __

heroku git:remote -a (nom de l'application)
git add .
git commit -m “(Écrivez un message sur ce qui a changé)”
git push heroku master

__ Le déploiement est terminé __

6. Vérifiez l'application Web

Vérifiez avec le code ci-dessous

heroku open

Ceci termine les 3 publications de l'application d'image.

Recommended Posts

J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ③
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ①
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait une bibliothèque pour l'assurance actuarielle
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai créé un outil utile pour Digital Ocean
J'ai créé un téléchargeur pour l'expression distribuée par mot
Nous avons créé un produit de prévention du télétravail.
Création de l'outil de gestion des utilisateurs Let's Chat
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé un outil de nettoyage pour Google Container Registry
[Projet spécial Valentine] J'ai fait un diagnostic de compatibilité LINE!
[Python] J'ai créé un classificateur pour les iris [Machine learning]
[VSCode] J'ai créé un extrait d'utilisateur pour Python print f-string
J'ai fait un jeu de combat Numer0n en Java (j'ai aussi fait de l'IA)
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
J'ai fait un texte Python
Fait une commande pour FizzBuzz
J'ai fait un robot discord
Python> J'ai créé un code de test pour mon propre fichier externe
Création d'un outil CLI client / serveur WebSocket (comme WebSocket version netcat)
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - (1) Introduction
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai créé un classificateur de visage Dir en gray en utilisant l'extraction de visage TensorFlow-④
J'ai créé une bibliothèque de wrapper Python pour l'API de reconnaissance d'images docomo.
J'ai créé un site d'apprentissage C ++
J'ai touché PyAuto pendant un moment
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
[Mise à jour Ver1.3.1] J'ai créé une bibliothèque de prétraitement de données DataLiner pour l'apprentissage automatique
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Test de classification de visage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑥ Programme d'apprentissage
J'ai essayé de faire un classificateur de visage Dir en gris en utilisant TensorFlow --⑬ Jouer (final)
J'ai fait un exercice d'IA de merde. Veuillez l'utiliser pour vos devoirs de vacances d'été.
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑧ Exécution d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑫ Version Web
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑦ Modèle d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --② Construction de l'environnement
J'ai fait un programme de gestion de la paie en Python!
J'ai touché "Orator" alors j'ai fait une note
J'ai fait un compteur de caractères avec Python
J'ai fait un interlocuteur comme Siri
J'ai fait un script pour afficher des pictogrammes
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai créé un outil d'estampage automatique du navigateur.
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
Créer un environnement de développement Python pour le développement de l'IA
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django