Обучите линейную модель SVM, чтобы идентифицировать одно лицо, используя OpenCV - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь следовать этому руководству для создания программы на 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()
...