Python x Flask x PyTorch Einfacher Aufbau einer Webanwendung zur Nummernerkennung

Erstellen wir eine Bilderkennungs-App mit Python, Flask und PyTorch. Durch die Kombination dieser drei können Sie ganz einfach eine Demo-App mit explosiver Geschwindigkeit erstellen.

Vorwort

Was ist eine Flasche?

Ein Webframework für Python. Django ist ein bekanntes Webframework für Python, aber Flask verkauft Lightweight. Im Vergleich zu Django verfügt es über weniger Funktionen und Erweiterungsbibliotheken, aber die Einschränkungen vereinfachen den Code und Sie können problemlos Anwendungen erstellen. Es eignet sich zum Erstellen eines Prototyps einer Webanwendung, da es einfach ist, eine Umgebung zu erstellen.

Gute Kompatibilität zwischen Flask, Bildverarbeitung und maschinellem Lernen

Es ist bekannt, dass Python über eine Fülle von Bibliotheken für maschinelles Lernen verfügt und zum De-facto-Standard geworden ist. Darüber hinaus verfügt Python über zahlreiche Bildverarbeitungsbibliotheken wie OpenCV und Pillow (PIL), und im Internet gibt es eine Fülle von Informationen. Vor diesem Hintergrund macht es die Verwendung von Python x Flask sehr einfach, die Bibliothek für maschinelles Lernen und die Bildverarbeitungsbibliothek zu verwenden, und Sie können problemlos Anwendungen erstellen.

Dieses Ziel

Wenn Sie ein handgeschriebenes Zahlenbild aus einem Browser hochladen, erstellen wir eine Anwendung, die die Zahl erkennt und das Ergebnis anzeigt. 2019-12-13_20h51_28.png

Anwendungskonfiguration

Erstellen eines Modells für maschinelles Lernen

Dieses Mal habe ich mit PyTorch ein handgeschriebenes Zahlenerkennungsmodell von MNIST erstellt.

Ein einfaches Beispiel, das ein Modell speichert, das MNIST mit PyTorch in Google Colaboratory gelernt hat, es vorliest und verwendet - Programmierblog für künstliche Intelligenz Erstellen Sie ein Lernmodell, indem Sie auf diesen Artikel verweisen. Als ich es verschob, bekam ich 1.725.616 Bytes von mnist_cnn.pt.

Umwelt schaffen

Wenn Sie pip installiert haben, können Sie die Flask-Umgebung mit pip install Flask erstellen. Dieses Mal verwende ich auch Pillow (PIL) und PyTorch, also installiere sie auch.

Erstellen Sie eine Web-App

Das Verzeichnis und die Dateistruktur sind wie folgt.

├── mnist_cnn.pt… Handschriftliches Nummernerkennungsmodell
├── predict.py… Das Hauptskript. Laden Sie Dateien hoch und beurteilen Sie Bilder
├── statisch… Platzieren Sie die hochgeladene Datei
│   ├── 20191213210438.png… Die hier hochgeladene Datei wird gespeichert
│   ├── 20191213210253.png
│   └── 20191213210341.png
├── Vorlagen… html Wo soll die Vorlage gespeichert werden?
     ├── index.html

Der Inhalt von pred.py. Beschreibt die Definition und das Laden von Modellen für maschinelles Lernen und die Verarbeitung von Webanwendungen. Weitere Informationen zur Modelldefinition und Bildvorverarbeitung finden Sie in den folgenden Artikeln. Pytorch × MNIST Handschriftliche Nummernerkennung Versuchen Sie, das PNG-Bild als Eingabe vorherzusagen - Qiita

predict.py


#Laden Sie das gewünschte Modul
#Flasche verwandt
from flask import Flask, render_template, request, redirect, url_for, abort

#PyTorch verwandt
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import datasets, transforms

# Pillow(PIL)、datetime
from PIL import Image, ImageOps
from datetime import datetime

#Modelldefinition
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4 * 4 * 50, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)
        x = x.view(-1, 4 * 4 * 50)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)


device = torch.device("cpu")
model = 0
model = Net().to(device)
#Laden Sie das Trainingsmodell
model.load_state_dict(
    torch.load("./mnist_cnn.pt", map_location=lambda storage, loc: storage)
)
model = model.eval()

