人脸识别引擎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 alignmentfor (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 cornersstd::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 imagefor (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 Faceface_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 featureint 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 featureface_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 similarityfloat 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模块使用的测试代码相关推荐

  1. 人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码

    人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点,包括5个点,两个眼的中心.鼻尖.两个嘴角,以下是测试代码: int test_alignment() {std:: ...

  2. 人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码

    人脸识别引擎SeetaFaceEngine中Detection模块用于人脸检测,以下是测试代码: int test_detection() {std::vector<std::string> ...

  3. 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译

    SeetaFaceEngine是开源的C++人脸识别引擎,无需第三方库,它是由中科院计算所山世光老师团队研发.它的License是BSD-2. SeetaFaceEngine库包括三个模块:人脸检测( ...

  4. python开源的人脸识别库_什么是 SeetaFace 开源人脸识别引擎

    区分不同的人是很多智能系统的必备能力.为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人.识别人,即所谓的人脸识别技术.经过几十年的研发积累,特别是近年来深度学习技术的涌现,人脸识别取得了 ...

  5. SeetaFace开源人脸识别引擎

    开源网址 目前,SeetaFace开源人脸识别引擎已全部发布在Github上供国内外同行和工业界使用,项目网址为:https://github.com/seetaface/SeetaFaceEngin ...

  6. 【SeetaFace】中科院山世光老师开源的Seetaface人脸识别引擎测试

    Seetaface发布了第二个版本--Seetaface2: https://github.com/seetaface/SeetaFaceEngine2 SeetaFace2 Engine conta ...

  7. SeetaFace开源人脸识别引擎介绍

    深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动.请关注我们的知乎专栏! 区分不同的人是很多智能系统的必备能力.为实现此目的,一种可能的技术手段是通过对人脸的光学成像来感知人.识 ...

  8. C/C++人脸识别引擎 SeetaFace2打造“刷脸时代”

    SeetaFace2 人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块 FaceDetector.面部关键点定位模块 FaceLandmarker 以及人脸特征提取与比 ...

  9. C# 实现人脸识别一 (运用虹软人脸识别引擎)

    知识背景: 下载虹软人脸识别引擎 下载地址: http://www.arcsoft.com.cn/ai/arcface.html 目前虹软人脸识别引擎有3个平台,其中Windows与iOS是基于C++ ...

最新文章

  1. 《C语言及程序设计》实践项目——画分支结构流程图
  2. Redis-主从复制
  3. Oracle存储使用情况,我收藏的oracle中一些分析空间使用情况的存储过程!
  4. tensorflow-gpu_tensorflow GPU环境安装踩坑日记
  5. 【设计师工具】3个好用的在线配色工具
  6. CCF201612-1 中间数(解法二)(100分)(废除!!!)
  7. python精简总结
  8. 刷新iframe内容
  9. docker swarm集群
  10. android 转场动画 4.4,Android高级UI开发(二十七)Material Design之转场动画(一)
  11. 压缩感知重构算法之OMP算法---python实现
  12. 三星note9刷Android9,三星Note9官方韩版安卓9固件rom线刷刷机包:N960NKSU2CSE3
  13. 解决方案:Android开发基于rtmp视频直播
  14. 大学计算机思维导图_3款免费在线思维导图网站,你一定要收藏一个!
  15. linux下使用PulseAudio获取扬声器的音量和是否静音
  16. 爱加密:终止手游之殇,全面解决手游安全问题
  17. Vue框架中常见的前端UI库
  18. 《23种设计模式之单例模式(4种实现)》
  19. 腾讯音乐知识图谱搜索实践
  20. 盘点Golang测试相关库

热门文章

  1. 基于视频理解TSM和数据集20bn-jester-v1的27类手势识别
  2. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝
  3. OpenCV Mat数据类型及位数总结
  4. LeetCode刷题记录6——696. Count Binary Substrings(easy)
  5. android view设置按钮颜色_Android 主题换肤技术方案分析
  6. CUDA make_float3和make_float4
  7. 分布式一致性(共识)算法(Paxos,raft,ZAB)的一些总结
  8. leetcode-295 数据流的中位数
  9. Effective C++ 1.0 -- 概述
  10. WinCE中串口驱动及接口函数介绍(转载)