c7e48e8e by 乔峰昇

the first submit

0 parents
1
2 opencv4.5.5
3
4 模型初始化
5
6 FaceRecognize face_rec=FaceRecognize(det_model_path,landm_model_path,rec_model_path)
7
8 det_model_path:人脸检测模型retinaface的onnx模型路径
9 landm_model_path:106人脸关键点模型的onnx模型路径
10 rec_model_path:人脸识别模型的onnx模型路径
11
12 重要参数(.h文件)
13
14 bool use_gpu=true; //是否使用gpu
15 float confidence_threshold = 0.5; //人脸检测阈值
16 float nms_threshold = 0.4; //nms阈值
17 double face_recongnize_thr = 0.2; //人脸相似度阈值
18
19 接口(返回结果 bool:true/false)
20
21 bool face_recognize(string image1_path,string image2_path);参数为两张图像地址,其中iamge1_path为face_id图像输入
22 bool face_recognize_image(Mat image1,Mat image2);参数为两张opencv读取的图像矩阵,其中iamge1为face_id图像输入
23
24 编译
25
26 g++ main.cpp -L . -lfacerecognize -o main
27 如果报错无法找到改用:g++ main.cpp -L . -lfacerecognize -o main pkg-config --libs --cflags opencv4
28 ./main
No preview for this file type
No preview for this file type
1 #ifndef FACERECOGNIZE_H
2 #define FACERECOGNIZE_H
3 #include<opencv2/opencv.hpp>
4
5 using namespace std;
6 using namespace cv;
7 struct Bbox{
8 float xmin;
9 float ymin;
10 float xmax;
11 float ymax;
12 float score;
13 float x1;
14 float y1;
15 float x2;
16 float y2;
17 float x3;
18 float y3;
19 float x4;
20 float y4;
21 float x5;
22 float y5;
23 };
24 class FaceRecognize{
25
26 private:
27 //是否使用gpu?
28 bool use_gpu=true;
29
30 //人脸检测
31 vector<float> input_size={640,640};
32 vector<float> variances={0.1,0.2};
33 vector<float> mean_data={104,117,128};
34 float confidence_threshold = 0.5; //人脸检测阈值
35 float keep_top_k = 100;
36 float vis_threshold = 0.5;
37 float nms_threshold = 0.4;
38 float resize_scale = 1.0;
39 bool is_bbox_process=true; //人脸外扩
40
41 //人脸识别
42 double face_recongnize_thr = 0.2; //人脸相似度阈值
43 cv::dnn::Net det_net,landm_net,rec_net;
44
45
46 public:
47 FaceRecognize();
48 FaceRecognize(string face_det_model_path,string face_landm_model_path,string face_rec_model_path){
49 det_net = cv::dnn::readNetFromONNX(face_det_model_path);
50 landm_net = cv::dnn::readNetFromONNX(face_landm_model_path);
51 rec_net = cv::dnn::readNetFromONNX(face_rec_model_path);
52 if(use_gpu){
53 det_net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
54 det_net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
55 landm_net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
56 landm_net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
57 rec_net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
58 rec_net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
59 }
60
61 }
62 //人脸检测部分
63 vector<vector<float>> priorBox(vector<float> image_size);
64 vector<Bbox> decode(vector<vector<float>> loc,vector<vector<float>> score,vector<vector<float>>pre,vector<vector<float>> priors,vector<float> variances);
65 void nms_cpu(std::vector<Bbox> &bboxes, float threshold);
66 vector<vector<float>> mat2vector(Mat mat);
67 vector<Bbox> select_score(vector<Bbox> bboxes,float threshold,float w_r,float h_r);
68 vector<Bbox> bbox_process(vector<Bbox> bboxes,float frame_w,float frame_h);
69 vector<Bbox> detect(string image_path);
70 vector<Bbox> detect_image(Mat image);
71
72
73 //人脸关键点部分
74 vector<vector<float>> detect_landmarks(string image_path);
75 vector<vector<float>> detect_image_landmarks(cv::Mat image);
76
77
78 //人脸识部分
79 cv::Mat meanAxis0(const cv::Mat &src);
80 cv::Mat elementwiseMinus(const cv::Mat &A,const cv::Mat &B);
81 cv::Mat varAxis0(const cv::Mat &src);
82 int MatrixRank(cv::Mat M);
83 cv::Mat similarTransform(cv::Mat src,cv::Mat dst);
84 Mat preprocess_face(Mat image,vector<vector<float>> land);
85 double getMold(const vector<double>& vec);
86 double cos_distance(const vector<double>& base, const vector<double>& target);
87 double get_samilar(Mat image1,Mat image2);
88
89
90 //整体
91 bool face_recognize(string image1_path,string image2_path);
92 bool face_recognize_image(Mat image1,Mat image2);
93 };
94
95
96 #endif
...\ No newline at end of file ...\ No newline at end of file
No preview for this file type
No preview for this file type
1 #include"facerecognize.h"
2 #include "ctime"
3
4 int main(){
5 FaceRecognize face_rec=FaceRecognize("/home/situ/qfs/sdk_project/mobile_face_recognize/det_face_retina_torch_1.4_v0.0.2.onnx","/home/situ/qfs/sdk_project/mobile_face_recognize/det_landmarks_106_v0.0.1.onnx","/home/situ/qfs/sdk_project/mobile_face_recognize/ms1mv3_r18.onnx");
6 clock_t start, end;
7 cv::Mat image1=cv::imread("/data/face_recognize/pipeline_test/59297ec0094211ecaf3d00163e514671/310faceImageContent163029410817774.jpg");
8 cv::Mat image2=cv::imread("/data/face_recognize/pipeline_test/59297ec0094211ecaf3d00163e514671/310cardImageContent163029410836583.jpg");
9 cout<<"start"<<endl;
10 start = clock();
11 bool result=face_rec.face_recognize_image(image1,image2);
12 end = clock();
13 double elapsedTime = static_cast<double>(end-start) / CLOCKS_PER_SEC ;
14
15 printf("PROCESSING TIME: %f",elapsedTime);
16
17 }
This file is too large to display.
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!