Python: Einführung in Flask: Erstellen einer Nummernidentifizierungs-App mit MNIST

Was ist eine Flasche?

Flask ist ein leichtes Webanwendungsframework für Python.

Was ist ein Framework? Es fasst die Funktionen zusammen, die für die Entwicklung von Anwendungssoftware erforderlich sind. Ein Paket, mit dem Sie einfach ein Framework / eine Vorlage erstellen können.

Schienen für die Sprache Ruby Für Python sind Django und Flask der Mainstream.

Sie können Webanwendungen einfach und leicht entwickeln, indem Sie sie in eine Vorlage namens Flask einfügen.

Wir werden mit MNIST eine handschriftliche Zeichenidentifizierungsanwendung erstellen. Verarbeiten Sie mit dem Server mithilfe von Flask und erstellen Sie das Erscheinungsbild der Anwendung mit HTML und CSS.

Führen Sie die kleinste Flask-App aus

Um zu erfahren, was Flask kann, führen wir zunächst die kleinste Flask-Webanwendung aus.

hello.py



from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Da es auf Fastpyter nicht ausgeführt werden kann, ist das Folgende die Arbeit in der lokalen Umgebung.

  1. Erstellen Sie hello.py in Ihrem Editor und kopieren Sie den obigen Code und fügen Sie ihn ein

  2. Geben Sie python hello.py in das Terminal ein und führen Sie es aus

  3. Greifen Sie auf http://127.0.0.1:5000/ zu.

Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.

Codebeschreibung

Schauen wir uns diesen Code genauer an.

Erklären Sie zunächst, dass Sie die Flask-Klasse des Flask-Pakets verwenden möchten.

from flask import Flask

Erstellen Sie als Nächstes eine Instanz der Flask-Klasse mit dem Namen app.

app.<Name der Flask-Klassenmethode>

Ermöglicht die Verwendung der Methoden der Flask-Klasse

app = Flask(__name__)

Ich bekomme hier ein unbekanntes @ Zeilen, die mit @ beginnen, werden als Dekoratoren bezeichnet Machen Sie etwas mit der in der nächsten Zeile definierten Funktion oder Klasse.

app.route () hat die in der nächsten Zeile definierte Funktion angegeben Wir verarbeiten, um mit URL zu verknüpfen. Im Argument von app.route () Geben Sie die URL nach [http://127.0.0.1:5000/] an.

Das heißt, im folgenden Code beim Zugriff auf http://127.0.0.1:5000/ Dies bedeutet, dass die Funktion hello_world () aufgerufen wird und Hello World!

@app.route('/')#http://127.0.0.1:5000/Geben Sie den nachfolgenden Pfad an
def hello_world():
    return "Hello World!"

name == '__ main__' ist True Das heißt, nur wenn dieser Code direkt ausgeführt wird app.run () wird ausgeführt und die Flask-App gestartet.

if __name__ == "__main__":
    app.run()

Was ist name

Durch die Beschreibung von if name == '__ main__': früher Wenn Sie das Python-Skript direkt ausführen Nur (wie beim Ausführen von python filename.py in der Befehlszeile)

if name == '__ main__': Sie können die folgende Verarbeitung ausführen. Und wenn es aus einer anderen Datei importiert wird, wird es nicht verarbeitet. Diese Beschreibung wird beispielsweise verwendet, wenn Sie ein eigenes Modul erstellen und testen Es wird verwendet, wenn Sie unnötige Verarbeitung verhindern möchten.

Schauen wir uns diesen Mechanismus hier genauer an. Übrigens ist name eine Variable, die automatisch für jede Skriptdatei definiert wird. Der Dateiname (Modulname) wird automatisch gespeichert.

Wenn Sie die Datei jedoch direkt ausführen, wird main automatisch in name gespeichert. Schauen wir uns das folgende Beispiel an.

Beispiel) Was wird ausgegeben, wenn der folgende test1.py ausgeführt wird?

test1.py



#Funktionsshow()Ist definiert
def show():
    return __name__

print(__name__)
#Ausgabeergebnis
__main__

Weil test1.py direkt ausgeführt wird main wird automatisch in name gespeichert, sodass main ausgegeben wird.

