Flask对接Inception模型遇TypeError:JpegImageFile对象不可调用
解决Flask对接Inception模型的图片加载与调用问题
嘿,咱们一步步拆解你遇到的问题:先是TypeError: 'JpegImageFile' object is not callable,再是模型没法接收PIL格式的图片,这俩问题其实都有明确的解决方向。
1. 先搞定那个TypeError错误
看你的代码,你从try1导入了obj12,但调用的却是obj2(image)——这十有八九是笔误啊!如果obj2不是你模型的预测函数,反而不小心被赋值成了Image对象,那调用它的时候肯定会触发这个“对象不可调用”的错误。你先检查这两点:
- 打开
try1.py确认模型的预测函数到底叫啥,要是函数名是obj12,那得把代码里的obj2(image)改成obj12(image)。 - 如果
obj2确实是你要调用的函数,那得确保它没被误赋值成其他东西(比如之前测试时把某个Image对象存成了obj2变量)。
2. 让模型能正确“读懂”图片
Inception这类TensorFlow/Keras模型,根本不直接认PIL的JpegImageFile对象,得把图片转换成模型要求的输入格式——一般是带batch维度的归一化numpy数组。给你一套完整的处理流程,直接套进去就行:
改造Flask的upload函数
@app.route("/upload", methods=['GET','POST']) def upload(): file = request.files['file'] # 第一步:加载图片并转成RGB(避免PNG带alpha通道的问题,Inception默认用RGB) image = Image.open(file).convert('RGB') # 第二步:把图片缩放到Inception要求的尺寸(比如InceptionV3是299x299,看你模型版本调整) target_size = (299, 299) image = image.resize(target_size) # 第三步:转成numpy数组,再做模型要求的预处理 import numpy as np img_array = np.array(image) # 这里用Inception官方的预处理函数,和你训练时的预处理保持一致 from tensorflow.keras.applications.inception_v3 import preprocess_input img_array = preprocess_input(img_array) # 第四步:添加batch维度(模型接收的输入是[batch_size, 高, 宽, 通道数]的格式) img_array = np.expand_dims(img_array, axis=0) # 第五步:调用模型预测 count = obj12(img_array) # 这里务必确保obj12是你的模型预测函数 # 第六步:把模型输出转成二值结果(0或1) prediction = 1 if count[0][0] > 0.5 else 0 print(prediction) # Flask返回值得是字符串/响应对象,不能直接返回数字 return str(prediction)
确认模型函数的输入逻辑
你的try1.py里的模型函数得能接收numpy数组,比如要是用Keras加载的模型,代码大概是这样的:
# try1.py示例代码 from tensorflow.keras.models import load_model from tensorflow.keras.applications.inception_v3 import preprocess_input # 加载你训练好的Inception模型 model = load_model('your_trained_model.h5') def obj12(input_array): # 执行预测 result = model.predict(input_array) return result
修复返回值的小问题
你原代码里直接return (count),要是count是数字,Flask会报错的,因为返回值必须是字符串、响应对象这类,所以转成字符串返回就好,比如return str(prediction)。
3. 加个图片格式验证(可选但推荐)
你需要只支持JPG/JPEG,那可以在upload函数开头加个格式校验:
@app.route("/upload", methods=['GET','POST']) def upload(): file = request.files['file'] # 验证文件格式 allowed_extensions = {'jpg', 'jpeg'} filename = file.filename.lower() if not filename.endswith(tuple(allowed_extensions)): return "仅支持JPG/JPEG格式的图片哦", 400 # 后面的图片处理代码...
现在重启Flask服务,上传一张JPG图片试试,应该就能得到正确的0或1结果啦!
内容的提问来源于stack exchange,提问作者Tanishq Bhatia
相关产品推荐
相关产品推荐

