сохраните изображение на базе pil или cv2 внутри колб-сервера, а затем предоставьте этот URL для рендеринга изображений в интерфейсе - PullRequest
0 голосов
/ 22 марта 2019

Я обновляю изображение, отправленное методом 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...