Wenn das Python-Skript direkt so ausgeführt wird Weil main in einer Variablen namens name gespeichert ist

name == '__ main__ wird True if name == '__ main__': Die folgende Verarbeitung wird ausgeführt.

Erstellen einer Nummernerkennungs-App mit MNIST

HTML- und CSS-seitige Produktion

Übrigens habe ich eine sehr einfache App erstellt, die nur Hello World! Dieses Mal werden wir HTML und CSS reflektieren, um es mehr wie eine Webanwendung zu machen.

Der Inhalt wird in Einführung in HTML & CSS erläutert.

mnist.py



from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('index.html')

if __name__ == "__main__":
    app.run()

Sie arbeiten in einer lokalen Umgebung.

1, Erstellen Sie einen Ordner mit einem geeigneten Namen (z. B. mnist_app) auf dem Desktop usw.

2, Erstellen Sie mnist.py im Ordner mnist_app und kopieren Sie den obigen Code und fügen Sie ihn ein

3, Erstellen Sie einen Vorlagenordner im Ordner mnist_app und erstellen Sie darin die Datei index.html Kopieren Sie den Code von HTML-Vorlagenerklärung 1/5 und fügen Sie ihn in index.html ein

4, Erstellen Sie einen statischen Ordner im Ordner mnist_app Erstellen Sie darin die Datei stylesheet.css (Flask soll im Vorlagenordner nach der HTML-Datei und im statischen Ordner nach der CSS-Datei suchen.) Kopieren Sie den Code von CSS-Vorlagenerklärung 1/5 und fügen Sie ihn in stylesheet.css ein

5, cd mnist_app /, um in den Ordner mnist_app zu wechseln

6, Geben Sie python mnist.py in das Terminal ein und führen Sie es aus

7, Zugriff http://127.0.0.1:5000/

Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.

Codebeschreibung

Schauen wir uns den Code genauer an. Was unterscheidet sich von dem Code, mit dem Sie die kleinste Flask-App ausführen können?

return render_template('index.html')nur.
@app.route('/')
def hello_world():
    return render_template('index.html')

Kolbenseitige Produktion

Bisher haben wir die Webseiten-Seite entworfen und einen Datei-Uploader erstellt. Sie können die Datei jedoch nicht hochladen, ohne den Code auf der Flask-Seite hinzuzufügen.

Hier erhalten wir das von der Webseite hochgeladene Bild und identifizieren es mit dem trainierten Modell. Schauen wir uns den Code an, der das Ergebnis anzeigt.

Bevor Sie den Code mit dieser ipynb-Datei ausführen Bitte bereiten Sie das trainierte Modell model.h5 im selben Verzeichnis vor.

mnist.py

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
import tensorflow as tf
import numpy as np

classes = ["0","1","2","3","4","5","6","7","8","9"]
num_classes = len(classes)
image_size = 28

UPLOAD_FOLDER = "uploads"
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)

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

model = load_model('./model.h5')#Laden Sie das trainierte Modell

graph = tf.get_default_graph()

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    global graph
    with graph.as_default():
        if request.method == 'POST':
            if 'file' not in request.files:
                flash('Keine Datei')
                return redirect(request.url)
            file = request.files['file']
            if file.filename == '':
                flash('Keine Datei')
                return redirect(request.url)
            if file and allowed_file(file.filename):
                filename = secure_filename(file.filename)
                file.save(os.path.join(UPLOAD_FOLDER, filename))
                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=True, target_size=(image_size,image_size))
                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 = "das ist" + classes[predicted] + "ist"

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

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


if __name__ == "__main__":
    app.run()

Da es auf Fastpyter nicht ausgeführt werden kann, ist das Folgende die Arbeit in der lokalen Umgebung.

  1. Ersetzen Sie mnist.py durch den obigen Code

  2. Erstellen Sie einen Upload-Ordner in derselben Hierarchie wie mnist.py

  3. Fügen Sie model.h5, das das zuvor trainierte Modell gespeichert hat, in dieselbe Hierarchie wie mnist.py ein

  4. Behalten Sie die Dateiposition bei, geben Sie python mnist.py in das Terminal ein und führen Sie es aus

  5. Gehen Sie zu http://127.0.0.1:5000/

Laden wir nun ein numerisches Bild hoch.

image.png

Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.

