Warm tip: This article is reproduced from serverfault.com, please click

python-输入变量的Keras Tensorflow和Open CV错误

(python - Keras Tensorflow and Open CV Error for Input Variable)

发布于 2020-11-28 23:31:53

接收到ValueError:sequence_14层的输入0与以下层不兼容::预期的min_ndim = 4,找到的ndim = 3。收到完整的形状:[无,48,3]

尽管我刚刚打印的图像形状是正确的尺寸(48、48、3)

我已经尝试了batch_input_shape与(none,48,48,3

我的喀拉拉邦模型:

model = Sequential([
        Conv2D(filters=32,kernel_size=(3,3), activation='relu', padding = 'same', input_shape=(48, 48, 3),
        MaxPool2D(pool_size=(2, 2), strides=2),
        Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding = 'same'),
        MaxPool2D(pool_size=(2, 2), strides=2),
        Flatten(),
        Dense(units=2, activation='softmax'),
])

模型设定Python

from keras.models import load_model
new_model = load_model('/home/user/Downloads/filehere.h5')
new_model.summary()

class trueoruntruemodel(object):

    options = ["true", "untrue"]

    def __init__(self, new_model):
        self.loaded_model = new_model

    def predict_true(self, img):
        self.preds = self.loaded_model.predict(img)
        return trueoruntruemodel.options[np.argmax(self.preds)]


相机设置文件

import cv2
from modelsetup import trueoruntruemodel
from modelsetup import new_model
import numpy as np
model = trueoruntruemodel(new_model)
font = cv2.FONT_HERSHEY_SIMPLEX

class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(0)

    def __del__(self):
        self.video.release()

    def get_frame(self):
        _, fr = self.video.read()
        print(fr.shape)
        roi = cv2.resize(fr, (48, 48))
        print(roi.shape) # this is coming out correctly as 48,48,3
        pred = model.predict_true(roi)
        cv2.putText(fr, pred, (x,y), font, 1, (46, 46, 0), 2)

        _, jpeg = cv2.imencode('.jpg', fr)
        return jpeg.tobytes()

Flask 流文件

from flask import Flask, render_template, Response
from Camera import VideoCamera

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

def gen(camera):
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
Questioner
Stackaccount1
Viewed
0
maciek97x 2020-11-29 07:39:08

你应该传递一个批处理而不是roiis的单个输入形状(48,48,3),但应该是(_,48,48,3)实现它的一种方法是使用numpy.expand_dims

pred = model.predict_true(np.expand_dims(roi, axis=0))