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

报错:'Sequential'对象无'_call_spec'属性,求解决方法

解决'Sequential' object has no attribute '_call_spec'错误

问题重现

运行代码时触发错误:'Sequential' object has no attribute '_call_spec',最初使用model.predict_classes(img)获取分类索引,替换为np.argmax(model.predict(img))后问题仍未解决,相关代码如下:

import numpy as np
import cv2
import pickle

width = 640
height = 480
threshold = 0.80

cap = cv2.VideoCapture(0)
cap.set(3, width)
cap.set(4, height)

pickle_in = open("model_trained_10.p", "rb")
model = pickle.load(pickle_in)

def preProcessing(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.equalizeHist(img)
    img = img/255
    return img

while True:
    success, imgOriginal = cap.read()
    img = np.asarray(imgOriginal)
    img = cv2.resize(img, (32,32))
    img = preProcessing(img)
    cv2.imshow("Processed Image", img)
    img = img.reshape(1,32,32)
    print(model)
    # predict
    classIndex = np.argmax(model.predict(img))

    predictions = model.predict(img)
    probVal = np.amax(predictions)
    print(classIndex,probVal)

    if probVal> cv2.threshold:
        cv2.putText(imgOriginal, str(classIndex) + "  " + str(probVal), (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 1)

    cv2.imshow("Original Image", imgOriginal)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

错误原因

这个错误的核心问题是用pickle直接序列化Keras模型的方式不正确。Keras/TensorFlow模型内部包含大量复杂的层结构和调用规范(比如_call_spec),pickle无法完整保存这些属性,导致加载后的模型缺失关键组件,调用predict时触发错误。

另外代码里还有两个隐藏问题:

  1. 输入维度不匹配:预处理后的灰度图是(32,32),reshape成(1,32,32),但多数图像分类模型期望的输入是**(batch_size, height, width, channels)**,灰度图的channels=1,所以维度应该是(1,32,32,1)
  2. 条件判断错误:probVal> cv2.threshold里的cv2.threshold是OpenCV的阈值函数,应该用你自己定义的threshold变量,否则会引发类型错误

解决方案

  1. 重新用正确方式保存模型
    如果你还能拿到训练好的模型,执行以下代码重新保存:

    # 训练完成后保存模型(TensorFlow 2.x推荐方式)
    model.save("model_trained_10.h5")
    # 或者用SavedModel格式
    # model.save("model_trained_10")
    
  2. 用Keras内置方法加载模型
    替换原代码中pickle加载模型的部分:

    from tensorflow.keras.models import load_model
    
    # 加载h5格式模型
    model = load_model("model_trained_10.h5")
    # 如果用SavedModel格式,直接传文件夹路径
    # model = load_model("model_trained_10")
    
  3. 修正输入维度
    将img = img.reshape(1,32,32)修改为:

    img = img.reshape(1,32,32,1)
    
  4. 修正条件判断变量
    将if probVal> cv2.threshold:改为:

    if probVal > threshold:
    

修正后的完整代码

import numpy as np
import cv2
from tensorflow.keras.models import load_model

width = 640
height = 480
threshold = 0.80

cap = cv2.VideoCapture(0)
cap.set(3, width)
cap.set(4, height)

# 改用load_model加载模型
model = load_model("model_trained_10.h5")

def preProcessing(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.equalizeHist(img)
    img = img/255
    return img

while True:
    success, imgOriginal = cap.read()
    if not success:
        break
    img = np.asarray(imgOriginal)
    img = cv2.resize(img, (32,32))
    img = preProcessing(img)
    cv2.imshow("Processed Image", img)
    # 修正输入维度
    img = img.reshape(1,32,32,1)
    
    # 获取预测结果
    predictions = model.predict(img)
    classIndex = np.argmax(predictions)
    probVal = np.amax(predictions)
    print(classIndex, probVal)

    # 修正阈值变量引用
    if probVal > threshold:
        cv2.putText(imgOriginal, f"{classIndex}  {probVal:.2f}", (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2)

    cv2.imshow("Original Image", imgOriginal)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Mohammed Abdou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:22:47