Codebeschreibung 1/3

Schauen wir uns diesen Code genauer an.

Importieren Sie zunächst die erforderlichen Bibliotheken und Module.

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
import tensorflow as tf
import numpy as np

Speichern Sie als Nächstes die Klassennamen, die Sie klassifizieren möchten, in der Klassenliste. Dieses Mal werden wir die Zahlen klassifizieren, also setzen Sie sie auf 0-9. Übergeben Sie die Größe des für das Training verwendeten Bildes an imaze_size. Dieses Mal habe ich den MNIST-Datensatz verwendet und ihn auf 28 gesetzt.

classes = ["0","1","2","3","4","5","6","7","8","9","10"]
num_classes = len(classes)
image_size = 28

Übergeben Sie den Namen des Ordners, um das hochgeladene Bild in UPLOAD_FOLDER zu speichern. Geben Sie für ALLOWED_EXTENSIONS die Erweiterungen an, die das Hochladen ermöglichen.

UPLOAD_FOLDER = "uploads"
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

Erstellen Sie eine Instanz der Flask-Klasse.

app = Flask(__name__)

Definiert eine Funktion, die die Erweiterung hochgeladener Dateien überprüft. Gibt True zurück, wenn die beiden Bedingungen vor und nach und erfüllt sind.

Die erste Bedingung '.' Im Dateinamen ist Gibt an, ob das Zeichen in der Variablen Dateiname vorhanden ist.

Die zweite Bedingung Dateiname.rsplit ('.', 1) [1] .lower () in ALLOWED_EXTENSIONS Gibt an, ob die Zeichenfolge nach. In der Variablen Dateiname einer von ALLOWED_EXTENSIONS entspricht.

rsplit () ist im Grunde dasselbe wie split (). Split () wurde jedoch vom Anfang der Zeichenfolge getrennt Die Reihenfolge des Trennzeichens für rsplit beginnt am Ende der Zeichenfolge.

lower () konvertiert die Zeichenfolge in lower.

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

Laden Sie das trainierte Modell. graph = tf.get_default_graph () ist der Code, der für den Keras-Fehler benötigt wird. Machen Sie sich also keine Sorgen.

model = load_model('./model.h5')#Laden Sie das trainierte Modell

graph = tf.get_default_graph()

Codebeschreibung 2/3

Als nächstes definieren wir die Funktion, die ausgeführt werden soll, wenn auf die oberste Seite zugegriffen wird.

GET und POST sind eine Art HTTP-Methode.

Ich werde die ausführliche Erklärung weglassen GET ruft Ressourcen ab (beim Zugriff auf die Seite wird eine HTML-Datei abgerufen) POST bedeutet das Senden von Daten an den Server.

global graph、with graph.as_default():Ebenfalls
Keine Sorge, es wird wegen eines Keras-Fehlers benötigt.

request ist eine Funktion zum Verarbeiten von Daten, die von einem Formular im Web gesendet werden request.method enthält die Anforderungsmethode Dies wird auch in Einführung in HTML und CSS erläutert. Und wenn request.method == 'POST', wird der folgende Code ausgeführt.

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    global graph
    with graph.as_default():
        if request.method == 'POST':

Enthält die POST-Anforderung hier Dateidaten? Es wird auch geprüft, ob die Datei einen Dateinamen hat.

redirect () ist eine Funktion, die zu der im Argument angegebenen URL umleitet request.url enthält die URL der Seite, auf der die Anfrage gestellt wurde.

Das heißt, wenn keine hochgeladene Datei oder kein Dateiname vorhanden ist, wird zur ursprünglichen Seite zurückgekehrt.

if 'file' not in request.files:
    flash('Keine Datei')
    return redirect(request.url)
file = request.files['file']
if file.filename == '':
    flash('Keine Datei')
    return redirect(request.url)

Überprüfen Sie dann die Erweiterung der hochgeladenen Datei.

Danach macht Secure_Dateiname () alle gefährlichen Zeichenfolgen im Dateinamen ungültig (bereinigt).

Verbinden Sie als Nächstes die als Argumente angegebenen Pfade mit os.path.join () gemäß os. (Kombiniert mit \ unter Windows, kombiniert mit / unter Mac und Linax) Speichern Sie das hochgeladene Bild in diesem Pfad. Außerdem wird das Speicherziel im Dateipfad gespeichert.

