Skip to content

求助,Object-c版本,任意两个人脸得到的值都是一致的,麻烦帮忙看一下,谢谢 #287

Closed
@mzhs-git

Description

#250 根据这个人遇到同样的问题,我在代码中克隆了特征值,依然没有解决问题。

检测模型:face_detection_yunet_2023mar
识别模型:face_recognition_sface_2021dec
库版本:4.10.0

对比代码

  • (BOOL)isSamePersonWithImage1:(UIImage *)image1 image2:(UIImage *)image2 :(UIImageView *)iv1 :(UIImageView *)iv2{
    // 将 UIImage 转换为 cv::Mat
    cv::Mat cvImage1, cvImage2;
    UIImageToMat(image1, cvImage1);
    UIImageToMat(image2, cvImage2);

    // 将 4 通道的 RGBA 图像转换为 3 通道的 RGB 图像
    cv::Mat rgbImage1;
    cvtColor(cvImage1, rgbImage1, cv::COLOR_RGBA2RGB);
    if (rgbImage1.empty()) {
    NSLog(@"rgbImage1 is empty!");
    }
    // 将 4 通道的 RGBA 图像转换为 3 通道的 RGB 图像
    cv::Mat rgbImage2;
    cvtColor(cvImage2, rgbImage2, cv::COLOR_RGBA2RGB);
    if (rgbImage2.empty()) {
    NSLog(@"rgbImage2 is empty!");
    }

    // 检测第一张图片中的人脸
    cv::Mat faces1;
    _faceDetector->setInputSize(cv::Size(image1.size.width,image1.size.height));
    _faceDetector->detect(rgbImage1, faces1);
    if (faces1.rows < 1) {
    return NO; // 未检测到人脸
    }

    // 检测第二张图片中的人脸
    cv::Mat faces2;
    _faceDetector->setInputSize(cv::Size(image2.size.width,image2.size.height));
    _faceDetector->detect(rgbImage2, faces2);
    if (faces2.rows < 1) {
    return NO; // 未检测到人脸
    }

    // 对齐和裁剪人脸
    cv::Mat alignedFace1, alignedFace2;
    _faceRecognizer->alignCrop(rgbImage1, faces1.row(0), alignedFace1);
    _faceRecognizer->alignCrop(rgbImage2, faces2.row(0), alignedFace2);
    std::cout << "Rect1: " << faces1.row(0) << std::endl;
    std::cout << "Rect2: " << faces2.row(0) << std::endl;
    MAIN(^{
    iv1.image=MatToUIImage(alignedFace1);
    iv2.image=MatToUIImage(alignedFace2);
    });
    // 提取特征
    cv::Mat feature1;
    cv::Mat feature2;
    _faceRecognizer->feature(alignedFace1, feature1);
    _faceRecognizer->feature(alignedFace2, feature2);
    cv::Mat feature11=feature1.clone();
    cv::Mat feature22=feature2.clone();

    // 比较两个 Mat 是否完全一致
    cv::Mat result = (feature11 == feature22);
    int nonZeroCount = cv::countNonZero(result);

    if (nonZeroCount == feature11.total()) {
    std::cout << "两个 Mat 完全一致" << std::endl;
    } else {
    std::cout << "两个 Mat 不完全一致" << std::endl;
    }

// std::cout << "Feature1: " << feature1<< std::endl;
// std::cout << "Feature2: " << feature2<< std::endl;

// 计算相似度
double cosScore = _faceRecognizer->match(feature11,feature22, cv::FaceRecognizerSF::FR_COSINE);
double l2Score = _faceRecognizer->match(feature11, feature22, cv::FaceRecognizerSF::FR_NORM_L2);

// 判断是否为同一个人
//严格判断是同一个人cosineSimilarThresh=0.4 l2NormSimilarThresh=1 //两张脸非常相似

//宽松判断是同一个人cosineSimilarThresh=0.3 l2NormSimilarThresh=1.2 //两张脸不太相似也可能判断是一个人

double cosineSimilarThresh = 0.4; // 相似度阈值 值范围0~1越高越严格
double l2NormSimilarThresh = 1.0; // 距离阈值 值范围0~正无穷 越低越严格
NSLog(@"余弦距离:%.2f 欧几里得距离:%.2f",cosScore,l2Score);
return (cosScore >= cosineSimilarThresh) && (l2Score <= l2NormSimilarThresh);

}

Image

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    questionIt is not an issue but rather a user question

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions