Blame view

3rdparty/opencv-4.5.4/samples/dnn/face_match.cpp 3.11 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  // This file is part of OpenCV project.
  // It is subject to the license terms in the LICENSE file found in the top-level directory
  // of this distribution and at http://opencv.org/license.html.
  
  #include "opencv2/dnn.hpp"
  #include "opencv2/imgproc.hpp"
  #include "opencv2/highgui.hpp"
  
  #include <iostream>
  
  #include "opencv2/objdetect.hpp"
  
  
  using namespace cv;
  using namespace std;
  
  
  int main(int argc, char ** argv)
  {
      if (argc != 5)
      {
          std::cerr << "Usage " << argv[0] << ": "
                    << "<det_onnx_path> "
                    << "<reg_onnx_path> "
                    << "<image1>"
                    << "<image2>\n";
          return -1;
      }
  
      String det_onnx_path = argv[1];
      String reg_onnx_path = argv[2];
      String image1_path = argv[3];
      String image2_path = argv[4];
      std::cout<<image1_path<<" "<<image2_path<<std::endl;
      Mat image1 = imread(image1_path);
      Mat image2 = imread(image2_path);
  
      float score_thresh = 0.9f;
      float nms_thresh = 0.3f;
      double cosine_similar_thresh = 0.363;
      double l2norm_similar_thresh = 1.128;
      int top_k = 5000;
  
      // Initialize FaceDetector
      Ptr<FaceDetectorYN> faceDetector;
  
      faceDetector = FaceDetectorYN::create(det_onnx_path, "", image1.size(), score_thresh, nms_thresh, top_k);
      Mat faces_1;
      faceDetector->detect(image1, faces_1);
      if (faces_1.rows < 1)
      {
          std::cerr << "Cannot find a face in " << image1_path << "\n";
          return -1;
      }
  
      faceDetector = FaceDetectorYN::create(det_onnx_path, "", image2.size(), score_thresh, nms_thresh, top_k);
      Mat faces_2;
      faceDetector->detect(image2, faces_2);
      if (faces_2.rows < 1)
      {
          std::cerr << "Cannot find a face in " << image2_path << "\n";
          return -1;
      }
  
      // Initialize FaceRecognizerSF
      Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(reg_onnx_path, "");
  
  
      Mat aligned_face1, aligned_face2;
      faceRecognizer->alignCrop(image1, faces_1.row(0), aligned_face1);
      faceRecognizer->alignCrop(image2, faces_2.row(0), aligned_face2);
  
      Mat feature1, feature2;
      faceRecognizer->feature(aligned_face1, feature1);
      feature1 = feature1.clone();
      faceRecognizer->feature(aligned_face2, feature2);
      feature2 = feature2.clone();
  
      double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE);
      double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2);
  
      if(cos_score >= cosine_similar_thresh)
      {
          std::cout << "They have the same identity;";
      }
      else
      {
          std::cout << "They have different identities;";
      }
      std::cout << " Cosine Similarity: " << cos_score << ", threshold: " << cosine_similar_thresh << ". (higher value means higher similarity, max 1.0)\n";
  
      if(L2_score <= l2norm_similar_thresh)
      {
          std::cout << "They have the same identity;";
      }
      else
      {
          std::cout << "They have different identities.";
      }
      std::cout << " NormL2 Distance: " << L2_score << ", threshold: " << l2norm_similar_thresh << ". (lower value means higher similarity, min 0.0)\n";
  
      return 0;
  }