如何紧固Knn算法进行实时人脸识别

Posted

技术标签:

【中文标题】如何紧固Knn算法进行实时人脸识别【英文标题】:How to Fasten Knn Algorithm for face recognition in real time 【发布时间】:2021-08-02 14:52:59 【问题描述】:

我正在做人脸检测和识别方面的工作,我想实时检测人脸,

但是到了训练的时候,训练需要很长时间

数据是否有可能减少训练数据的时间任何人都可以帮助

解决这个问题

'''

def train(train_dir, model_save_path=None, n_neighbors=None, knn_algo='ball_tree', verbose=False):
    
    X = []
    y = []

    # Loop through each person in the training set
    for class_dir in tqdm(os.listdir(train_dir)):

        if not os.path.isdir(os.path.join(train_dir, class_dir)):
            continue

        # Loop through each training image for the current person
        for img_path in image_files_in_folder(os.path.join(train_dir, class_dir)):
            image = face_recognition.load_image_file(img_path)
            face_bounding_boxes = face_recognition.face_locations(image)

            if len(face_bounding_boxes) != 1:
                # If there are no people (or too many people) in a training image, skip the image.
                if verbose:
                    print("Image  not suitable for training: ".format(img_path, "Didn't find a face" if len(face_bounding_boxes) < 1 else "Found more than one face"))
            else:
                # Add face encoding for current image to the training set
                X.append(face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)[0])
                y.append(class_dir.split('_')[0])

    # Determine how many neighbors to use for weighting in the KNN classifier
    if n_neighbors is None:
        n_neighbors = int(round(math.sqrt(len(X))))
        if verbose:
            print("Chose n_neighbors automatically:", n_neighbors)

    # Create and train the KNN classifier
    knn_clf = neighbors.KNeighborsClassifier(n_neighbors=n_neighbors, algorithm=knn_algo, weights='distance')
    print(knn_clf)
    knn_clf.fit(X, y)

    # Save the trained KNN classifier
    if model_save_path is not None:
        with open(model_save_path, 'wb') as f:
            pickle.dump(knn_clf, f)

    return knn_clf

'''

这是最后的电话

'''

def trainer():
    # STEP 1: Train the KNN classifier and save it to disk
    # Once the model is trained and saved, you can skip this step next time.
    print("Training KNN classifier...")
    classifier = train("app/facerec/dataset", model_save_path="app/facerec/models/trained_model.clf", n_neighbors=3)
    print("Training complete!")

'''

还想知道是否有任何可能性,而不是重写“trained_model.clf”文件,我们可以更新该文件。

【问题讨论】:

你在使用 Scikit-learn for KNN 吗? 是的@KnowledgeGainer 训练时间通常取决于数据集的大小,而且 KNN 不使用任何 GPU,因此与基于 GPU 的框架相比,通常需要时间。我可以知道您用于训练的数据集的大小吗? 实际上数据集包含特定文件夹的图像至少 15 张图像,就像添加用户数量时,没有类似图像的文件夹增加 如果我做对了,那么你的意思是说,随着用户的增加,它会不断增加,每个用户都有自己的 15 张图像,对吧? 【参考方案1】:

训练 kNN 模型不应带来高昂的运行时开销。毕竟,直接(“精确搜索”)模型是懒惰的。它存储向量并在查询(或分类)时执行暴力搜索。

我推测嵌入计算会支配你的训练时间。

正如@johncasey 所提到的,您可能想要使用近似kNN 模型(或similarity search 引擎)。有许多开源相似性搜索库。然而,如果您需要一个可用于生产的、强大的、实时的、高效的解决方案,那么您应该查看pinecone.io。 (免责声明,我为 Pinecone 工作。)

【讨论】:

【参考方案2】:

k-nn 算法的时间复杂度为 O(n)。我建议您使用近似最近邻 (a-nn) 算法。它的时间复杂度太低了。例如,谷歌图片搜索就是基于这种算法。

Spotify annoy、Facebook faiss、nmslib 是一个-nn 库。

【讨论】:

以上是关于如何紧固Knn算法进行实时人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

如何使用地标点识别人脸?

OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)

如何在没有训练的情况下识别人脸

识别人脸face_recognition实现

人脸识别人脸识别损失函数学习笔记

人脸识别 介绍