diff --git a/inference/utils/seg_conf_parser.h b/inference/utils/seg_conf_parser.h index 5af7cd9debe66de4cc84627ba2917ca977c575d7..b1e40ff84bf0ac9e4e932875b341ee9741efb4ff 100644 --- a/inference/utils/seg_conf_parser.h +++ b/inference/utils/seg_conf_parser.h @@ -4,7 +4,7 @@ // 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 +// 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, @@ -12,168 +12,167 @@ // See the License for the specific language governing permissions and // limitations under the License. -#pragma once -#include -#include -#include - -#include -namespace PaddleSolution { - - class PaddleSegModelConfigPaser { - public: - PaddleSegModelConfigPaser() - :_class_num(0), - _channels(0), - _use_gpu(0), - _batch_size(1), - _model_file_name("__model__"), - _param_file_name("__params__") { - } - ~PaddleSegModelConfigPaser() { - } - - void reset() { - _resize.clear(); - _mean.clear(); - _std.clear(); - _img_type.clear(); - _class_num = 0; - _channels = 0; - _use_gpu = 0; - _batch_size = 1; - _model_file_name.clear(); - _model_path.clear(); - _param_file_name.clear(); - } - - std::string process_parenthesis(const std::string& str) { - if (str.size() < 2) { - return str; - } - std::string nstr(str); - if (str[0] == '(' && str.back() == ')') { - nstr[0] = '['; - nstr[str.size() - 1] = ']'; - } - return nstr; - } - - template - std::vector parse_str_to_vec(const std::string& str) { - std::vector data; - auto node = YAML::Load(str); - for (const auto& item : node) { - data.push_back(item.as()); - } - return data; - } - - bool load_config(const std::string& conf_file) { - - reset(); - - YAML::Node config = YAML::LoadFile(conf_file); - // 1. get resize - auto str = config["DEPLOY"]["EVAL_CROP_SIZE"].as(); - _resize = parse_str_to_vec(process_parenthesis(str)); - - // 2. get mean - for (const auto& item : config["DEPLOY"]["MEAN"]) { - _mean.push_back(item.as()); - } - - // 3. get std - for (const auto& item : config["DEPLOY"]["STD"]) { - _std.push_back(item.as()); - } - - // 4. get image type - _img_type = config["DEPLOY"]["IMAGE_TYPE"].as(); - // 5. get class number - _class_num = config["DEPLOY"]["NUM_CLASSES"].as(); - // 7. set model path - _model_path = config["DEPLOY"]["MODEL_PATH"].as(); - // 8. get model file_name - _model_file_name = config["DEPLOY"]["MODEL_FILENAME"].as(); - // 9. get model param file name - _param_file_name = config["DEPLOY"]["PARAMS_FILENAME"].as(); - // 10. get pre_processor - _pre_processor = config["DEPLOY"]["PRE_PROCESSOR"].as(); - // 11. use_gpu - _use_gpu = config["DEPLOY"]["USE_GPU"].as(); - // 12. predictor_mode - _predictor_mode = config["DEPLOY"]["PREDICTOR_MODE"].as(); - // 13. batch_size - _batch_size = config["DEPLOY"]["BATCH_SIZE"].as(); - // 14. channels - _channels = config["DEPLOY"]["CHANNELS"].as(); - return true; - } - - void debug() const { - - std::cout << "EVAL_CROP_SIZE: (" << _resize[0] << ", " << _resize[1] << ")" << std::endl; - - std::cout << "MEAN: ["; - for (int i = 0; i < _mean.size(); ++i) { - if (i != _mean.size() - 1) { - std::cout << _mean[i] << ", "; - } else { - std::cout << _mean[i]; - } - } - std::cout << "]" << std::endl; - - std::cout << "STD: ["; - for (int i = 0; i < _std.size(); ++i) { - if (i != _std.size() - 1) { - std::cout << _std[i] << ", "; - } - else { - std::cout << _std[i]; - } - } - std::cout << "]" << std::endl; - - std::cout << "DEPLOY.IMAGE_TYPE: " << _img_type << std::endl; - std::cout << "DEPLOY.NUM_CLASSES: " << _class_num << std::endl; - std::cout << "DEPLOY.CHANNELS: " << _channels << std::endl; - std::cout << "DEPLOY.MODEL_PATH: " << _model_path << std::endl; - std::cout << "DEPLOY.MODEL_FILENAME: " << _model_file_name << std::endl; - std::cout << "DEPLOY.PARAMS_FILENAME: " << _param_file_name << std::endl; - std::cout << "DEPLOY.PRE_PROCESSOR: " << _pre_processor << std::endl; - std::cout << "DEPLOY.USE_GPU: " << _use_gpu << std::endl; - std::cout << "DEPLOY.PREDICTOR_MODE: " << _predictor_mode << std::endl; - std::cout << "DEPLOY.BATCH_SIZE: " << _batch_size << std::endl; - } - - // DEPLOY.EVAL_CROP_SIZE - std::vector _resize; - // DEPLOY.MEAN - std::vector _mean; - // DEPLOY.STD - std::vector _std; - // DEPLOY.IMAGE_TYPE - std::string _img_type; - // DEPLOY.NUM_CLASSES - int _class_num; - // DEPLOY.CHANNELS - int _channels; - // DEPLOY.MODEL_PATH - std::string _model_path; - // DEPLOY.MODEL_FILENAME - std::string _model_file_name; - // DEPLOY.PARAMS_FILENAME - std::string _param_file_name; - // DEPLOY.PRE_PROCESSOR - std::string _pre_processor; - // DEPLOY.USE_GPU - int _use_gpu; - // DEPLOY.PREDICTOR_MODE - std::string _predictor_mode; - // DEPLOY.BATCH_SIZE - int _batch_size; - }; - -} +#pragma once +#include +#include +#include +#include + +namespace PaddleSolution { +class PaddleSegModelConfigPaser { + public: + PaddleSegModelConfigPaser() + :_class_num(0), + _channels(0), + _use_gpu(0), + _batch_size(1), + _model_file_name("__model__"), + _param_file_name("__params__") { + } + ~PaddleSegModelConfigPaser() { + } + + void reset() { + _resize.clear(); + _mean.clear(); + _std.clear(); + _img_type.clear(); + _class_num = 0; + _channels = 0; + _use_gpu = 0; + _batch_size = 1; + _model_file_name.clear(); + _model_path.clear(); + _param_file_name.clear(); + } + + std::string process_parenthesis(const std::string& str) { + if (str.size() < 2) { + return str; + } + std::string nstr(str); + if (str[0] == '(' && str.back() == ')') { + nstr[0] = '['; + nstr[str.size() - 1] = ']'; + } + return nstr; + } + + template + std::vector parse_str_to_vec(const std::string& str) { + std::vector data; + auto node = YAML::Load(str); + for (const auto& item : node) { + data.push_back(item.as()); + } + return data; + } + + bool load_config(const std::string& conf_file) { + reset(); + + YAML::Node config = YAML::LoadFile(conf_file); + // 1. get resize + auto str = config["DEPLOY"]["EVAL_CROP_SIZE"].as(); + _resize = parse_str_to_vec(process_parenthesis(str)); + + // 2. get mean + for (const auto& item : config["DEPLOY"]["MEAN"]) { + _mean.push_back(item.as()); + } + + // 3. get std + for (const auto& item : config["DEPLOY"]["STD"]) { + _std.push_back(item.as()); + } + + // 4. get image type + _img_type = config["DEPLOY"]["IMAGE_TYPE"].as(); + // 5. get class number + _class_num = config["DEPLOY"]["NUM_CLASSES"].as(); + // 7. set model path + _model_path = config["DEPLOY"]["MODEL_PATH"].as(); + // 8. get model file_name + _model_file_name = config["DEPLOY"]["MODEL_FILENAME"].as(); + // 9. get model param file name + _param_file_name = + config["DEPLOY"]["PARAMS_FILENAME"].as(); + // 10. get pre_processor + _pre_processor = config["DEPLOY"]["PRE_PROCESSOR"].as(); + // 11. use_gpu + _use_gpu = config["DEPLOY"]["USE_GPU"].as(); + // 12. predictor_mode + _predictor_mode = config["DEPLOY"]["PREDICTOR_MODE"].as(); + // 13. batch_size + _batch_size = config["DEPLOY"]["BATCH_SIZE"].as(); + // 14. channels + _channels = config["DEPLOY"]["CHANNELS"].as(); + return true; + } + + void debug() const { + std::cout << "EVAL_CROP_SIZE: (" + << _resize[0] << ", " << _resize[1] + << ")" << std::endl; + std::cout << "MEAN: ["; + for (int i = 0; i < _mean.size(); ++i) { + if (i != _mean.size() - 1) { + std::cout << _mean[i] << ", "; + } else { + std::cout << _mean[i]; + } + } + std::cout << "]" << std::endl; + + std::cout << "STD: ["; + for (int i = 0; i < _std.size(); ++i) { + if (i != _std.size() - 1) { + std::cout << _std[i] << ", "; + } else { + std::cout << _std[i]; + } + } + std::cout << "]" << std::endl; + + std::cout << "DEPLOY.IMAGE_TYPE: " << _img_type << std::endl; + std::cout << "DEPLOY.NUM_CLASSES: " << _class_num << std::endl; + std::cout << "DEPLOY.CHANNELS: " << _channels << std::endl; + std::cout << "DEPLOY.MODEL_PATH: " << _model_path << std::endl; + std::cout << "DEPLOY.MODEL_FILENAME: " << _model_file_name << std::endl; + std::cout << "DEPLOY.PARAMS_FILENAME: " + << _param_file_name << std::endl; + std::cout << "DEPLOY.PRE_PROCESSOR: " << _pre_processor << std::endl; + std::cout << "DEPLOY.USE_GPU: " << _use_gpu << std::endl; + std::cout << "DEPLOY.PREDICTOR_MODE: " << _predictor_mode << std::endl; + std::cout << "DEPLOY.BATCH_SIZE: " << _batch_size << std::endl; + } + + // DEPLOY.EVAL_CROP_SIZE + std::vector _resize; + // DEPLOY.MEAN + std::vector _mean; + // DEPLOY.STD + std::vector _std; + // DEPLOY.IMAGE_TYPE + std::string _img_type; + // DEPLOY.NUM_CLASSES + int _class_num; + // DEPLOY.CHANNELS + int _channels; + // DEPLOY.MODEL_PATH + std::string _model_path; + // DEPLOY.MODEL_FILENAME + std::string _model_file_name; + // DEPLOY.PARAMS_FILENAME + std::string _param_file_name; + // DEPLOY.PRE_PROCESSOR + std::string _pre_processor; + // DEPLOY.USE_GPU + int _use_gpu; + // DEPLOY.PREDICTOR_MODE + std::string _predictor_mode; + // DEPLOY.BATCH_SIZE + int _batch_size; +}; + +} // namespace PaddleSolution diff --git a/inference/utils/utils.h b/inference/utils/utils.h index b730f23827ccb76110c866189bf20a2d5aa4873c..7e322daa03c02e704509f032d5709684a341060f 100644 --- a/inference/utils/utils.h +++ b/inference/utils/utils.h @@ -4,7 +4,7 @@ // 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 +// 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, @@ -30,105 +30,110 @@ #endif namespace PaddleSolution { - namespace utils { - inline std::string path_join(const std::string& dir, const std::string& path) { - std::string seperator = "/"; - #ifdef _WIN32 - seperator = "\\"; - #endif - return dir + seperator + path; +namespace utils { + inline std::string path_join(const std::string& dir, + const std::string& path) { + std::string seperator = "/"; + #ifdef _WIN32 + seperator = "\\"; + #endif + return dir + seperator + path; + } + #ifndef _WIN32 + // scan a directory and get all files with input extensions + inline std::vector get_directory_images( + const std::string& path, const std::string& exts) { + std::vector imgs; + struct dirent *entry; + DIR *dir = opendir(path.c_str()); + if (dir == NULL) { + closedir(dir); + return imgs; } - #ifndef _WIN32 - // scan a directory and get all files with input extensions - inline std::vector get_directory_images(const std::string& path, const std::string& exts) - { - std::vector imgs; - struct dirent *entry; - DIR *dir = opendir(path.c_str()); - if (dir == NULL) { - closedir(dir); - return imgs; - } - while ((entry = readdir(dir)) != NULL) { - std::string item = entry->d_name; - auto ext = strrchr(entry->d_name, '.'); - if (!ext || std::string(ext) == "." || std::string(ext) == "..") { - continue; - } - if (exts.find(ext) != std::string::npos) { - imgs.push_back(path_join(path, entry->d_name)); - } + while ((entry = readdir(dir)) != NULL) { + std::string item = entry->d_name; + auto ext = strrchr(entry->d_name, '.'); + if (!ext || std::string(ext) == "." || std::string(ext) == "..") { + continue; + } + if (exts.find(ext) != std::string::npos) { + imgs.push_back(path_join(path, entry->d_name)); } - return imgs; } - #else - // scan a directory and get all files with input extensions - inline std::vector get_directory_images(const std::string& path, const std::string& exts) - { - std::vector imgs; - for (const auto& item : std::experimental::filesystem::directory_iterator(path)) { - auto suffix = item.path().extension().string(); - if (exts.find(suffix) != std::string::npos && suffix.size() > 0) { - auto fullname = path_join(path, item.path().filename().string()); - imgs.push_back(item.path().string()); - } + return imgs; + } + #else + // scan a directory and get all files with input extensions + inline std::vector get_directory_images( + const std::string& path, const std::string& exts) { + std::vector imgs; + for (const auto& item : + std::experimental::filesystem::directory_iterator(path)) { + auto suffix = item.path().extension().string(); + if (exts.find(suffix) != std::string::npos && suffix.size() > 0) { + auto fullname = path_join(path, + item.path().filename().string()); + imgs.push_back(item.path().string()); } - return imgs; } - #endif + return imgs; + } + #endif - // normalize and HWC_BGR -> CHW_RGB - inline void normalize(cv::Mat& im, float* data, std::vector& fmean, std::vector& fstd) { - int rh = im.rows; - int rw = im.cols; - int rc = im.channels(); - double normf = (double)1.0 / 255.0; - #pragma omp parallel for - for (int h = 0; h < rh; ++h) { - const uchar* ptr = im.ptr(h); - int im_index = 0; - for (int w = 0; w < rw; ++w) { - for (int c = 0; c < rc; ++c) { - int top_index = (c * rh + h) * rw + w; - float pixel = static_cast(ptr[im_index++]); - pixel = (pixel * normf - fmean[c]) / fstd[c]; - data[top_index] = pixel; - } + // normalize and HWC_BGR -> CHW_RGB + inline void normalize(cv::Mat& im, float* data, std::vector& fmean, + std::vector& fstd) { + int rh = im.rows; + int rw = im.cols; + int rc = im.channels(); + double normf = static_cast(1.0) / 255.0; + #pragma omp parallel for + for (int h = 0; h < rh; ++h) { + const uchar* ptr = im.ptr(h); + int im_index = 0; + for (int w = 0; w < rw; ++w) { + for (int c = 0; c < rc; ++c) { + int top_index = (c * rh + h) * rw + w; + float pixel = static_cast(ptr[im_index++]); + pixel = (pixel * normf - fmean[c]) / fstd[c]; + data[top_index] = pixel; } } } + } - // argmax - inline void argmax(float* out, std::vector& shape, std::vector& mask, std::vector& scoremap) { - int out_img_len = shape[1] * shape[2]; - int blob_out_len = out_img_len * shape[0]; - /* - Eigen::TensorMap> out_3d(out, shape[0], shape[1], shape[2]); - Eigen::Tensor argmax = out_3d.argmax(0); - */ - float max_value = -1; - int label = 0; - #pragma omp parallel private(label) - for (int i = 0; i < out_img_len; ++i) { - max_value = -1; - label = 0; - #pragma omp for reduction(max : max_value) - for (int j = 0; j < shape[0]; ++j) { - int index = i + j * out_img_len; - if (index >= blob_out_len) { - continue; - } - float value = out[index]; - if (value > max_value) { - max_value = value; - label = j; - } + // argmax + inline void argmax(float* out, std::vector& shape, + std::vector& mask, std::vector& scoremap) { + int out_img_len = shape[1] * shape[2]; + int blob_out_len = out_img_len * shape[0]; + /* + Eigen::TensorMap> out_3d(out, shape[0], shape[1], shape[2]); + Eigen::Tensor argmax = out_3d.argmax(0); + */ + float max_value = -1; + int label = 0; + #pragma omp parallel private(label) + for (int i = 0; i < out_img_len; ++i) { + max_value = -1; + label = 0; + #pragma omp for reduction(max : max_value) + for (int j = 0; j < shape[0]; ++j) { + int index = i + j * out_img_len; + if (index >= blob_out_len) { + continue; + } + float value = out[index]; + if (value > max_value) { + max_value = value; + label = j; } - if (label == 0) max_value = 0; - mask[i] = uchar(label); - scoremap[i] = uchar(max_value * 255); } + if (label == 0) max_value = 0; + mask[i] = uchar(label); + scoremap[i] = uchar(max_value * 255); } } -} +} // namespace utils +} // namespace PaddleSolution