人脸识别引擎SeetaFaceEngine中Identification模块使用的测试代码
2024-09-09 18:06:24
人脸识别引擎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
最新文章
- Smart3D系列教程6之 《案例实战演练3——倾斜数据正射影像及DSM的生产》
- JavaScript方法call、apply、caller、callee、bind的使用详解及区别
- sys,os,模块-正则表达式
- pyqt4:在线程Qthread中使用定时器Qtimer
- JsTree
- 转-sql中的case when的用法
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
- core java 7 exception
- 剑指Offer32 丑数
- c程序设计语言_习题8-6_利用malloc()函数,重新实现c语言的库函数calloc()
- suse系统卸载数据库实例
- C#创建和初始化类
- Hibernate锁机制
- PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
- 通过ajax返回值
- 微信小程序之wx.showmodal
- AndroidStudio制作欢迎界面与应用图标
- Azure SQL Database (22) Azure SQL Database支持中文值
- css-使不同大小的图片在固定大小的容器中居中
- poj_3321 线段树/树状数组
热门文章
- 激活pycharm
- UVa 10900 - So you want to be a 2n-aire?(期望DP)
- Linux下utf-8 BOM 的检查和删除 (65279错误解决办法)
- 贪心——HDU-5969 最大的位或
- PM2 部署 nodejs 项目
- Vue学习—组件的学习
- 分享cropper剪切单张图片demo
- 生成Html 测试报告
- tomcat启动超时, Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds...
- iOS:Masonry约束经验(19-03-21更)