如何解决“至少需要两个类才能执行LDA”?

问题描述 投票:0回答:2

我正在尝试使用 OpenCV 运行 this 示例,但运行它:

./facerec_video haarcascade_frontalface_alt.xml csv_align -1  

给了我这个错误:

OpenCV 错误:参数错误(执行 LDA 至少需要两个类。原因:仅给出一个类!)在 lda 中,文件 /build/buildd/opencv-2.4.8+dfsg1/modules/contrib/src/ lda.cpp,第 1010 行 抛出“cv::Exception”实例后调用终止 What(): /build/buildd/opencv-2.4.8+dfsg1/modules/contrib/src/lda.cpp:1010: error: (-5) 至少需要两个类来执行 LDA。原因:只上了一节课!在函数lda

如何解决?

Ps.:xml是标准的OpenCV,csv是带有2张图片的样本

c++ opencv ubuntu face-recognition
2个回答
0
投票

我遇到了同样的问题,我解决了将 csv.ext 文件更改为这种样式的问题:

C:\Users sb\Desktop\image1_20_20_70_70.jpg;0 C:\Users sb\Desktop ace_20_20_70_70.jpg;1

检查您的文件是否符合此要求,然后重试。


0
投票

出现您遇到的错误是因为 FisherFace 方法使用线性判别分析 (LDA),它需要至少两类数据才能执行训练。在面部识别的背景下,这意味着您需要拥有至少两个不同的人或同一个人在不同条件下(例如,戴口罩和不戴口罩)的图像。

如何解决问题 当迭代图像列表以捕获面值和 ID 时,请确保捕获多个 ID(即多个类)。以下是如何执行此操作的示例:

def get_image_with_id():
    paths = [f for f in list_images]
    faces = []
    ids = []
    for path in paths:
        imageFace = cv.cvtColor(cv.imread(os.path.join(dir_images_dest, path)), cv.COLOR_BGR2GRAY)  # Apply grayscale
        id = int(os.path.split(path)[-1].split('.')[1])  # Get the ID from the image name
        ids.append(id)
        faces.append(imageFace)
    return np.array(ids), np.array(faces, dtype=np.uint8)

ids, faces = get_image_with_id()

注意:图像的命名应使其 ID 反映类别,例如,1 表示“无遮罩”,2 表示“有遮罩”。

验证数据 在训练模型之前,您可以检查您是否收集了多个类别:

print(set(ids))  # Should show at least two different IDs

重命名文件以创建类 如果您需要从现有文件中人为地创建更多类,您可以使用如下命令:

for i in {1..25}; do mv "person.1.person.$i.jpg" "person.2.person.$i.jpg"; done

此命令重命名一个人的图像以模拟不同的类别。根据需要调整文件名以表示您想要区分的条件(例如,“无掩码”与“有掩码”)。

© www.soinside.com 2019 - 2024. All rights reserved.