app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def upload_file():
    if request.method == "GET":
        return render_template("index.html")
    if request.method == "POST":
        #Speichern Sie die hochgeladene Datei einmal
        f = request.files["file"]
        filepath = "./static/" + datetime.now().strftime("%Y%m%d%H%M%S") + ".png "
        f.save(filepath)
        #Bilddatei laden
        image = Image.open(filepath)
        #Für PyTorch konvertiert(Größenänderung, Schwarz-Weiß-Inversion, Normalisierung, Dimensionsaddition)
        image = ImageOps.invert(image.convert("L")).resize((28, 28))
        transform = transforms.Compose(
            [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
        )
        image = transform(image).unsqueeze(0)
        #Voraussagen machen
        output = model(image)
        _, prediction = torch.max(output, 1)
        result = prediction[0].item()

        return render_template("index.html", filepath=filepath, result=result)


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

Der Inhalt von index.html. Das Hochladen von Dateien und die Anzeige von Erkennungsergebnissen werden in dieser HTML-Vorlage beschrieben.

index.html


<html>
    <body>
        {% if result %}
          <IMG SRC="{{filepath}} " BORDER="1">Das Erkennungsergebnis ist{{result}}ist<BR>
          <HR>
        {% endif %}
Bitte wählen Sie eine Datei und senden Sie<BR>
        <form action = "./" method = "POST" 
           enctype = "multipart/form-data">
           <input type = "file" name = "file" />
           <input type = "submit"/>
        </form>
     </body>
</html>

Starten und überprüfen Sie den Betrieb

Wenn Sie python predicy.py ausführen, wird der Webserver von Flask gestartet und die App wird gestartet. Der Standardport von Flask ist übrigens 5000. http://localhostかホスト名:5000/でアクセスするとWebアプリケーションが表示されます。 Wenn Sie handschriftliche Nummern hochladen 2019-12-13_21h08_00.png Es wird das Erkennungsergebnis angezeigt. Ich kann es richtig als "9" erkennen. 2019-12-13_21h08_15.png

Zusammenfassung

Es scheint schwierig zu sein, eine Webanwendung zu erstellen, die Bilder mithilfe von maschinellem Lernen erkennt, und es scheint mit viel Code kompliziert zu sein, aber Flask macht es wirklich einfach. Es ist nicht das Ende eines maschinellen Lernmodells, aber ich denke, es ist etwas, das verschiedene Leute verwenden werden. Wenn es jedoch befehlsbasiert ist, können Nicht-Ingenieure es nicht verwenden, und es ist schwierig, verschiedene Dinge auszuprobieren. In einem solchen Fall wird empfohlen, Flask zu verwenden, um einen schnellen Prototyp zu erstellen.

Recommended Posts

Python x Flask x PyTorch Einfacher Aufbau einer Webanwendung zur Nummernerkennung
Webanwendung mit Python + Flask ② ③
Webanwendung mit Python + Flask ④
Python x Flask x Tensorflow.Keras Web-App, die Katzenrassen vorhersagt 2
Webanwendung mit Python + Flask (unter Verwendung von VScode) # 1 - Aufbau einer virtuellen Umgebung-
Python: Anwendung der Bilderkennung mit CNN
Einfache Einführung der Spracherkennung mit Python
Einfache Web-App mit Python + Flask + Heroku
[Python] Webanwendung von 0! Hands-on (0) -Umweltbau-
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (1) [Umgebungskonstruktion]
Installation von Python 3 und Flask [Zusammenfassung der Umgebungskonstruktion]
[Python] Webanwendung von 0! Hands-on (1) -Design, DB-Konstruktion-
Kurs zur Erstellung von Webanwendungen, der mit Flask of Python Teil 2 Kapitel 1 ~ JSON-Austausch ~ gelernt wurde
Analysieren und visualisieren Sie JSON (Webanwendung ⑤ mit Python + Flask)
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Anwendung von Python 3 vars
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Entwicklung von Webanwendungen mit Flask
2.x, 3.x Serienzeichencode von Python
Vergleich von 4 Arten von Python-Webframeworks
Anwendung der CNN2-Bilderkennung
Umgebungskonstruktion von Python2 & 3 (OSX)
Zahlenerkennung in Bildern mit Python
Umgebungskonstruktion von Python und OpenCV
Python x GIS-Grundlagen (3)
Erstellen einer Webanwendung mit Flask ②
Einfache Verschlüsselung von Dateiinhalten (Python)
Python: Anwendung des überwachten Lernens (Rückkehr)
Python x Tensoflow x Gesichtserkennung
Erstellen einer Umgebung für Python3.8 auf einem Mac
Grundlagen von Python x GIS (Teil 2)
Erstellen einer Webanwendung mit Flask ①
Erstellen einer Webanwendung mit Flask ③
pytorch @ python3.8 Umgebungskonstruktion mit pipenv
Erstellen einer Webanwendung mit Flask ④
Anwendungsentwicklung mit Docker + Python + Flask
Erstellen einer Umgebung für Flask / MySql / Apache / mod_wsgi / virtualenv mit Redhat7 (Python2.7) November 2020
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (2) [Projekterstellung]
[GCP] Verfahren zum Erstellen einer Webanwendung mit Cloud-Funktionen (Python + Flask)
Automatische Veröffentlichung einer Webdesign-Website mit Python + Selen (1) Umgebungskonstruktion
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen