Я пытаюсь следовать этому руководству для создания программы на Python, распознающей лица в видеопотоке и идентифицирующей те, для которых была обучена модель глубокого обучения.
Эта программа в конечном итоге будет использоваться в качестве своего рода аутентификации (я понимаю, что она не будет безопасной) для приложения, которое я создаю, в котором пользователь сначала будет делать их снимки. используя их веб-камеру, а затем эти изображения будут использоваться для обучения модели глубокого обучения для идентификации этого пользователя при открытии программы для аутентификации.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что на шаге № 2В этом уроке я должен обучить линейную модель SVM для идентификации пользователя, но я не могу обучить модель машинного обучения с использованием одного класса. Тогда у меня вопрос: как мне обучить модель машинного обучения распознавать первого пользователя приложения, поскольку в наборе данных лиц будет только одно лицо? Это означает, что при создании LabelEncoder()
будет только одна метка, и вызов SVC.fit()
вызовет сбой:
ValueError: The number of classes has to be greater than one; got 1 class
Вот мой файл train_model.py
, который содержит соответствующее обучениеалгоритмы:
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
import common
import data_handler
def train_and_save(facial_embeddings_database: str= common.EMBEDDINGS_LOC, output_file: str = common.RECOGNITION_DATABASE_LOC) -> None:
"""
Trains the database using the given facial embeddings database and outputs the results to file.
:param facial_embeddings_database: The facial embedding database location.
:param output_file: The file location for the output of the database.
:return: None
"""
database = data_handler.load_database(facial_embeddings_database)
data_handler.write_database(output_file, train_model(database))
def train_model(facial_embeddings: dict) -> SVC:
"""
Trains the model for the given database
:param facial_embeddings_database: The location of the pickle database.
:param output_file: File location where to output the pickle database of facial recognitions.
:return:
"""
label_encoder = LabelEncoder()
X = []
for user_id, encodings in facial_embeddings.items():
X.extend([user_id for x in range(len(encodings))])
# The facial_embeddings
labels = label_encoder.fit_transform(X)
recognizer = SVC(C=1.0, kernel="linear", probability=True)
# TODO not too sure this line does what is intended.
# THIS IS WHAT FAILS WHEN I ONLY HAVE ONE LABEL
recognizer.fit(data_handler.get_encodings_in_database(facial_embeddings), labels)
return recognizer
if __name__ == "__main__":
train_and_save()