dlib 使用 ResNet 做人脸比对的c++例子
时间: 2023-11-28 10:48:46 浏览: 166
下面是使用 dlib 和 ResNet 实现人脸比对的 C++ 代码示例:
```cpp
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_processing.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/dnn.h>
#include <iostream>
using namespace dlib;
using namespace std;
// 加载人脸检测器
frontal_face_detector detector = get_frontal_face_detector();
// 人脸关键点检测器
shape_predictor sp;
// ResNet 神经网络模型
anet_type net;
// 提取人脸特征向量
std::vector<float> face_embedding(const matrix<rgb_pixel>& face_chip)
{
auto face_descriptor = net(face_chip);
std::vector<float> face_embedding;
for (int i = 0; i < 128; ++i)
face_embedding.push_back(face_descriptor(i));
return face_embedding;
}
// 计算两个特征向量的欧氏距离
double distance(const std::vector<float>& face_embedding1, const std::vector<float>& face_embedding2)
{
double distance = 0;
for (int i = 0; i < 128; ++i)
distance += (face_embedding1[i] - face_embedding2[i]) * (face_embedding1[i] - face_embedding2[i]);
return sqrt(distance);
}
int main()
{
// 加载人脸关键点检测器
deserialize("shape_predictor_5_face_landmarks.dat") >> sp;
// 加载 ResNet 神经网络模型
deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net;
// 加载两张人脸图片
matrix<rgb_pixel> img1, img2;
load_image(img1, "face1.jpg");
load_image(img2, "face2.jpg");
// 检测人脸
std::vector<rectangle> dets1 = detector(img1);
std::vector<rectangle> dets2 = detector(img2);
if (dets1.size() == 0 || dets2.size() == 0)
{
cout << "未检测到人脸" << endl;
return 0;
}
// 提取第一张人脸的特征向量
auto shape1 = sp(img1, dets1[0]);
matrix<rgb_pixel> face_chip1;
extract_image_chip(img1, get_face_chip_details(shape1, 150, 0.25), face_chip1);
std::vector<float> face_embedding1 = face_embedding(face_chip1);
// 提取第二张人脸的特征向量
auto shape2 = sp(img2, dets2[0]);
matrix<rgb_pixel> face_chip2;
extract_image_chip(img2, get_face_chip_details(shape2, 150, 0.25), face_chip2);
std::vector<float> face_embedding2 = face_embedding(face_chip2);
// 计算两个特征向量的欧氏距离
double dist = distance(face_embedding1, face_embedding2);
cout << "两张人脸的相似度为:" << (1 - dist) << endl;
return 0;
}
```
在上面的代码中,我们使用了 dlib 中的 frontal_face_detector 进行人脸检测,使用 shape_predictor 进行人脸关键点检测,使用 dlib_face_recognition_resnet_model_v1.dat 中的 ResNet 模型进行人脸特征向量提取,然后计算两个特征向量的欧氏距离,最终得到两张人脸的相似度。
阅读全文