From 3d94fa0ff101e075afb986a266198fff21966bfd Mon Sep 17 00:00:00 2001 From: wangxinxin08 <69842442+wangxinxin08@users.noreply.github.com> Date: Thu, 15 Oct 2020 17:21:55 +0800 Subject: [PATCH] [cherry-pick]modify output path in cpp infer (#1569) * modify cpp output path * fix compile error * modify docs for windows --- deploy/cpp/docs/linux_build.md | 15 ++++---- deploy/cpp/docs/windows_vs2019_build.md | 14 +++++--- deploy/cpp/src/main.cc | 46 ++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/deploy/cpp/docs/linux_build.md b/deploy/cpp/docs/linux_build.md index 1ff2e158c..bd429b8d3 100644 --- a/deploy/cpp/docs/linux_build.md +++ b/deploy/cpp/docs/linux_build.md @@ -91,12 +91,15 @@ make 编译成功后,预测入口程序为`build/main`其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | -| model_dir | 导出的预测模型所在路径 | -| image_path | 要预测的图片文件路径 | -| video_path | 要预测的视频文件路径 | -| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| -| gpu_id | 指定进行推理的GPU device id(默认值为0)| -| --run_mode |使用GPU时,默认为fluid, 可选(fluid/trt_fp32/trt_fp16)| +| --model_dir | 导出的预测模型所在路径 | +| --image_path | 要预测的图片文件路径 | +| --video_path | 要预测的视频文件路径 | +| --camera_id | Option | 用来预测的摄像头ID,默认为-1(表示不使用摄像头预测)| +| --use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| +| --gpu_id | 指定进行推理的GPU device id(默认值为0)| +| --run_mode | 使用GPU时,默认为fluid, 可选(fluid/trt_fp32/trt_fp16)| +| --run_benchmark | 是否重复预测来进行benchmark测速 | +| --output_dir | 输出图片所在的文件夹, 默认为output | **注意**: 如果同时设置了`video_path`和`image_path`,程序仅预测`video_path`。 diff --git a/deploy/cpp/docs/windows_vs2019_build.md b/deploy/cpp/docs/windows_vs2019_build.md index cb7dcfc97..bef40c43b 100644 --- a/deploy/cpp/docs/windows_vs2019_build.md +++ b/deploy/cpp/docs/windows_vs2019_build.md @@ -92,11 +92,15 @@ cd D:\projects\PaddleDetection\deploy\cpp\out\build\x64-Release | 参数 | 说明 | | ---- | ---- | -| model_dir | 导出的预测模型所在路径 | -| image_path | 要预测的图片文件路径 | -| video_path | 要预测的视频文件路径 | -| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| -| gpu_id | 指定进行推理的GPU device id(默认值为0)| +| --model_dir | 导出的预测模型所在路径 | +| --image_path | 要预测的图片文件路径 | +| --video_path | 要预测的视频文件路径 | +| --camera_id | Option | 用来预测的摄像头ID,默认为-1(表示不使用摄像头预测)| +| --use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0)| +| --gpu_id | 指定进行推理的GPU device id(默认值为0)| +| --run_mode | 使用GPU时,默认为fluid, 可选(fluid/trt_fp32/trt_fp16)| +| --run_benchmark | 是否重复预测来进行benchmark测速 | +| --output_dir | 输出图片所在的文件夹, 默认为output | **注意**:如果同时设置了`video_path`和`image_path`,程序仅预测`video_path`。 diff --git a/deploy/cpp/src/main.cc b/deploy/cpp/src/main.cc index 70febc08d..32e8b491f 100644 --- a/deploy/cpp/src/main.cc +++ b/deploy/cpp/src/main.cc @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "include/object_detector.h" @@ -33,6 +35,45 @@ DEFINE_bool(run_benchmark, false, "Whether to predict a image_file repeatedly fo DEFINE_double(threshold, 0.5, "Threshold of score."); DEFINE_string(output_dir, "output", "Directory of output visualization files."); +static std::string DirName(const std::string &filepath) { + auto pos = filepath.rfind(OS_PATH_SEP); + if (pos == std::string::npos) { + return ""; + } + return filepath.substr(0, pos); +} + +static bool PathExists(const std::string& path){ +#ifdef _WIN32 + struct _stat buffer; + return (_stat(path.c_str(), &buffer) == 0); +#else + struct stat buffer; + return (stat(path.c_str(), &buffer) == 0); +#endif // !_WIN32 +} + +static void MkDir(const std::string& path) { + std::string path_error(path); + path_error += " mkdir failed!"; + int ret = 0; +#ifdef _WIN32 + ret = _mkdir(path.c_str()); +#else + ret = mkdir(path.c_str(), 0755); +#endif // !_WIN32 + if (ret != 0) { + throw std::runtime_error(path_error); + } +} + +static void MkDirs(const std::string& path) { + if (path.empty()) return; + if (PathExists(path)) return; + + MkDirs(DirName(path)); + MkDir(path); +} void PredictVideo(const std::string& video_path, PaddleDetection::ObjectDetector* det) { @@ -128,7 +169,7 @@ void PredictImage(const std::string& image_path, std::vector compression_params; compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); compression_params.push_back(95); - cv::imwrite(output_dir + "/output.jpg", vis_img, compression_params); + cv::imwrite(output_dir + OS_PATH_SEP + "output.jpg", vis_img, compression_params); printf("Visualized output saved as output.jpg\n"); } } @@ -155,6 +196,9 @@ int main(int argc, char** argv) { if (!FLAGS_video_path.empty() || FLAGS_use_camera) { PredictVideo(FLAGS_video_path, &det); } else if (!FLAGS_image_path.empty()) { + if (!PathExists(FLAGS_output_dir)) { + MkDirs(FLAGS_output_dir); + } PredictImage(FLAGS_image_path, FLAGS_threshold, FLAGS_run_benchmark, &det, FLAGS_output_dir); } return 0; -- GitLab