// Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include #include #include #include #include #include "paddle_inference_api.h" // NOLINT // MaskDetector Result struct FaceResult { // Detection result: face rectangle std::vector rect; // Detection result: cv::Mat of face rectange cv::Mat roi_rect; // Classification result: confidence float score; // Classification result : class id int class_id; }; // Load Paddle Inference Model void LoadModel( const std::string& model_dir, bool use_gpu, std::unique_ptr* predictor); // Visualiztion MaskDetector results void VisualizeResult(const cv::Mat& img, const std::vector& results, cv::Mat* vis_img); class FaceDetector { public: explicit FaceDetector(const std::string& model_dir, const std::vector& mean, const std::vector& scale, bool use_gpu = false, float threshold = 0.7) : mean_(mean), scale_(scale), threshold_(threshold) { LoadModel(model_dir, use_gpu, &predictor_); } // Run predictor void Predict( const cv::Mat& img, std::vector* result, float shrink); private: // Preprocess image and copy data to input buffer void Preprocess(const cv::Mat& image_mat, float shrink); // Postprocess result void Postprocess( const cv::Mat& raw_mat, float shrink, std::vector* result); std::unique_ptr predictor_; std::vector input_data_; std::vector output_data_; std::vector input_shape_; std::vector mean_; std::vector scale_; float threshold_; }; class MaskClassifier { public: explicit MaskClassifier(const std::string& model_dir, const std::vector& mean, const std::vector& scale, bool use_gpu = false) : mean_(mean), scale_(scale) { LoadModel(model_dir, use_gpu, &predictor_); } void Predict(std::vector* faces); private: void Preprocess(std::vector* faces); void Postprocess(std::vector* faces); std::unique_ptr predictor_; std::vector input_data_; std::vector input_shape_; std::vector output_data_; const std::vector EVAL_CROP_SIZE_ = {3, 128, 128}; std::vector mean_; std::vector scale_; };