if file and allowed_file(file.filename):
    filename = secure_filename(file.filename)
    file.save(os.path.join(UPLOAD_FOLDER, filename))
    filepath = os.path.join(UPLOAD_FOLDER, filename)

Codebeschreibung 3/3

Schließlich bestimmen wir die Nummer des hochgeladenen Bildes. Hier verwenden wir eine Funktion namens image.load_img von Keras, mit der Bilder gleichzeitig geladen und in der Größe geändert werden können.

Geben Sie im Argument die URL des Bildes an, das Sie laden möchten, und die Größe, deren Größe Sie ändern möchten.

Weitere Graustufen=Indem Sie True übergeben

Es kann in Schwarzweiß gelesen werden. image.img_to_array konvertiert das im Argument angegebene Bild in ein Numpy-Array.

Sie müssen auch eine Liste von Numpy-Arrays an model.predict () übergeben. Daher wird img als Liste an np.array () übergeben. Das Vorhersageergebnis wird in pred_answer gespeichert.

 #Lesen Sie das empfangene Bild und konvertieren Sie es in das np-Format
img = image.load_img(filepath, grayscale=True, target_size=(image_size,image_size))
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 = "das ist" + classes[predicted] + "ist"

Durch Übergabe von answer = pred_answer an das Argument von ender_template Sie können der in index.html geschriebenen Antwort pred_answer zuweisen.

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

Wenn keine POST-Anfrage gestellt wird (einfach auf die URL zugreifen) In der Antwort von index.html wird nichts angezeigt.

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

Schließlich wird app.run () ausgeführt und der Server gestartet.

if __name__ == "__main__":
    app.run()

Bereitstellen

Veröffentlichungseinstellungen

Bis vor kurzem habe ich die Web-App nur auf meinem eigenen Computer ausgeführt. Hier erfahren Sie, wie Sie eine Web-App für Heroku bereitstellen und weltweit veröffentlichen.

So stellen Sie den Server bei der Bereitstellung von Webanwendungen extern zur Verfügung

host='0.0.0.0'Angeben.
port = int(os.environ.get('PORT', 8080))Dann

Die Portnummer, die in Heroku verwendet werden kann, wird erfasst und per Post gespeichert.

Wenn nicht eingestellt, wird 8080 gespeichert.

Am Ende von mnist.py

if __name__ == "__main__":
    app.run()

Teil von

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

Bitte schreiben Sie den obigen Code neu.

Heroku einrichten und bereitstellen

Richten Sie Heroku ein.

Vor dem Ausführen des Codes Befindet sich im Verzeichnis mnist_app, das sich im selben Verzeichnis wie diese ipynb-Datei befindet Bitte bereiten Sie Procfile, require.txt, runtime.txt vor

Registrieren Sie sich zunächst als Mitglied von Heroku und melden Sie sich an. Als nächstes installieren Sie Heroku.

