人脸识别引擎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
随机推荐
- Redux 源码解读 —— 从源码开始学 Redux
已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ...
- JavaScript的DOM_通过计算后样式来获取
虽然可以通过 style 来获取单一值的 CSS 样式,但对于复合值的样式信息,就需要通过计算样式来获取. DOM2 级样式,window 对象下提供了 getComputedStyle()方法.接受 ...
- Guava包学习--EventBus
之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...
- 关于Mysql查询varchar类型错误问题
因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型. 如我的一张表ID为varchar(18) ...
- 【[ZJOI2012]灾难】
好像很久之前就看过这道题,大概是刚学\(LCA\)的时候 之后当时肯定是不会的呀 现在发现这道题并不是非常难 首先我们发现这个灭绝的关系非常像一棵树,我们建出这个灭绝树求一个前缀和就可以啦 那么应该怎 ...
- [TEST123] Performance Test
https://blog.csdn.net/zhouping19851013/article/details/82870789 https://www.cnblogs.com/jackei/archi ...
- Java性能监控
Java性能监控 上次介绍了如何使用jvisualvm监控java,今天做进一步讲解!Java性能监控主要关注CPU.内存和线程. 在线程页中,点击线程Dump,可以生成threaddump日志,通过 ...
- 基于MySql数据库的单表与多表联合查询
这里以学生 班级 身份证 以及课程为例 1,启动MySql数据库 开启服务 2.1.0新建一张班级表 备注:CHARSET = UTF8 (指定编码格式为utf8 防止中文乱码) /*班级表*/ C ...
- JavaScript互斥锁案例
朋友今天问起来关于JS中多个函数共享同一个全局变量时,顺序调用执行的函数,前者修改了全局变量值,后调用的函数访问时却为undefined. 前不久开发项目过程中,队友也遇到了同样的问题,索性就写份博客 ...
- 关于keil不同容量和不同引脚大小的编译以及下载出错问题
如果遇到这个问题一般可能有四个原因(以STM32F103C8T6为例) 1.芯片型号没有选对 2.startup文件可能没有选对,startup文件常用的分为3种,startup_stm32f10x_ ...