diff --git a/docs/ax650/glpdepth_out.png b/docs/ax650/glpdepth_out.png new file mode 100644 index 0000000..5418f00 Binary files /dev/null and b/docs/ax650/glpdepth_out.png differ diff --git a/examples/ax650/CMakeLists.txt b/examples/ax650/CMakeLists.txt index e213d42..fd1c2cd 100644 --- a/examples/ax650/CMakeLists.txt +++ b/examples/ax650/CMakeLists.txt @@ -53,6 +53,7 @@ if (AXERA_TARGET_CHIP MATCHES "ax650") axera_example(ax_pfld ax_pfld_steps.cc) axera_example(ax_dinov2 ax_dinov2_steps.cc) axera_example(ax_simcc_pose ax_simcc_pose_steps.cc) + axera_example(ax_glpdepth ax_glpdepth_steps.cc) axera_example(ax_imgproc ax_imgproc_steps.cc) endif () diff --git a/examples/ax650/README.md b/examples/ax650/README.md index 95e6979..f686931 100644 --- a/examples/ax650/README.md +++ b/examples/ax650/README.md @@ -506,4 +506,25 @@ post process cost time:0.07 ms Repeat 1 times, avg time 4.79 ms, max_time 4.79 ms, min_time 4.79 ms -------------------------------------- ``` - \ No newline at end of file + + +### GLPDepth +``` +/opt/test # ./ax_glpdepth -m install/bin/models/glpdepth_896x1152.axmodel -i test.jpg +-------------------------------------- +model file : install/bin/models/glpdepth_896x1152.axmodel +image file : test.jpg +img_h, img_w : 896 1152 +-------------------------------------- +Engine creating handle is done. +Engine creating context is done. +Engine get io info is done. +Engine alloc io is done. +Engine push input is done. +-------------------------------------- +post process cost time:29.89 ms +-------------------------------------- +Repeat 1 times, avg time 258.29 ms, max_time 258.29 ms, min_time 258.29 ms +-------------------------------------- +``` + diff --git a/examples/ax650/ax_glpdepth_steps.cc b/examples/ax650/ax_glpdepth_steps.cc new file mode 100644 index 0000000..0b9d3b5 --- /dev/null +++ b/examples/ax650/ax_glpdepth_steps.cc @@ -0,0 +1,237 @@ +/* +* AXERA is pleased to support the open source community by making ax-samples available. +* +* Copyright (c) 2022, AXERA Semiconductor (Shanghai) Co., Ltd. All rights reserved. +* +* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except +* in compliance with the License. You may obtain a copy of the License at +* +* https://opensource.org/licenses/BSD-3-Clause +* +* 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. +*/ + +/* +* Author: ZHEQIUSHUI +*/ + +#include +#include +#include + +#include +#include "base/common.hpp" +#include "base/detection.hpp" +#include "middleware/io.hpp" + +#include "utilities/args.hpp" +#include "utilities/cmdline.hpp" +#include "utilities/file.hpp" +#include "utilities/timer.hpp" + +#include +#include + +const int DEFAULT_IMG_H = 896; +const int DEFAULT_IMG_W = 1152; + +const int DEFAULT_LOOP_COUNT = 1; + +namespace ax +{ + void post_process(AX_ENGINE_IO_INFO_T* io_info, AX_ENGINE_IO_T* io_data, const cv::Mat& mat, int input_w, int input_h, const std::vector& time_costs) + { + timer timer_postprocess; + auto& output = io_data->pOutputs[0]; + auto& info = io_info->pOutputs[0]; + + cv::Mat feature(info.pShape[2], info.pShape[3], CV_32FC1, output.pVirAddr); + + double minVal, maxVal; + cv::minMaxLoc(feature, &minVal, &maxVal); + + feature -= minVal; + feature /= (maxVal - minVal); + feature = 1.f - feature; + feature *= 255; + + feature.convertTo(feature, CV_8UC1); + + cv::Mat dst(info.pShape[2], info.pShape[3], CV_8UC3); + cv::applyColorMap(feature, dst, cv::ColormapTypes::COLORMAP_MAGMA); + cv::resize(dst, dst, cv::Size(mat.cols, mat.rows)); + + fprintf(stdout, "post process cost time:%.2f ms \n", timer_postprocess.cost()); + fprintf(stdout, "--------------------------------------\n"); + auto total_time = std::accumulate(time_costs.begin(), time_costs.end(), 0.f); + auto min_max_time = std::minmax_element(time_costs.begin(), time_costs.end()); + fprintf(stdout, + "Repeat %d times, avg time %.2f ms, max_time %.2f ms, min_time %.2f ms\n", + (int)time_costs.size(), + total_time / (float)time_costs.size(), + *min_max_time.second, + *min_max_time.first); + fprintf(stdout, "--------------------------------------\n"); + cv::hconcat(std::vector{mat, dst}, dst); + cv::imwrite("glpdepth_out.png", dst); + } + + bool run_model(const std::string& model, const std::vector& data, const int& repeat, cv::Mat& mat, int input_h, int input_w) + { + // 1. init engine + AX_ENGINE_NPU_ATTR_T npu_attr; + memset(&npu_attr, 0, sizeof(npu_attr)); + npu_attr.eHardMode = AX_ENGINE_VIRTUAL_NPU_DISABLE; + auto ret = AX_ENGINE_Init(&npu_attr); + if (0 != ret) + { + return ret; + } + + // 2. load model + std::vector model_buffer; + if (!utilities::read_file(model, model_buffer)) + { + fprintf(stderr, "Read Run-Joint model(%s) file failed.\n", model.c_str()); + return false; + } + + // 3. create handle + AX_ENGINE_HANDLE handle; + ret = AX_ENGINE_CreateHandle(&handle, model_buffer.data(), model_buffer.size()); + SAMPLE_AX_ENGINE_DEAL_HANDLE + fprintf(stdout, "Engine creating handle is done.\n"); + + // 4. create context + ret = AX_ENGINE_CreateContext(handle); + SAMPLE_AX_ENGINE_DEAL_HANDLE + fprintf(stdout, "Engine creating context is done.\n"); + + // 5. set io + AX_ENGINE_IO_INFO_T* io_info; + ret = AX_ENGINE_GetIOInfo(handle, &io_info); + SAMPLE_AX_ENGINE_DEAL_HANDLE + fprintf(stdout, "Engine get io info is done. \n"); + + // 6. alloc io + AX_ENGINE_IO_T io_data; + ret = middleware::prepare_io(io_info, &io_data, std::make_pair(AX_ENGINE_ABST_DEFAULT, AX_ENGINE_ABST_CACHED)); + SAMPLE_AX_ENGINE_DEAL_HANDLE + fprintf(stdout, "Engine alloc io is done. \n"); + + // 7. insert input + ret = middleware::push_input(data, &io_data, io_info); + SAMPLE_AX_ENGINE_DEAL_HANDLE_IO + fprintf(stdout, "Engine push input is done. \n"); + fprintf(stdout, "--------------------------------------\n"); + + // 8. warn up + for (int i = 0; i < 5; ++i) + { + AX_ENGINE_RunSync(handle, &io_data); + } + + // 9. run model + std::vector time_costs(repeat, 0); + for (int i = 0; i < repeat; ++i) + { + timer tick; + ret = AX_ENGINE_RunSync(handle, &io_data); + time_costs[i] = tick.cost(); + SAMPLE_AX_ENGINE_DEAL_HANDLE_IO + } + + // 10. get result + post_process(io_info, &io_data, mat, input_w, input_h, time_costs); + fprintf(stdout, "--------------------------------------\n"); + + middleware::free_io(&io_data); + return AX_ENGINE_DestroyHandle(handle); + } +} // namespace ax + +int main(int argc, char* argv[]) +{ + cmdline::parser cmd; + cmd.add("model", 'm', "joint file(a.k.a. joint model)", true, ""); + cmd.add("image", 'i', "image file", true, ""); + cmd.add("size", 'g', "input_h, input_w", false, std::to_string(DEFAULT_IMG_H) + "," + std::to_string(DEFAULT_IMG_W)); + + cmd.add("repeat", 'r', "repeat count", false, DEFAULT_LOOP_COUNT); + cmd.parse_check(argc, argv); + + // 0. get app args, can be removed from user's app + auto model_file = cmd.get("model"); + auto image_file = cmd.get("image"); + + auto model_file_flag = utilities::file_exist(model_file); + auto image_file_flag = utilities::file_exist(image_file); + + if (!model_file_flag | !image_file_flag) + { + auto show_error = [](const std::string& kind, const std::string& value) { + fprintf(stderr, "Input file %s(%s) is not exist, please check it.\n", kind.c_str(), value.c_str()); + }; + + if (!model_file_flag) { show_error("model", model_file); } + if (!image_file_flag) { show_error("image", image_file); } + + return -1; + } + + auto input_size_string = cmd.get("size"); + + std::array input_size = {DEFAULT_IMG_H, DEFAULT_IMG_W}; + + auto input_size_flag = utilities::parse_string(input_size_string, input_size); + + if (!input_size_flag) + { + auto show_error = [](const std::string& kind, const std::string& value) { + fprintf(stderr, "Input %s(%s) is not allowed, please check it.\n", kind.c_str(), value.c_str()); + }; + + show_error("size", input_size_string); + + return -1; + } + + auto repeat = cmd.get("repeat"); + + // 1. print args + fprintf(stdout, "--------------------------------------\n"); + fprintf(stdout, "model file : %s\n", model_file.c_str()); + fprintf(stdout, "image file : %s\n", image_file.c_str()); + fprintf(stdout, "img_h, img_w : %d %d\n", input_size[0], input_size[1]); + fprintf(stdout, "--------------------------------------\n"); + + // 2. read image & resize & transpose + std::vector image(input_size[0] * input_size[1] * 3, 0); + cv::Mat mat = cv::imread(image_file); + if (mat.empty()) + { + fprintf(stderr, "Read image failed.\n"); + return -1; + } + common::get_input_data_no_letterbox(mat, image, input_size[0], input_size[1], true); + + // 3. sys_init + AX_SYS_Init(); + + // 4. - engine model - can only use AX_ENGINE** inside + { + // AX_ENGINE_NPUReset(); // todo ?? + ax::run_model(model_file, image, repeat, mat, input_size[0], input_size[1]); + + // 4.3 engine de init + AX_ENGINE_Deinit(); + // AX_ENGINE_NPUReset(); + } + // 4. - engine model - + + AX_SYS_Deinit(); + return 0; +} diff --git a/examples/ax650/ax_imgproc_steps.cc b/examples/ax650/ax_imgproc_steps.cc index 8cf3a8d..5c82c1c 100644 --- a/examples/ax650/ax_imgproc_steps.cc +++ b/examples/ax650/ax_imgproc_steps.cc @@ -167,7 +167,7 @@ int main(int argc, char* argv[]) resize_ctrl.eMode = AX_IVPS_ASPECT_RATIO_AUTO; resize_ctrl.eAligns[0] = AX_IVPS_ASPECT_RATIO_HORIZONTAL_CENTER; resize_ctrl.eAligns[1] = AX_IVPS_ASPECT_RATIO_VERTICAL_CENTER; - AX_IVPS_RECT_T pbox[1] = {{0, 0, ive_nv12.u32Width / 2, ive_nv12.u32Height / 2}}; + AX_IVPS_RECT_T pbox[1] = {{0, 0, (AX_U16)(ive_nv12.u32Width / 2), (AX_U16)(ive_nv12.u32Height / 2)}}; for (size_t i = 0; i < repeat; i++) { auto temp = &ive_nv12_crop_resize; @@ -190,7 +190,7 @@ int main(int argc, char* argv[]) resize_ctrl.eMode = AX_IVPS_ASPECT_RATIO_STRETCH; resize_ctrl.eAligns[0] = AX_IVPS_ASPECT_RATIO_HORIZONTAL_CENTER; resize_ctrl.eAligns[1] = AX_IVPS_ASPECT_RATIO_VERTICAL_CENTER; - AX_IVPS_RECT_T pbox[1] = {{0, 0, ive_nv12.u32Width, ive_nv12.u32Height}}; + AX_IVPS_RECT_T pbox[1] = {{0, 0, (AX_U16)(ive_nv12.u32Width), (AX_U16)(ive_nv12.u32Height)}}; for (size_t i = 0; i < repeat; i++) { auto temp = &ive_nv12_crop_resize;