Bitte installieren Sie von der [Heroku CLI] -Seite (https://devcenter.heroku.com/articles/heroku-cli). Git wird zur gleichen Zeit installiert, zu der Sie Heroku CLI installieren.

Hier erfahren Sie, wie Sie Heroku bereitstellen.

1, wechseln Sie in das Verzeichnis mit den App-Dateien (cd __)

  1. Geben Sie Ihre E-Mail-Adresse und Ihr Passwort gemäß den Anweisungen des Heroku-Logins ein

3, gehe nach Heroku, Geben Sie Create New App-> App name ein Wechseln Sie zu der Seite der App, auf der das Land in den USA registriert ist, und wechseln Sie zu Setteings Klicken Sie auf Build Pack hinzufügen, um Python hinzuzufügen

Verschieben Sie die drei folgenden Dateien in das Verzeichnis, in dem sich die App befindet (Es befindet sich im Verzeichnis mnist_app, das sich im selben Verzeichnis wie diese ipynb-Datei befindet.)

Procfile, requirements.txt, runtime.txt

Stellen Sie beim Überprüfen des Vorgangs auf Heroku sicher, dass Sie die Datei mnist.py verwenden Nennen Sie es main.py.

Da die Procfile angibt, eine Datei namens main.py zu starten Verwenden Sie diesmal main.py.

Sie können eine Datei mit einem beliebigen Namen starten, indem Sie Procfile neu schreiben.
Auch Anforderungen.txt
In Herokus eigener App schreiben Sie die notwendigen Bibliotheken für
Die Bibliothek wird installiert.
runtime.Beschreiben Sie die Version von Python, die in txt verwendet werden soll.

Im Verzeichnis (Ordner) main.py, Procfile, require.txt, runtime.txt Stellen Sie sicher, dass Sie über das trainierte Modell, den Vorlagenordner, den Statikordner und den Upload-Ordner verfügen.

~ In der Hierarchie mit der Anwendungsdatei des Terminals (Eingabeaufforderung) ~

git init(Dies ist nur das erste Mal)
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
Bitte bereitstellen als.

image.png

Die bereitgestellte App hat die URL https: // app name.herokuapp.com/. Sie können auch den Befehl heroku open eingeben, um zu der URL zu gelangen, unter der die Web-App ausgeführt wird. Wenn Sie den Vorgang bestätigen können, ist die Bereitstellung erfolgreich.

Recommended Posts

Python: Einführung in Flask: Erstellen einer Nummernidentifizierungs-App mit MNIST
Schritte von der Installation von Python 3 bis zur Erstellung einer Django-App
Erstellen einer Webanwendung mit Flask ②
Erstellen einer Webanwendung mit Flask ①
Erstellen eines Lernmodells mit MNIST
Erstellen einer Webanwendung mit Flask ③
Erstellen einer Webanwendung mit Flask ④
Python Bit Arithmetic Super Einführung
Starten Sie eine Flask-App in Python Anywhere
Einführung in die diskrete Ereignissimulation mit Python # 2
Ich möchte eine Webanwendung mit React und Python Flask erstellen
[Python] Teilen Sie eine große Flask-Datei mit Blueprint
[Einführung in Python3, Tag 23] Kapitel 12 Werden Sie Paisonista (12.1 bis 12.6)
Erstellen Sie eine Web-App, die PDF mit Flask und PyPDF2 in Text konvertiert
[Einführung in die Udemy Python3 + -Anwendung] 66. Erstellen einer eigenen Ausnahme
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Einführung in die Python-Sprache
[Einführung in Python] Hochgeschwindigkeits-Einführung in Python für vielbeschäftigte C ++ - Programmierer
Einführung in OpenCV (Python) - (2)
So erstellen Sie ein Python-Paket mit VS Code
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Einführung in die lineare Algebra mit Python: A = LU-Zerlegung
Schreiben Sie Code in UnitTest, eine Python-Webanwendung
[Einführung in Python] Wie stoppe ich die Schleife mit break?
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Namensidentifikation mit Python
So hosten Sie die Web-App-Backend-Verarbeitung in Python mithilfe einer Leihserver-Subdomain
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
[Einführung in Python] Wie man bedingte Verzweigungen mit if-Anweisungen schreibt
Beispiel zum Einfügen der Python Flask-Webanwendung in den Azure App Service (Webanwendung)
So starten Sie AWS Batch über die Python-Client-App
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
So verschieben Sie ein zweidimensionales Array nur mit Python [Hinweis]
Ein Hinweis beim Erstellen eines gerichteten Diagramms mit Graphviz in Python
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
[Python] Einführung in die Diagrammerstellung mit Corona-Virendaten [Für Anfänger]
Ein Weg zum mittleren Python
Eine super Einführung in Linux
Mit Python auf Twitter posten
Starten Sie mit Python zu Selen
Einführung in die serielle Kommunikation [Python]
[Einführung in Python] <Liste> [Bearbeiten: 22.02.2020]
Einführung in Python (Python-Version APG4b)
Eine Einführung in die Python-Programmierung
Einführung in discord.py (3) Verwenden von Stimme
Einführung in Python For, While
Erstellen eines sequentiellen Tensorflow-Modells mit einem zu MNIST hinzugefügten Originalbild
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Einführung in Python] So geben Sie eine Zeichenfolge in einer Print-Anweisung aus
Verarbeiten Sie das Ausführungsergebnis von Splunk mit Python und speichern Sie es in einer Datei
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen