175 lines
4.3 KiB
C++
175 lines
4.3 KiB
C++
// tets_centerface.cpp : 定义控制台应用程序的入口点。
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "Inc/CenterFaceMnn.h"
|
|
#include "Inc/TimeCount.h"
|
|
#include "Inc/LivenessRGB.h"
|
|
#include "Inc/FaceQuality.h"
|
|
#include "Inc/MobileFaceFeatureDnn.h"
|
|
#include "Inc/MobileFaceFeatureMnn.h"
|
|
|
|
float deepcam_face_compare2(std::vector<float> &feature1, std::vector<float> &feature2)
|
|
{
|
|
USE_TIME t("deepcam_face_compare => ");
|
|
if (feature1.size() < 1 || feature1.size() != feature2.size())
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int size = feature1.size();
|
|
float tmp0 = 0, tmp1 = 0, tmp2 = 0;
|
|
for (int i = 0; i < size; i++)
|
|
{
|
|
tmp0 += feature1[i] * feature2[i];
|
|
tmp1 += feature1[i] * feature1[i];
|
|
tmp2 += feature2[i] * feature2[i];
|
|
}
|
|
return (float(tmp0 / (sqrt(tmp1)* sqrt(tmp2))));
|
|
|
|
}
|
|
float deepcam_face_compare(float* feature1, float* feature2)
|
|
{
|
|
USE_TIME t("deepcam_face_compare => ");
|
|
float tmp0 = 0, tmp1 = 0, tmp2 = 0;
|
|
for (int i = 0; i < 512; i++)
|
|
{
|
|
tmp0 += feature1[i] * feature2[i];
|
|
tmp1 += feature1[i] * feature1[i];
|
|
tmp2 += feature2[i] * feature2[i];
|
|
}
|
|
|
|
float score = (float(tmp0 / (sqrt(tmp1)* sqrt(tmp2))));
|
|
//return score;
|
|
//拉高分数
|
|
float max_score = log10f(1.01);
|
|
float min_score = log10f(0.02);
|
|
float ret, temp;
|
|
if (score <= 0) {
|
|
temp = fabs(score);
|
|
if (temp > 0.3) {
|
|
ret = 0.0001;
|
|
}
|
|
else {
|
|
ret = temp;
|
|
}
|
|
}
|
|
else {
|
|
temp = log10f(score + 0.01);
|
|
ret = fabsf(temp - min_score) / (max_score - min_score);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void GetImgFeature(float* feature)
|
|
{
|
|
cv::Mat img;
|
|
img = cv::imread("F:/2.jpg");
|
|
cv::imshow("frame2", img);
|
|
std::vector<FaceInfo> faces;
|
|
CenterFaceMnn::GetInstance()->Detect(img, faces);
|
|
|
|
//std::vector<float> feature;
|
|
|
|
if (faces.size() > 0)
|
|
{
|
|
//std::vector<float> landmark;
|
|
//landmark.insert(landmark.end(), faces[0].landmarks, faces[0].landmarks + sizeof(faces[0].landmarks) / sizeof(float));
|
|
//MobileFaceFeatureDnn::GetInstance()->GetFaceFeature(img, faces[0].landmarks, feature);
|
|
MobileFaceFeatureMnn::GetInstance()->GetFaceFeature(img, faces[0].landmarks, feature);
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
//float ff1[512] = { 0.f };
|
|
// GetImgFeature(ff1);
|
|
|
|
cv::VideoCapture camera1(0);
|
|
//if (!camera1.isOpened())
|
|
// return 1;
|
|
while (true)
|
|
{
|
|
cv::Mat img = cv::imread("F:/1.jpg");;
|
|
//camera1 >> img;
|
|
|
|
std::vector<FaceInfo> faces;
|
|
{
|
|
//USE_TIME T("CenterFaceMnn => ");
|
|
CenterFaceMnn::GetInstance()->Detect(img, faces);
|
|
}
|
|
|
|
if (faces.size() < 1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
for (auto& face : faces)
|
|
{
|
|
float score = 0;
|
|
{
|
|
{
|
|
USE_TIME T("LivenessDetect => ");
|
|
score = LivenessRGB::GetInstance()->LivenessDetect(img, face.landmarks);
|
|
}
|
|
std::cout << "LivenessDetect score ==> " << score << std::endl;
|
|
|
|
/* std::vector<float> landmark;
|
|
landmark.insert(landmark.end(), face.landmarks, face.landmarks + sizeof(face.landmarks) / sizeof(float));*/
|
|
|
|
//std::vector<float> feature;
|
|
float feature[512] = { 0 };
|
|
float feature2[512] = { 0 };
|
|
{
|
|
USE_TIME t("GetFaceFeature => ");
|
|
MobileFaceFeatureMnn::GetInstance()->GetFaceFeature(img, face.landmarks, feature);
|
|
//MobileFaceFeatureDnn::GetInstance()->GetFaceFeature(img, face.landmarks, feature);
|
|
GetImgFeature(feature2);
|
|
}
|
|
std::cout << "cmp ================> " << deepcam_face_compare(feature, feature2) << std::endl;
|
|
|
|
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
cv::circle(img, cv::Point(face.landmarks[i * 2], face.landmarks[i * 2 + 1]), 2, cv::Scalar(0,0,255));
|
|
}
|
|
|
|
|
|
}
|
|
|
|
//std::cout << "score ==> " << score << std::endl;
|
|
auto color = cv::Scalar(0, 0,255);
|
|
if (score > 0.7)
|
|
{
|
|
color = cv::Scalar(0, 255, 0);
|
|
}
|
|
|
|
int qua = 0;
|
|
{
|
|
//USE_TIME t("FaceQuality ");
|
|
qua = FaceQuality::GetInstance()->DetectQuality(img, cv::Rect(cv::Point(face.x1, face.y1), cv::Point(face.x2, face.y2)));
|
|
|
|
cv::Mat pose;
|
|
FaceQuality::GetInstance()->DetectPose(img, cv::Rect(cv::Point(face.x1, face.y1), cv::Point(face.x2, face.y2)), pose);
|
|
|
|
}
|
|
//std::cout << "FaceQua => " << qua << std::endl;
|
|
|
|
cv::putText(img, std::to_string(qua), cv::Point(10, 40), 0, 1, color);
|
|
cv::rectangle(img, cv::Rect(face.x1, face.y1, face.GetWidth(), face.GetHeight()), color, 1);
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
cv::circle(img, cv::Point(face.landmarks[i*2], face.landmarks[i * 2 + 1]), 2, color);
|
|
}
|
|
|
|
cv::imshow("frame", img);
|
|
cv::waitKey(1);
|
|
break;
|
|
}
|
|
cv::imshow("img", img);
|
|
cv::waitKey(1);
|
|
}
|
|
return 0;
|
|
}
|
|
|