I am trying to write a Python class that applies the VGG-Face recognition algorithm. This class is written in the deepface.py file:
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()
This class inherits a base class, stored in the base.py file:
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()
I tried to run the execute() method of an instance of the VGGClassification class and I get the error message:
AttributeError: The layer sequential has never been called and thus has no defined input.. Did you mean: 'inputs'?
The full traceback is:
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'?
I cannot figure out what I am doing wrong. Can you help me?
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744919651a4601053.html
评论列表(0条)