#python #html #flask #rotation
#python #HTML #flask #вращение
Вопрос:
Я использую Flask, чтобы попытаться предоставить обработанное изображение, например, обрезать или преобразовать его пользователю после обработки моей моделью, но всегда не получалось, потому что это либо приводило к некоторой ошибке.Когда я использовал numpy.rot90 (), он не повернул мое изображение, как планировалось, вместо этого я получил это.
GET/predict/<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=64x64 at 0xCE11748> HTTP/1.1" 500 -
Вот мой код:
@app.route('/predict/<filename>')
def predict(filename):
image_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
img = Image.open(image_path)
image_url = url_for('images', filename=filename)
image_mtx = imread(image_path)
image_mtx = image_mtx / 255.
image_mtx = image_mtx.reshape(-1, 64, 64, 3)
predictions = model.predict(image_mtx)
angles = ['0', '180', '270', '90']
angle = [0, 90, 180, 270]
confidence = str(round(max(predictions[0]), 4))
predictions = angles[np.argmax(predictions)]
print(predictions)
#img = img.rotate(1*int(angle)) #Clockwise (positive), to change to anti-clockwise put -1
#img = numpy.rot90(img)
if confidence >= '0.8':
if predictions == '270': angle = 90
elif predictions == '180': angle = 180
elif predictions == '90': angle = 270
elif predictions == '0' : angle = 0
numpy.rot90(img)
return render_template(
'predict.html',
image_url=image_url,
img=img,
predictions=predictions,
confidence=confidence
)
html-файл:
{% extends 'layout.html' %}
{% block body %}
<div class="centered">
<p>Image Given</p>
<img src="{{image_url}}" name="image_url" id="image_url">
<p>Looks like it's {{confidence|safe }}</p>
<p>The picture is rotated at {{ predictions|safe }} degrees</p>
<p>Fixed Image</p>
<img src="{{img}}" name="img" id="img">
</div>
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.10.min.js">
</script>
<script src="http://cdn.bokeh.org/bokeh/release/bokeh-widgets-
0.12.10.min.js"></script>
{% endblock %}
Ответ №1:
Вам нужно создать действительный URL для повернутого изображения, которое возвращает файл изображения. Для этого сначала сохраните повернутое изображение. Затем вы можете использовать url_for
для создания URL-адреса для него, как для исходного изображения.
Ниже приведена рабочая реализация. Я удалил код прогнозирования для удобства чтения и чтобы иметь возможность запускать его со своей стороны. В вашем случае вам нужно будет заменить uploads
in os.path.join
на app.config['UPLOAD_FOLDER']
.
import os
from flask import Flask, render_template, url_for, send_file
from PIL import Image
app = Flask(__name__)
@app.route('/images/<filename>')
def images(filename):
image_path = os.path.join('uploads', filename)
return send_file(image_path)
@app.route('/predict/<filename>')
def predict(filename):
image_path = os.path.join('uploads', filename)
img = Image.open(image_path)
image_url = url_for('images', filename=filename)
# rotate image 90 degrees and save rotated image
fixed_img = img.rotate(90)
fixed_img.save(os.path.join('uploads', 'fixed_' filename))
fixed_image_url = url_for('images', filename='fixed_' filename)
img.close()
return render_template(
'predict.html',
image_url=image_url,
img=fixed_image_url
)
if (__name__ == "__main__"):
app.run(port = 8000)
Вывод:
Комментарии:
1. у меня есть еще один вопрос, image_path = os.path.join(‘uploads’, filename) в функции predict сначала принимает входные данные? или это image_path = os.path.join (‘uploads’, filename) из функции images, которая это делает?
2. Не могли бы вы, пожалуйста, перефразировать свой вопрос? Я не уверен, что понимаю.
3. О, мой плохой, я пытался понять процесс на самом деле. Например, зачем нам нужно помещать
image_path = os.path.join('uploads', filename)
в функцию images, еслиimage_path
есть в функции predict ?4. Редактировать: Похоже, что на самом деле это не имеет значения, я только что протестировал это. Хотя теперь я сталкиваюсь с другой проблемой; просто получается ли значение с плавающей точкой или список, но я попытаюсь решить это самостоятельно. Большое спасибо! Я ценю помощь
5.
image
Функция принимает имя файла (например.dogo.PNG
), загружает файл из папки uploads (например.uploads/dogo.PNG
) и возвращает файл изображения. При загрузкеimages/dogo.PNG
в браузере будет отображаться изображение. Мы используем это дляimg src
атрибута в HTML, посколькуsrc
требуется ссылка на изображение.