人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Identification模块用于比较两幅人脸图像的相似度,以下是测试代码:
int test_recognize()
{
const std::string path_images{ "E:/GitCode/Face_Test/testdata/recognization/" };
seeta::FaceDetection detector("E:/GitCode/Face_Test/src/SeetaFaceEngine/FaceDetection/model/seeta_fd_frontal_v1.0.bin");
seeta::FaceAlignment alignment("E:/GitCode/Face_Test/src/SeetaFaceEngine/FaceAlignment/model/seeta_fa_v1.1.bin");
seeta::FaceIdentification face_recognizer("E:/GitCode/Face_Test/src/SeetaFaceEngine/FaceIdentification/model/seeta_fr_v1.0.bin");
detector.SetMinFaceSize(20);
detector.SetMaxFaceSize(200);
detector.SetScoreThresh(2.f);
detector.SetImagePyramidScaleFactor(0.8f);
detector.SetWindowStep(4, 4);
std::vector<std::vector<seeta::FacialLandmark>> landmards;
// detect and alignment
for (int i = 0; i < 20; i++) {
std::string image = path_images + std::to_string(i) + ".jpg";
//fprintf(stderr, "start process image: %s\n", image.c_str());
cv::Mat src_ = cv::imread(image, 1);
if (src_.empty()) {
fprintf(stderr, "read image error: %s\n", image.c_str());
continue;
}
cv::Mat src;
cv::cvtColor(src_, src, CV_BGR2GRAY);
seeta::ImageData img_data;
img_data.data = src.data;
img_data.width = src.cols;
img_data.height = src.rows;
img_data.num_channels = 1;
std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);
if (faces.size() == 0) {
fprintf(stderr, "%s don't detect face\n", image.c_str());
continue;
}
// Detect 5 facial landmarks: two eye centers, nose tip and two mouth corners
std::vector<seeta::FacialLandmark> landmard(5);
alignment.PointDetectLandmarks(img_data, faces[0], &landmard[0]);
landmards.push_back(landmard);
cv::rectangle(src_, cv::Rect(faces[0].bbox.x, faces[0].bbox.y,
faces[0].bbox.width, faces[0].bbox.height), cv::Scalar(0, 255, 0), 2);
for (auto point : landmard) {
cv::circle(src_, cv::Point(point.x, point.y), 2, cv::Scalar(0, 0, 255), 2);
}
std::string save_result = path_images + "_" + std::to_string(i) + ".jpg";
cv::imwrite(save_result, src_);
}
int width = 200;
int height = 200;
cv::Mat dst(height * 5, width * 4, CV_8UC3);
for (int i = 0; i < 20; i++) {
std::string input_image = path_images + "_" + std::to_string(i) + ".jpg";
cv::Mat src = cv::imread(input_image, 1);
if (src.empty()) {
fprintf(stderr, "read image error: %s\n", input_image.c_str());
return -1;
}
cv::resize(src, src, cv::Size(width, height), 0, 0, 4);
int x = (i * width) % (width * 4);
int y = (i / 4) * height;
cv::Mat part = dst(cv::Rect(x, y, width, height));
src.copyTo(part);
}
std::string output_image = path_images + "result_alignment.png";
cv::imwrite(output_image, dst);
// crop image
for (int i = 0; i < 20; i++) {
std::string image = path_images + std::to_string(i) + ".jpg";
//fprintf(stderr, "start process image: %s\n", image.c_str());
cv::Mat src_img = cv::imread(image, 1);
if (src_img.data == nullptr) {
fprintf(stderr, "Load image error: %s\n", image.c_str());
return -1;
}
if (face_recognizer.crop_channels() != src_img.channels()) {
fprintf(stderr, "channels dismatch: %d, %d\n", face_recognizer.crop_channels(), src_img.channels());
return -1;
}
// ImageData store data of an image without memory alignment.
seeta::ImageData src_img_data(src_img.cols, src_img.rows, src_img.channels());
src_img_data.data = src_img.data;
// Create a image to store crop face.
cv::Mat dst_img(face_recognizer.crop_height(), face_recognizer.crop_width(), CV_8UC(face_recognizer.crop_channels()));
seeta::ImageData dst_img_data(dst_img.cols, dst_img.rows, dst_img.channels());
dst_img_data.data = dst_img.data;
// Crop Face
face_recognizer.CropFace(src_img_data, &landmards[i][0], dst_img_data);
std::string save_image_name = path_images + "crop_" + std::to_string(i) + ".jpg";
cv::imwrite(save_image_name, dst_img);
}
dst = cv::Mat(height * 5, width * 4, CV_8UC3);
for (int i = 0; i < 20; i++) {
std::string input_image = path_images + "crop_" + std::to_string(i) + ".jpg";
cv::Mat src_img = cv::imread(input_image, 1);
if (src_img.empty()) {
fprintf(stderr, "read image error: %s\n", input_image.c_str());
return -1;
}
cv::resize(src_img, src_img, cv::Size(width, height), 0, 0, 4);
int x = (i * width) % (width * 4);
int y = (i / 4) * height;
cv::Mat part = dst(cv::Rect(x, y, width, height));
src_img.copyTo(part);
}
output_image = path_images + "result_crop.png";
cv::imwrite(output_image, dst);
// extract feature
int feat_size = face_recognizer.feature_size();
if (feat_size != 2048) {
fprintf(stderr, "feature size mismatch: %d\n", feat_size);
return -1;
}
float* feat_sdk = new float[feat_size * 20];
for (int i = 0; i < 20; i++) {
std::string input_image = path_images + "crop_" + std::to_string(i) + ".jpg";
cv::Mat src_img = cv::imread(input_image, 1);
if (src_img.empty()) {
fprintf(stderr, "read image error: %s\n", input_image.c_str());
return -1;
}
cv::resize(src_img, src_img, cv::Size(face_recognizer.crop_height(), face_recognizer.crop_width()));
// ImageData store data of an image without memory alignment.
seeta::ImageData src_img_data(src_img.cols, src_img.rows, src_img.channels());
src_img_data.data = src_img.data;
// Extract feature
face_recognizer.ExtractFeature(src_img_data, feat_sdk + i * feat_size);
}
float* feat1 = feat_sdk;
// varify(recognize)
for (int i = 1; i < 20; i++) {
std::string image = std::to_string(i) + ".jpg";
float* feat_other = feat_sdk + i * feat_size;
// Caculate similarity
float sim = face_recognizer.CalcSimilarity(feat1, feat_other);
fprintf(stdout, "0.jpg -- %s similarity: %f\n", image.c_str(), sim);
}
delete[] feat_sdk;
return 0;
}
从网上找了20张图像,前19张为周星驰,最后一张为汤唯,用于测试此模块,测试结果如下:
detect/alignment结果如下:
crop结果如下:
取上图中最左上图为标准图,与其它19幅图作验证,测试结果如下:
GitHub:https://github.com/fengbingchun/Face_Test
人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码的更多相关文章
- 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点,包括5个点,两个眼的中心.鼻尖.两个嘴角,以下是测试代码: int test_alignment() { std: ...
- 人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码
人脸识别引擎SeetaFaceEngine中Detection模块用于人脸检测,以下是测试代码: int test_detection() { std::vector<std::string&g ...
- 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译
SeetaFaceEngine是开源的C++人脸识别引擎,无需第三方库,它是由中科院计算所山世光老师团队研发.它的License是BSD-2. SeetaFaceEngine库包括三个模块:人脸检测( ...
- 【计算机视觉】SeetaFace Engine开源C++人脸识别引擎
SeetaFace Engine是一个开源的C++人脸识别引擎,它可以在不依赖第三方的条件下载CPU上运行.他包含三个关键部分,即:SeetaFace Detection,SeetaFace Alig ...
- Android打开相机进行人脸识别,使用虹软人脸识别引擎
上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄.性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开 ...
- 教你如何认识人脸识别开发套件中的双目摄像、3D结构光摄像头、单目摄像头的区别及详细讲解
深圳市宁远电子提供的人脸识别模组可支持双目摄像头和3D结构光摄像头,在客户咨询中经常有被问到双目的为什么会比单目的成本高,区别在哪里,他们的适用于哪些场景呢?在此,深圳市宁远电子技术工程师就为大家详细 ...
- 关于人脸识别引擎FaceRecognitionDotNet的实例
根据我上篇文章的分享,我提到了FaceRecognitionDotNet,它是python语言开发的一个项目face_recognition移植.结果真是有喜有忧,喜的是很多去关注了,进行了下载,我看 ...
- 人脸识别引擎SeetaFace编译 ubuntu
00.SeetaFace简介 SeetaFace Engine is an open source C++ face recognition engine, which can run on CPU ...
- .NET的关于人脸识别引擎分享(C#)
https://www.cnblogs.com/RainbowInTheSky/p/10247921.html
随机推荐
- 打包工具的核心原理(转自:https://juejin.im/entry/5b223ebd518825748b569bda)
打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具.与此同时,打包工具也会处理好模块之间的依赖关系,最终这个大模块将可以被运行在合适的平台中. 打包工具会从一个入口文件开始,分析 ...
- python一键对应多个值
背景:目前是想让一个取出来的数据,数据有2个或多个值,对应一个key,或者这样说:让一个键对应2个值或者3个值 实现方式,如下:目前我以读取xml文件为案例,读取xml中两个配置文件,存放到一个key ...
- 解决 mongodb $in needs an array 问题
问题现象: 在mongodb执行批量查询操作时,抛出异常 Exception 2: $in needs an array. 问题解决: 感谢伟大的 google 和 stackoverflow 有人遇 ...
- 用firefox的插件下载网页中的视频
对于网页中的一些视频,直接下载不了,可以用专用下载软件下载,也可以用firefox的NetVideohunter Video Downloader插件下载网页中的视频,方便快捷. 工具/原料 fi ...
- Apollo深度磁盘清理
摘要 在Apollo的使用过程中,会出现磁盘空间不足的情况,Apollo的官方提供的方法是删除apollo/data/log或者删除apollo/data/bag文件.但是即使删除了这些,磁盘空间并没 ...
- pathinfo
location ~ \.php { fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_p ...
- 【Step By Step】将Dotnet Core部署到Docker上
本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会). 一.在Docker中运行Dot ...
- Gradle Goodness: Automatic Clean Tasks
Gradle adds the task rule clean<Taskname> to our projects when we apply the base plugin. This ...
- vue 路由缓存 路由嵌套 路由守卫 监听物理返回
最近开发vue项目,遇到的一些问题,这里整合一下,看到一些博客已经有写相关知识,然后自己再次记录一下. 这是关于vue路由相关比较常见的问题,以后遇到相关路由的问题,会不断更新这篇博客. 需求1:从填 ...
- Unity 4.7 导出工程在XCode10.1上编译报错
Unity 4.7 导出工程在XCode 10.1上编译报错,而在XCode 9.3上是可以正常编译运行的.原因是Unity4.7所依赖的头文件和库文件在XCode10上没有了,解决办法如下,把XCo ...