使用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实现仍在使用该属性。
具体修复步骤
- 降级DeepFace版本
安装兼容旧版Keras API的DeepFace版本,比如0.0.79:
pip install deepface==0.0.79
- 修正图像数据格式
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)
- 可选:批量处理优化
循环调用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
相关产品推荐
相关产品推荐

