faceLandmarks.cpp
3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "faceLandmarks.h"
vector<vector<float>> FaceLandmarks::detect_landmarks(std::string image_path){
Mat input_data_=cv::imread(image_path);
float w_r=float(input_data_.cols)/112.0f;
float h_r=float(input_data_.rows)/112.0f;
Mat input_data;
cv::resize(input_data_,input_data,Size2d(112,112));
input_data.convertTo(input_data, CV_32F);
input_data = input_data /256.0f;
std::vector<std::vector<cv::Mat>> nChannels;
std::vector<cv::Mat> rgbChannels(3);
cv::split(input_data, rgbChannels);
nChannels.push_back(rgbChannels); // NHWC 转NCHW
auto *pvData = malloc(1 * 3 * 112 * 112 *sizeof(float));
int nPlaneSize = 112 * 112;
for (int c = 0; c < 3; ++c)
{
cv::Mat matPlane = nChannels[0][c];
memcpy((float *)(pvData) + c * nPlaneSize,\
matPlane.data, nPlaneSize * sizeof(float));
}
auto inTensor = net->getSessionInput(session, NULL);
net->resizeTensor(inTensor, {1, 3, 112,112});
net->resizeSession(session);
auto nchwTensor = new Tensor(inTensor, Tensor::CAFFE);
::memcpy(nchwTensor->host<float>(), pvData, nPlaneSize * 3 * sizeof(float));
inTensor->copyFromHostTensor(nchwTensor);
// //推理
net->runSession(session);
auto output= net->getSessionOutput(session, NULL);
MNN::Tensor feat_tensor(output, output->getDimensionType());
output->copyToHostTensor(&feat_tensor);
vector<vector<float>> landmarks;
for(int idx =0;idx<106;++idx){
float x_= *(feat_tensor.host<float>()+2*idx)*w_r;
float y_= *(feat_tensor.host<float>()+2*idx+1)*h_r;
vector<float> tmp={x_,y_};
landmarks.push_back(tmp);
}
return landmarks;
}
vector<vector<float>> FaceLandmarks::detect_image_landmarks(Mat image){
Mat input_data_=image;
float w_r=float(input_data_.cols)/112.0f;
float h_r=float(input_data_.rows)/112.0f;
Mat input_data;
cv::resize(input_data_,input_data,Size2d(112,112));
input_data.convertTo(input_data, CV_32F);
input_data = input_data /256.0f;
std::vector<std::vector<cv::Mat>> nChannels;
std::vector<cv::Mat> rgbChannels(3);
cv::split(input_data, rgbChannels);
nChannels.push_back(rgbChannels); // NHWC 转NCHW
auto *pvData = malloc(1 * 3 * 112 * 112 *sizeof(float));
int nPlaneSize = 112 * 112;
for (int c = 0; c < 3; ++c)
{
cv::Mat matPlane = nChannels[0][c];
memcpy((float *)(pvData) + c * nPlaneSize,\
matPlane.data, nPlaneSize * sizeof(float));
}
auto inTensor = net->getSessionInput(session, NULL);
net->resizeTensor(inTensor, {1, 3, 112,112});
net->resizeSession(session);
auto nchwTensor = new Tensor(inTensor, Tensor::CAFFE);
::memcpy(nchwTensor->host<float>(), pvData, nPlaneSize * 3 * sizeof(float));
inTensor->copyFromHostTensor(nchwTensor);
// //推理
net->runSession(session);
auto output= net->getSessionOutput(session, NULL);
MNN::Tensor feat_tensor(output, output->getDimensionType());
output->copyToHostTensor(&feat_tensor);
vector<vector<float>> landmarks;
for(int idx =0;idx<106;++idx){
float x_= *(feat_tensor.host<float>()+2*idx)*w_r;
float y_= *(feat_tensor.host<float>()+2*idx+1)*h_r;
vector<float> tmp={x_,y_};
landmarks.push_back(tmp);
}
return landmarks;
}