Letztes Mal Ich habe sogar ein Lernmodell erstellt.
Dieses Mal erstellen wir mithilfe des Lernmodells eine tatsächliche Webanwendung und stellen sie sogar bereit.
Das fertige Bild sieht so aus
main.py
#Modul importieren
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
#Spielername
classes = ['Hinako Shibuno', 'Kleine Feier Sakura', 'Erika Hara']
num_classes = len(classes)
image_size = 64
#Datei zum Speichern des hochgeladenen Bildes
UPLOAD_FOLDER = "uploads/"
#Geben Sie die Erweiterung an, die das Hochladen ermöglicht
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
#Richten Sie eine Instanz der Flask-Klasse ein
app = Flask(__name__)
#Definieren Sie eine Funktion zum Überprüfen der Erweiterung hochgeladener Dateien
def allowed_file(filename):
#Erste Bedingung: in der Variablen Dateiname'.'Enthält es die Zeichen?
#Zweite Bedingung: variabler Dateiname.Die nachfolgende Zeichenfolge ist ERLAUBT_Welche der ERWEITERUNGEN ist anwendbar?
#In rsplit ist die Reihenfolge des Trennzeichens "1" ab dem Ende der Zeichenfolge. niedriger konvertiert Zeichenfolgen in niedrigere
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
#Gesicht erkennen(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))]#Es gibt kein Problem, da nur eine Person angezeigt wird
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 "Bitte geben Sie ein Gesichtsbild ein"
#Laden Sie das trainierte Modell
model = load_model('./golfer.h5', compile=False)
graph = tf.get_default_graph()
# app.route()Verknüpfen Sie die in der Funktion angegebene URL mit./ http://127.0.0.1:5000/Geben Sie die folgende URL an
@app.route('/', methods=['GET', 'POST'])
def upload_file():
global graph
# as_default()Geben Sie das Zieldiagramm mit an
with graph.as_default():
#Wenn die HTTP-Methode POST ist
if request.method == 'POST':
#Enthält die POST-Anforderung Dateidaten?
if 'file' not in request.files:
flash('Keine Datei')
#Redirect ist eine Funktion, die zur Argument-URL umleitet
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('Keine Datei')
return redirect(request.url)
#Wenn die Datei in einem zulässigen Format vorliegt
if file and allowed_file(file.filename):
#Wenn der Dateiname eine gefährliche Zeichenfolge enthält, deaktivieren Sie diese.
filename = secure_filename(file.filename)
#Im Upload-Ordner speichern
file.save(os.path.join(UPLOAD_FOLDER, filename))
#Erstellen Sie einen Dateipfad
filepath = os.path.join(UPLOAD_FOLDER, filename)
# #Lesen Sie das empfangene Bild und konvertieren Sie es in das np-Format
img = image.load_img(filepath, grayscale=False, target_size=(image_size,image_size))
#Erkennen Sie das Gesichtsteil
img = detect_face(filepath)
if type(img)!=str:
img = image.img_to_array(img)
data = np.array([img])
#Übergeben Sie die transformierten Daten zur Vorhersage an das Modell
result = model.predict(data)[0]
predicted = result.argmax()
pred_answer = "Diese weibliche Fachkraft" + str(classes[predicted]) + "ist"
return render_template("index.html",answer=pred_answer)
else:
return render_template("index.html",answer=img)
return render_template("index.html",answer="")
#Lösen Sie das Problem, dass CSS bei der Entwicklung von Webanwendungen mit Flask nicht berücksichtigt wird
@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)
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>Professionelles Golferurteil</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="#">Professionelles Golferurteil</a>
</header>
<div class="main">
<h2>Identifiziert das Gesicht im Bild</h2>
<p>Bitte senden Sie das Bild</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;
}
Die Struktur der Datei ist wie folgt
Index.html im Vorlagenordner stylesheet.css im statischen Ordner
Die restlichen Dateien finden Sie in diesem Artikel [Vollständige Version] Verfahren zum Bereitstellen der mit Flask erstellten API für Heroku (Hinweis)
Heroku Registrieren Sie sich hier
$ heroku login
Neue App erstellen ⇨ Geben Sie den App-Namen ein, um Ihr Land in den USA zu registrieren. Gehen Sie zur App-Seite, gehen Sie zu Setteings und klicken Sie auf Build Pack hinzufügen, um Python hinzuzufügen.
git init
__ * Nur beim ersten Mal. Wenn Sie dies zweimal tun, können Sie die Bereitstellung nicht erfolgreich durchführen. __ __
heroku git:remote -a (App Name)
git add .
git commit -m “(Schreiben Sie eine Nachricht darüber, was sich geändert hat)”
git push heroku master
__ Die Bereitstellung ist abgeschlossen __
Überprüfen Sie mit dem Code unten
heroku open
Damit sind die 3 Postings der Bild-App abgeschlossen.
Recommended Posts