在烧瓶中运行时获取keras模型的值错误-Python 3

时间:2020-05-01 12:29:55

标签: python-3.x opencv flask image-processing keras

我有一个面部识别模型,当将图像传递给它时,无论是作为单独的文件还是摄像头,它都可以正常工作。但是,我将其移至基于浏览器的应用程序,并将网络摄像头图像发送至服务器,这是运行Flask的python代码。

我测试了一下图像是否得到正确处理,然后在其上运行cv2.imread(),效果很好。但是当我通过该图像进行模型预测时,出现了以下错误:

ValueError(“张量%s不是此图的元素。”%obj) ValueError:张量Tensor(“ dense_4 / Softmax:0”,shape =(?, 7), dtype = float32)不是该图的元素。

否则不会发生这种情况,即当我以纯Python代码(从终端而不是作为浏览器应用程序)运行代码时。这是代码:

@app.route('/image',methods=['POST'])
def image():
    json_file = open(f'{model_path}/fer.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    loaded_model = model_from_json(loaded_model_json)
    loaded_model.load_weights(f"{model_path}/fer.h5")
    i=request.files['image']
    f = ('%s.jpeg' % time.strftime("%Y%m%d-%H%M%S"))
    i.save('%s/%s' % (path, f))
    full_size_image = cv2.imread(f"{path}/{f}")
    try:
        gray=cv2.cvtColor(full_size_image,cv2.COLOR_RGB2GRAY)
    except Exception as e:
        gray = full_size_image
    face = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
    faces = face.detectMultiScale(gray, 1.3  , 10)
    artist,track=None,None
    for (x, y, w, h) in faces:
        print("face detected")
        roi_gray = gray[y:y + h, x:x + w]
        cropped_img = np.expand_dims(np.expand_dims(cv2.resize(roi_gray, (48, 48)), -1), 0)
        cv2.normalize(cropped_img, cropped_img, alpha=0, beta=1, norm_type=cv2.NORM_L2, dtype=cv2.CV_32F)   
        yhat= loaded_model.predict(cropped_img) #THIS IS WHERE THE ERROR OCCURS
        break
    return Response("%s saved"%f)

在上面代码中发生错误的行旁边,我已添加了注释。

该功能完全没有更改,只有@app.route部分是新的

如何解决此错误?

1 个答案:

答案 0 :(得分:0)

我在this中找到了一个修复程序,其中说Flask Web请求创建了自己的Tensorflow会话,而不是默认会话,因此您需要使其使用默认会话。

但是,这沿着“容器位置不存在”这一行创建了另一个错误。找到了解决方法here,它与第一个链接中的解决方案相结合,解决了我的问题