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

使用DeepFace的VGG-Face算法报错:sequential层未定义输入

使用DeepFace VGG-Face时的AttributeError问题解决

问题背景

我编写了基于VGG-Face的人脸分类类VGGClassification(存于deepface.py),继承自base.py中的Base类,用于处理LFW数据集。运行execute()方法时触发了如下错误。

deepface.py代码

import cv2
import numpy as np
from deepface import DeepFace
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC

from base import Base


class VGGClassification(Base):
    def __init__(self):
        super().__init__()
        self.X_rgb = None
        self.y_encoded = None
        self.X_train = None
        self.X_test = None
        self.y_train = None
        self.y_test = None
        self.clf = None

    def preprocess_images(self):
        self.X_rgb = np.array([
            cv2.resize(cv2.cvtColor(img.reshape(self.h, self.w), cv2.COLOR_GRAY2RGB), (224, 224))
            for img in self.X
        ])

    def encode_labels(self):
        encoder = LabelEncoder()
        self.y_encoded = encoder.fit_transform(self.y)

    def split_data(self):
        self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(self.X_rgb, self.y_encoded,
                                                                                test_size=0.2, random_state=42,
                                                                                stratify=self.y_encoded)

    def extract_embeddings(self, images):
        return np.array([
            DeepFace.represent(img_path=img, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
            for img in images
        ])

    def train_model(self):
        X_train_embedded = self.extract_embeddings(self.X_train)
        X_test_embedded = self.extract_embeddings(self.X_test)
        self.clf = SVC(kernel='linear', probability=True)
        self.clf.fit(X_train_embedded, self.y_train)

        y_pred = self.clf.predict(X_test_embedded)
        print(classification_report(self.y_test, y_pred, target_names=self.target_names))

    def execute(self):
        super().execute()
        self.preprocess_images()
        self.encode_labels()
        self.split_data()
        self.train_model()

base.py代码

import os
from sklearn.datasets import fetch_lfw_people


class Base:

    def __init__(self):
        """Initializes the Base object with default values."""
        self.n_samples = 0
        self.h = 0
        self.w = 0
        self.X = None
        self.n_features = 0
        self.y = None
        self.target_names = None
        self.n_classes = 0

    def load_data(self):
        """
        Loads the LFW dataset and extracts its attributes.

        Returns:
            tuple: (X, y, n_samples, n_classes, n_features)
        """
        lfw_people = fetch_lfw_people(data_home=os.getcwd(), min_faces_per_person=70, resize=0.4)
        self.n_samples, self.h, self.w = lfw_people.images.shape
        self.X = lfw_people.data
        self.n_features = self.X.shape[1]

        self.y = lfw_people.target
        self.target_names = lfw_people.target_names
        self.n_classes = self.target_names.shape[0]

    def print_load_results(self):
        """
        Prints the total dataset size, including the number of samples, features, and classes.
        """
        print('Total dataset size: ')
        print(f'n_samples: {self.n_samples}')
        print(f'n_features: {self.n_features}')
        print(f'n_classes: {self.n_classes}')

    def execute(self):
        self.load_data()
        self.print_load_results()

报错信息

AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'inputs'?

完整回溯:

Traceback (most recent call last):
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\main.py", line 22, in <module>
    vgg_class.execute()
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 59, in execute
    self.train_model()
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 46, in train_model
    X_train_embedded = self.extract_embeddings(self.X_train)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\vgg_deepface.py", line 41, in extract_embeddings
    DeepFace.represent(img_path=np.array(img), model_name='VGG-Face', enforce_detection=False)[0]['embedding']
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\DeepFace.py", line 418, in represent
    return representation.represent(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\modules\representation.py", line 68, in represent
    model: FacialRecognition = modeling.build_model(
                               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\modules\modeling.py", line 96, in build_model
    cached_models[task][model_name] = model()
                                      ^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\models\facial_recognition\VGGFace.py", line 45, in __init__
    self.model = load_model()
                 ^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\deepface\models\facial_recognition\VGGFace.py", line 158, in load_model
    vgg_face_descriptor = Model(inputs=model.input, outputs=base_model_output)
                                       ^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\keras\src\ops\operation.py", line 268, in input
    return self._get_node_attribute_at_index(0, "input_tensors", "input")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\alexz\OneDrive\Uni stuff\Articole\Articol Cristina 2\Python\.venv\Lib\site-packages\keras\src\ops\operation.py", line 299, in _get_node_attribute_at_index
    raise AttributeError(
AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'inputs'?

问题原因与解决方法

这个错误是DeepFace与新版Keras/TensorFlow的兼容性问题:新版Keras中,未被调用过的Sequential模型无法直接访问.input属性,但DeepFace的VGG-Face实现仍在使用该属性。

具体修复步骤

  1. 降级DeepFace版本
    安装兼容旧版Keras API的DeepFace版本,比如0.0.79:
pip install deepface==0.0.79
  1. 修正图像数据格式
    LFW数据集的X是归一化后的浮点型数据,需要转为uint8类型(像素值0-255)才能被DeepFace正确处理,修改preprocess_images方法:
def preprocess_images(self):
    self.X_rgb = np.array([
        cv2.resize(cv2.cvtColor(img.reshape(self.h, self.w).astype(np.uint8), cv2.COLOR_GRAY2RGB), (224, 224))
        for img in self.X
    ]).astype(np.uint8)
  1. 可选:批量处理优化
    循环调用DeepFace.represent会重复加载模型,效率低下。可以提前构建模型,再批量处理图像:
def extract_embeddings(self, images):
    embeddings = []
    # 提前构建模型,避免重复加载
    model = DeepFace.build_model('VGG-Face')
    for img in images:
        embedding = DeepFace.represent(img_path=img, model_name='VGG-Face', model=model, enforce_detection=False)[0]['embedding']
        embeddings.append(embedding)
    return np.array(embeddings)

内容的提问来源于stack exchange,提问作者Bogdan Doicin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:57:02