faceLandmarks.cpp 3.28 KB
#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;
}