帮我写一个用c++下用opencv4.6 dlib19 基于facenet 20170512-110547.pb实现的人脸比对项目
时间: 2023-11-27 07:54:53 浏览: 118
好的,下面是一个简单的用C++、OpenCV 4.6和dlib 19实现的人脸比对项目,使用的是20170512-110547.pb模型。
首先需要安装OpenCV和dlib,可以参考官方文档进行安装。
代码如下:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <dlib/dnn.h>
#include <dlib/data_io.h>
#include <dlib/opencv.h>
using namespace cv;
using namespace dlib;
// 定义Facenet模型
using net_type = loss_metric<fc_no_bias<128,avg_pool_everything<
con<32,5,5,1,1,
relu<bn_con<32,
con<64,3,3,1,1,
relu<bn_con<64,
con<128,3,3,1,1,
relu<bn_con<128,
con<256,3,3,1,1,
relu<bn_con<256,
con<512,3,3,1,1,
relu<bn_con<512,
con<512,3,3,1,1,
relu<bn_con<512,
max_pool<3,3,2,2,
con<32,5,5,1,1,
relu<bn_con<32,
con<64,3,3,1,1,
relu<bn_con<64,
con<128,3,3,1,1,
relu<bn_con<128,
con<256,3,3,1,1,
relu<bn_con<256,
con<512,3,3,1,1,
relu<bn_con<512,
con<512,3,3,1,1,
relu<bn_con<512>>>>>>>>>>>>>>>>>>>>;
int main()
{
// 加载Facenet模型
net_type net;
deserialize("20170512-110547.pb") >> net;
// 读取待比对的两张图片
Mat img1 = imread("face1.jpg");
Mat img2 = imread("face2.jpg");
// 将图片转换为dlib的矩阵类型
matrix<rgb_pixel> dimg1, dimg2;
assign_image(dimg1, cv_image<rgb_pixel>(img1));
assign_image(dimg2, cv_image<rgb_pixel>(img2));
// 将图片输入Facenet模型,获取特征向量
std::vector<matrix<float,0,1>> face_descriptors1 = net(dlib::std_vect<dlib::matrix<rgb_pixel>>({dimg1}));
std::vector<matrix<float,0,1>> face_descriptors2 = net(dlib::std_vect<dlib::matrix<rgb_pixel>>({dimg2}));
// 计算欧几里得距离,判断是否为同一个人
double dist = length(face_descriptors1[0] - face_descriptors2[0]);
if(dist < 0.6)
std::cout << "同一个人" << std::endl;
else
std::cout << "不是同一个人" << std::endl;
return 0;
}
```
需要注意的是,这个模型只能够比对两张人脸图片是否为同一个人,如果需要比对多张图片,可以使用循环进行比对。同时,由于模型参数较大,需要较长时间进行加载。
阅读全文