You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:31:47