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.
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.
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.
Wenn Sie ein handgeschriebenes Zahlenbild aus einem Browser hochladen, erstellen wir eine Anwendung, die die Zahl erkennt und das Ergebnis anzeigt.
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.
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.
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>
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
Es wird das Erkennungsergebnis angezeigt. Ich kann es richtig als "9" erkennen.
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