Я обновляю изображение, отправленное методом post, используя cv2 в бэкэнде колбы.
Затем, когда я пытаюсь сохранить это изображение с помощью cv2.imwrite () в путь внутри флеш-сервера и затем отправить этот путь как ответ image-src обратно, он не может найти файл. Я также пытался преобразовать версию opencv Изображение в подушку на основе изображения, а затем сохранить его на сервере колбы, но также не удалось. Я в основном хочу знать, как я могу сохранить изображение с помощью cv2 / pillow внутри бэкэнда колбы и использовать этот URL в качестве источника изображения для рендеринга в передней части. конец.
Мой код ниже:
# import the necessary packages
from PIL import Image
import numpy as np
import flask
import io
import base64
from flask import request, render_template, Flask
import cv2
from keras.models import model_from_json
import re, os
import uuid
# initialize our Flask application and the Keras model
model = None
full_path = None
def create_app():
app = Flask(__name__)
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
app.config["UPLOAD_FOLDER"]=os.path.join(APP_ROOT,"uploads")
def load_model():
print("hello")
global model
# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
# load weights into new model
model.load_weights("model.h5")
print("Loaded model from disk")
model.compile(loss='categorical_crossentropy',
optimizer="rmsprop",
metrics=['accuracy'])
load_model()
return app
app = create_app()
def do_prediction(im):
global full_path
label_map = ["Angry", "Fear", "Happy",
"Sad", "Surprise", "Neutral"]
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
print(im)
face_cascade = cv2.CascadeClassifier("cascade_frontface.xml")
faces = face_cascade.detectMultiScale(gray, 1.2, 3, minSize=(80, 80))
print(len(faces))
font = cv2.FONT_HERSHEY_SIMPLEX
for (x, y, w, h) in faces:
cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0), 2, 5)
face_crop = im[y:y + h, x:x + w]
face_crop = cv2.resize(face_crop, (48, 48))
face_crop = cv2.cvtColor(face_crop, cv2.COLOR_BGR2GRAY)
face_crop = face_crop.astype('float32') / 255.0
face_crop = np.asarray(face_crop)
face_crop = face_crop.reshape(
1, face_crop.shape[0], face_crop.shape[1], 1)
result = label_map[np.argmax(model.predict(face_crop))]
cv2.putText(im, result, (x, y), font, 2, (200, 0, 0), 3, cv2.LINE_AA)
random_value = str(uuid.uuid4())
new_image = random_value + ".jpg"
if not os.path.isdir(app.config["UPLOAD_FOLDER"]):
os.mkdir(app.config["UPLOAD_FOLDER"])
full_path = os.path.join(app.config['UPLOAD_FOLDER'], new_image)
# cv2.imshow("image",im)
# cv2.imwrite(full_path, im)
# predicted_image = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
pil_image=cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
updated_image = Image.fromarray(pil_image, mode='RGB')
print("converted to pil")
print(updated_image)
updated_image.save(full_path,'JPEG')
@app.route("/", methods=["GET"])
def index():
return render_template("predict.html")
@app.route("/predict", methods=["POST"])
def predict():
# initialize the data dictionary that will be returned from the
# view
data = {"success": False}
message = request.get_json(force=True)
encoded = message["image"]
encoded = re.sub('^data:image/.+;base64,', '', encoded)
decoded = base64.b64decode(encoded)
image = Image.open(io.BytesIO(decoded))
open_cv_image = cv2.cvtColor(np.array(image),cv2.COLOR_RGB2BGR)
# # Convert RGB to BGR
# open_cv_image = open_cv_image[:, :, ::-1].copy()
print(open_cv_image)
# classify the input image and then initialize the list
# of predictions to return to the client
do_prediction(open_cv_image)
# indicate that the request was a success
data["success"] = True
data["image"] = full_path
# return the data dictionary as a JSON response
return flask.jsonify(data)
if __name__ == "__main__":
app.run()