Три части этого руководства:
1. Сначала обучите модель
2. Компоненты, необходимые для сборки микрофреймворка Flask для создания веб-приложения.
3. Запустите веб-приложение
Компоненты, которые необходимо установить
Если вы копируете и вставляете код с этой страницы, убедитесь, что установлены следующие компоненты:
Python 3.6+
python packages:
Flask
Pandas
Sklearn
Xgboost
Seaborn
Matplotlib
1. Сначала обучите модель
Я не буду здесь подробно останавливаться на модели, можно использовать любую модель, будь она написана на tensorflow или pytorch.
2. Компоненты, необходимые для сборки микрофреймворка Flask для создания веб-приложения.
Нам нужно сделать несколько вещей, чтобы объединить веб-приложение:
А. Код Python, включая загрузку нашей обученной модели, получение пользовательского ввода из веб-формы, создание прогнозов и возврат результатов.
б) HTML-шаблоны позволяют пользователям вводить свои данные и отображать результаты.
Первоначальная структура веб-приложения выглядит следующим образом:
Сначала я создам очень простые файлы app.py и main.html, чтобы продемонстрировать, как работает flask. Мы расширим программу позже, чтобы удовлетворить наши потребности
app.py
Это ядро веб-приложения. Он будет работать на сервере, отправлять веб-страницу и обрабатывать ввод пользователя.
import flask
app = flask.Flask(__name__, template_folder='templates')
@app.route('/')
def main():
return(flask.render_template('main.html'))
if __name__ == '__main__':
app.run(host = '0.0.0.0')
main.html
Это внешний интерфейс. Все, что он сейчас делает, — это отображает простое сообщение, которое мы позже отредактируем в соответствии с нашими потребностями.
<!doctype html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>Web app name</title>
</head>
<h1>Hello world.</h1>
</html>
Running the test app
Чтобы сначала запустить flask на сервере, откройте терминал, убедитесь, что вы находитесь в папке веб-приложения, и выполните следующую команду:flask run
Затем нажмите CTRL+C, чтобы выйти.
Снова запустите файл app.python.python app.python
Затем введите (127.0.0.1:5000) в браузере локального компьютера.Поскольку мы развертываем на сервере, мы должны заменить 127.0.0.1 на доменное имя сервера доступа.http://202.116.46.215:5000/, если это все еще не работает, возможно, порт 5000 не открыт
На данный момент наше базовое веб-приложение завершено, и затем нам нужно будет изменить программу в соответствии с нашими потребностями.
Я использую модель, которую я написал, чтобы внести изменения, вам просто нужно внести соответствующие изменения в соответствии с вашей моделью. То, что я обучил, — это модель распознавания еды, написанная на тензорном потоке, и я сохранил обученную модель в model/
Затем к моей модели добавлен соответствующий код для загрузки модели.
model = 'R50+ViT-B_16'
VisionTransformer = models.KNOWN_MODELS[model].partial(num_classes=172)
params = checkpoint.load(f'/model/best_model.npz')
params['pre_logits'] = {} # Need to restore empty leaf for Flax.
Если вы используете модель, написанную pytorch, код для загрузки модели может ссылаться на
# Use pickle to load in the pre-trained model.
with open(f'./model/bike_model_xgboost.pkl', 'rb') as f:
model = pickle.load(f)
Модель загружается, занимаюсь распознаванием изображений, хочу получить загруженные фото с фронтенда, а потом делать прогнозы и возвращать
Сначала сохраните фотографии в папку, я использую теги во внешнем файле main.html.<input id="file" name = "file" type= "file"/>
загружать фотографии
#当前绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))
f = request.files.get('file')
# 获取安全的文件名 正常的文件名
filename = secure_filename(f.filename)
# f.filename.rsplit('.', 1)[1] 获取文件的后缀
# 把文件重命名
filename = datetime.now().strftime("%Y%m%d%H%M%S") + "." + "JPG"
print(filename)
# 保存的目标绝对地址
file_path = basedir + "/images/"
# 保存文件到目标文件夹
f.save(file_path + filename)
Получайте фотографии, делайте прогнозы, возвращайте результаты
img = PIL.Image.open('./images/' + filename)
img = img.resize((384,384))
logits, = VisionTransformer.call(params, (np.array(img) / 128 - 1)[None, ...])
#后面就是做softmax,得到概率最大值的结果,然后返回预测结果
preds = flax.nn.softmax(logits)
labels = dict(enumerate(open('labels.txt'),start=1))
for idx in preds.argsort()[:-11:-1]:
print(f'{preds[idx]:.5f} : {labels[idx+1]}', end='')
predict = labels[idx+1]
break
predict = predict[1:-1]
print(predict)
return flask.render_template('main.html', result = predict,)
Код всего app.py
import flask
import pickle
import pandas as pd
from datetime import datetime
from flask import Flask, request, jsonify
import os
from werkzeug.utils import secure_filename
from vit_jax import models
from vit_jax import checkpoint
import flax
import PIL
import numpy as np
#当前绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))
# Initialise the Flask app
app = flask.Flask(__name__, template_folder='templates')
# Set up the main route
@app.route('/', methods=['GET', 'POST'])
def main():
if flask.request.method == 'GET':
# Just render the initial form, to get input
return(flask.render_template('main.html'))
if flask.request.method == 'POST':
f = request.files.get('file')
# 获取安全的文件名 正常的文件名
filename = secure_filename(f.filename)
# f.filename.rsplit('.', 1)[1] 获取文件的后缀
# 把文件重命名
filename = datetime.now().strftime("%Y%m%d%H%M%S") + "." + "JPG"
print(filename)
# 保存的目标绝对地址
file_path = basedir + "/images/"
# 保存文件到目标文件夹
f.save(file_path + filename)
#加载模型
model = 'R50+ViT-B_16'
VisionTransformer = models.KNOWN_MODELS[model].partial(num_classes=172)
params = checkpoint.load(f'./model/best_model.npz')
params['pre_logits'] = {} # Need to restore empty leaf for Flax.
#读取图片,做预测,返回结果
img = PIL.Image.open('./images/' + filename)
img = img.resize((384,384))
logits, = VisionTransformer.call(params, (np.array(img) / 128 - 1)[None, ...])
labels = dict(enumerate(open('labels.txt'),start=1))
preds = flax.nn.softmax(logits)
for idx in preds.argsort()[:-11:-1]:
print(f'{preds[idx]:.5f} : {labels[idx+1]}', end='')
predict = labels[idx+1]
break
predict = predict[1:-1]
return flask.render_template('main.html', result = predict,)
if __name__ == '__main__':
app.run(host = '0.0.0.0')
Фронтенд и бэкенд взаимодействия app.py написаны, и теперь мы начинаем модифицировать интерфейс фронтенда
Поскольку ввод, который я хочу, это изображение, поэтому я хочу загрузить изображение, если вы хотите ввести текст, вы можете просто использовать текстовое поле
<!doctype html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
form {
margin: auto;
width: 35%;
}
.result {
margin: auto;
width: 35%;
border: 1px solid #ccc;
}
</style>
<head>
<title>Food Recognition Model</title>
</head>
<form action="{{ url_for('main') }}" method="POST" enctype = "multipart/form-data">
<fieldset>
<legend>Input values:</legend>
<label for = "file">文件名:</label>
<input id="file" name = "file" type= "file"/>
<input type="submit" name="submit" value="提交"/>
</fieldset>
</form>
<br>
<div class="result" align="center">
{% if result %}
<br> The food is:
<p style="font-size:50px">{{ result }}</p>
{% endif %}
</div>
</html>
На данный момент мы завершили все веб-приложение, давайте попробуем его сейчас
3. Запустите веб-приложение
Введите в терминалеpython app.py
Затем введите его в браузере (замените своим доменным именем)http://202.116.46.215:5000/