From 39e08c139e12f4700bda2cb69d80a3d07ad228c0 Mon Sep 17 00:00:00 2001 From: Heiko Joerg Schick Date: Sat, 17 Oct 2020 15:44:27 +0200 Subject: [PATCH] Initial commit --- .project | 8 ++ CMakeLists.txt | 9 ++ caffe_model/aipp_bgr.cfg | 14 ++ data/bird.jpg | Bin 0 -> 8799 bytes data/boat.jpg | Bin 0 -> 91741 bytes inc/model_process.h | 109 ++++++++++++++++ inc/sample_process.h | 71 +++++++++++ inc/utils.h | 82 ++++++++++++ model/.keep | 0 src/CMakeLists.txt | 65 ++++++++++ src/acl.json | 1 + src/main.cpp | 52 ++++++++ src/model_process.cpp | 269 +++++++++++++++++++++++++++++++++++++++ src/sample_process.cpp | 178 ++++++++++++++++++++++++++ src/utils.cpp | 237 ++++++++++++++++++++++++++++++++++ 15 files changed, 1095 insertions(+) create mode 100644 .project create mode 100644 CMakeLists.txt create mode 100644 caffe_model/aipp_bgr.cfg create mode 100644 data/bird.jpg create mode 100644 data/boat.jpg create mode 100644 inc/model_process.h create mode 100644 inc/sample_process.h create mode 100644 inc/utils.h create mode 100644 model/.keep create mode 100644 src/CMakeLists.txt create mode 100644 src/acl.json create mode 100644 src/main.cpp create mode 100644 src/model_process.cpp create mode 100644 src/sample_process.cpp create mode 100644 src/utils.cpp diff --git a/.project b/.project new file mode 100644 index 0000000..20a56fe --- /dev/null +++ b/.project @@ -0,0 +1,8 @@ +{ + "type": "Ascend ACL App", + "project_type": "Custom", + "project_desc": "", + "target": "", + "target_id": "", + "adk_version": "1.73.T5.0.B050" +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f8f16fe --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved. + +# CMake lowest version requirement +cmake_minimum_required(VERSION 3.5.1) + +# project information +project(sample-objectdetection) + +add_subdirectory("./src") diff --git a/caffe_model/aipp_bgr.cfg b/caffe_model/aipp_bgr.cfg new file mode 100644 index 0000000..d6ec314 --- /dev/null +++ b/caffe_model/aipp_bgr.cfg @@ -0,0 +1,14 @@ +aipp_op{ +aipp_mode:static +input_format : RGB888_U8 +csc_switch : false +rbuv_swap_switch:true + +var_reci_chn_0 :0.003921568627451 +var_reci_chn_1 :0.003921568627451 +var_reci_chn_2 :0.003921568627451 + + +} + + diff --git a/data/bird.jpg b/data/bird.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d0cbc9bcb12c9133b14ac213aa2c1ed9518e68b GIT binary patch literal 8799 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 Npdj)HzDP3he*hA27s&ts literal 0 HcmV?d00001 diff --git a/data/boat.jpg b/data/boat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67648d1255f94ce8410c3cfafc8d4f27fa693fa3 GIT binary patch literal 91741 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%0DAld1BAGX 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 F|Jhjww=n +#include "utils.h" +#include "acl/acl.h" + +/** +* ModelProcess +*/ +class ModelProcess { +public: + /** + * @brief Constructor + */ + ModelProcess(); + + /** + * @brief Destructor + */ + ~ModelProcess(); + + /** + * @brief load model from file with mem + * @param [in] modelPath: model path + * @return result + */ + Result LoadModelFromFileWithMem(const char *modelPath); + + /** + * @brief unload model + */ + void Unload(); + + /** + * @brief create model desc + * @return result + */ + Result CreateDesc(); + + /** + * @brief destroy desc + */ + void DestroyDesc(); + + /** + * @brief create model input + * @param [in] inputDataBuffer: input buffer + * @param [in] bufferSize: input buffer size + * @return result + */ + Result CreateInput(void *inputDataBuffer, size_t bufferSize); + + /** + * @brief destroy input resource + */ + void DestroyInput(); + + /** + * @brief create output buffer + * @return result + */ + Result CreateOutput(); + + /** + * @brief destroy output resource + */ + void DestroyOutput(); + + /** + * @brief model execute + * @return result + */ + Result Execute(); + + /** + * @brief get model output data + * @return output dataset + */ + aclmdlDataset *GetModelOutputData(); + +private: + bool loadFlag_; // model load flag + uint32_t modelId_; + void *modelMemPtr_; + size_t modelMemSize_; + void *modelWeightPtr_; + size_t modelWeightSize_; + aclmdlDesc *modelDesc_; + aclmdlDataset *input_; + aclmdlDataset *output_; +}; + diff --git a/inc/sample_process.h b/inc/sample_process.h new file mode 100644 index 0000000..bb81f53 --- /dev/null +++ b/inc/sample_process.h @@ -0,0 +1,71 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File sample_process.h +* Description: handle acl resource +*/ +#pragma once +#include "utils.h" +#include "acl/acl.h" +#include + +template +std::shared_ptr MakeSharedNoThrow() { + try { + return std::make_shared(); + } catch (...) { + return nullptr; + } +} + +#define MAKE_SHARED_NO_THROW(memory, memory_type) \ + memory = MakeSharedNoThrow(); + +/** +* SampleProcess +*/ +class SampleProcess { +public: + /** + * @brief Constructor + */ + SampleProcess(); + + /** + * @brief Destructor + */ + ~SampleProcess(); + + /** + * @brief init reousce + * @return result + */ + Result InitResource(); + + /** + * @brief encode sample process + * @param [in] dvpptype: dvpp type + * @return result + */ + Result MainProcess(std::string input_path); + +private: + void DestroyResource(); + + int32_t deviceId_; + aclrtContext context_; + aclrtStream stream_; +}; + diff --git a/inc/utils.h b/inc/utils.h new file mode 100644 index 0000000..c8fae53 --- /dev/null +++ b/inc/utils.h @@ -0,0 +1,82 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File utils.h +* Description: handle file operations +*/ +#pragma once +#include +#include +#include "acl/acl.h" +#include +#include "opencv2/imgcodecs/legacy/constants_c.h" +#include "opencv2/imgproc/types_c.h" + +#define INFO_LOG(fmt, args...) fprintf(stdout, "[INFO] " fmt "\n", ##args) +#define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "\n", ##args) +#define ERROR_LOG(fmt, args...) fprintf(stdout, "[ERROR] " fmt "\n", ##args) +#define MODEL_INPUT_WIDTH 416 +#define MODEL_INPUT_HEIGHT 416 + +typedef enum Result { + SUCCESS = 0, + FAILED = 1 +} Result; + +struct ConsoleParams { + uint32_t img_width = 0; + uint32_t img_height = 0; + int32_t size = 0; + std::string input_path = ""; + std::shared_ptr data; +}; + +const std::string kImagePathSeparator = ","; +const int kStatSuccess = 0; +const std::string kFileSperator = "/"; +const std::string kPathSeparator = "/"; +// output image prefix +const std::string kOutputFilePrefix = "out_"; + +/** + * Utils + */ +class Utils { +public: + + /** + * @brief create device buffer of pic + * @param [in] picDesc: pic desc + * @param [in] PicBufferSize: aligned pic size + * @return device buffer of pic + */ + + static Result Postprocess(const std::string &path, aclmdlDataset *modelOutput); + + static bool IsDirectory(const std::string &path); + + static bool IsPathExist(const std::string &path); + + static void SplitPath(const std::string &path, std::vector &path_vec); + + static void GetAllFiles(const std::string &path, std::vector &file_vec); + + static void GetPathFiles(const std::string &path, std::vector &file_vec); + + static bool Preprocess(std::shared_ptr &image_path, + const std::string &path); + +}; + diff --git a/model/.keep b/model/.keep new file mode 100644 index 0000000..e69de29 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..a8bdd4b --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,65 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. + +# CMake lowest version requirement +cmake_minimum_required(VERSION 3.5.1) + +# project information +project(objectdetection_pic) + +# Compile options +add_compile_options(-std=c++11) + +add_definitions(-DENABLE_DVPP_INTERFACE) + +# Specify target generation path +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../../out") +set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall") +set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall") + +set(INC_PATH $ENV{DDK_PATH}) + +if (NOT DEFINED ENV{DDK_PATH}) + set(INC_PATH "/usr/local/Ascend") + message(STATUS "set default INC_PATH: ${INC_PATH}") +else () + message(STATUS "env INC_PATH: ${INC_PATH}") +endif() + +set(LIB_PATH $ENV{NPU_HOST_LIB}) +set(OPENCV_PATH "/usr/local") + +if (NOT DEFINED ENV{NPU_HOST_LIB}) + set(LIB_PATH "/usr/local/Ascend/acllib/lib64/stub/") + message(STATUS "set default LIB_PATH: ${LIB_PATH}") +else () + message(STATUS "env LIB_PATH: ${LIB_PATH}") +endif() + +# Header path +include_directories( + $ENV{HOME}/ascend_ddk/include/ + $ENV{HOME}/ascend_ddk/include/ascenddk/ + ${INC_PATH}/acllib/include/ + ../inc/ + ${OPENCV_PATH}/include/opencv4 +) + + +# add host lib path +link_directories( + ${LIB_PATH} + $ENV{HOME}/ascend_ddk/host/lib/ + ${OPENCV_PATH}/lib + ${INC_PATH}/atc/lib64 +) + +add_executable(main + utils.cpp + model_process.cpp + sample_process.cpp + main.cpp) + +target_link_libraries(main + ascendcl acl_dvpp stdc++ opencv_highgui opencv_core opencv_imgproc opencv_imgcodecs opencv_calib3d opencv_features2d) + +install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) diff --git a/src/acl.json b/src/acl.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/acl.json @@ -0,0 +1 @@ +{} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..47de996 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,52 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File main.cpp +* Description: dvpp sample main func +*/ + +#include +#include +#include +#include "sample_process.h" +#include "utils.h" +using namespace std; + +int main(int argc, char *argv[]) +{ + + if(argc<2){ + ERROR_LOG("please input: ./main path"); + return FAILED; + } + + SampleProcess processSample; + Result ret = processSample.InitResource(); + if (ret != SUCCESS) { + ERROR_LOG("sample init resource failed"); + return FAILED; + } + + //input path + string input_path = string(argv[1]); + + ret = processSample.MainProcess(input_path); + if (ret != SUCCESS) { + ERROR_LOG("sample model process failed"); + return FAILED; + } + INFO_LOG("execute sample success"); + return SUCCESS; +} diff --git a/src/model_process.cpp b/src/model_process.cpp new file mode 100644 index 0000000..af3bf3f --- /dev/null +++ b/src/model_process.cpp @@ -0,0 +1,269 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File model_process.cpp +* Description: handle model process +*/ +#include "model_process.h" +#include +#include "utils.h" +using namespace std; + +ModelProcess::ModelProcess():loadFlag_(false), modelId_(0), modelMemPtr_(nullptr), modelMemSize_(0), +modelWeightPtr_(nullptr),modelWeightSize_(0), modelDesc_(nullptr), input_(nullptr), output_(nullptr) +{ +} + +ModelProcess::~ModelProcess() +{ + Unload(); + DestroyDesc(); + DestroyInput(); + DestroyOutput(); +} + +Result ModelProcess::LoadModelFromFileWithMem(const char *modelPath) +{ + if (loadFlag_) { + ERROR_LOG("has already loaded a model"); + return FAILED; + } + + aclError ret = aclmdlQuerySize(modelPath, &modelMemSize_, &modelWeightSize_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("query model failed, model file is %s", modelPath); + return FAILED; + } + + ret = aclrtMalloc(&modelMemPtr_, modelMemSize_, ACL_MEM_MALLOC_HUGE_FIRST); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("malloc buffer for mem failed, require size is %zu", modelMemSize_); + return FAILED; + } + + ret = aclrtMalloc(&modelWeightPtr_, modelWeightSize_, ACL_MEM_MALLOC_HUGE_FIRST); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("malloc buffer for weight failed, require size is %zu", modelWeightSize_); + return FAILED; + } + + ret = aclmdlLoadFromFileWithMem(modelPath, &modelId_, modelMemPtr_, + modelMemSize_, modelWeightPtr_, modelWeightSize_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("load model from file failed, model file is %s", modelPath); + return FAILED; + } + + loadFlag_ = true; + INFO_LOG("load model %s success", modelPath); + return SUCCESS; +} + +Result ModelProcess::CreateDesc() +{ + modelDesc_ = aclmdlCreateDesc(); + if (modelDesc_ == nullptr) { + ERROR_LOG("create model description failed"); + return FAILED; + } + + aclError ret = aclmdlGetDesc(modelDesc_, modelId_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("get model description failed"); + return FAILED; + } + + INFO_LOG("create model description success"); + return SUCCESS; +} + +void ModelProcess::DestroyDesc() +{ + if (modelDesc_ != nullptr) { + (void)aclmdlDestroyDesc(modelDesc_); + modelDesc_ = nullptr; + } +} + +const float ModelInput2[4]={416,416,416,416}; + +Result ModelProcess::CreateInput(void *inputDataBuffer, size_t bufferSize) +{ + input_ = aclmdlCreateDataset(); + if (input_ == nullptr) { + ERROR_LOG("can't create dataset, create input failed"); + return FAILED; + } + + aclDataBuffer* inputData = aclCreateDataBuffer(inputDataBuffer, bufferSize); + if (inputData == nullptr) { + ERROR_LOG("can't create data buffer, create input failed"); + return FAILED; + } + + aclError ret = aclmdlAddDatasetBuffer(input_, inputData); + if (inputData == nullptr) { + ERROR_LOG("can't add data buffer, create input failed"); + aclDestroyDataBuffer(inputData); + inputData = nullptr; + return FAILED; + } + + void *dataDev; + uint32_t dataSize=sizeof(ModelInput2); + aclrtMalloc(&dataDev, dataSize,ACL_MEM_MALLOC_HUGE_FIRST); + aclrtMemcpy(dataDev, dataSize, ModelInput2, sizeof(ModelInput2), ACL_MEMCPY_DEVICE_TO_DEVICE); + aclDataBuffer* inputData2 = aclCreateDataBuffer(dataDev, dataSize); + if (inputData == nullptr) { + ERROR_LOG("can't create data buffer, create input failed"); + return FAILED; + } + ret = aclmdlAddDatasetBuffer(input_, inputData2); + if (inputData == nullptr) { + ERROR_LOG("can't add data buffer, create input failed"); + aclDestroyDataBuffer(inputData2); + inputData = nullptr; + return FAILED; + } + + return SUCCESS; +} + +void ModelProcess::DestroyInput() +{ + if (input_ == nullptr) { + return; + } + + for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(input_); ++i) { + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(input_, i); + aclDestroyDataBuffer(dataBuffer); + } + aclmdlDestroyDataset(input_); + input_ = nullptr; +} + +Result ModelProcess::CreateOutput() +{ + if (modelDesc_ == nullptr) { + ERROR_LOG("no model description, create ouput failed"); + return FAILED; + } + + output_ = aclmdlCreateDataset(); + if (output_ == nullptr) { + ERROR_LOG("can't create dataset, create output failed"); + return FAILED; + } + + size_t outputSize = aclmdlGetNumOutputs(modelDesc_); + for (size_t i = 0; i < outputSize; ++i) { + size_t buffer_size = aclmdlGetOutputSizeByIndex(modelDesc_, i); + + void *outputBuffer = nullptr; + aclError ret = aclrtMalloc(&outputBuffer, buffer_size, ACL_MEM_MALLOC_NORMAL_ONLY); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("can't malloc buffer, size is %zu, create output failed", buffer_size); + return FAILED; + } + + aclDataBuffer* outputData = aclCreateDataBuffer(outputBuffer, buffer_size); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("can't create data buffer, create output failed"); + aclrtFree(outputBuffer); + return FAILED; + } + + ret = aclmdlAddDatasetBuffer(output_, outputData); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("can't add data buffer, create output failed"); + aclrtFree(outputBuffer); + aclDestroyDataBuffer(outputData); + return FAILED; + } + } + + INFO_LOG("create model output success"); + return SUCCESS; +} + +void ModelProcess::DestroyOutput() +{ + if (output_ == nullptr) { + return; + } + + for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(output_); ++i) { + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, i); + void* data = aclGetDataBufferAddr(dataBuffer); + (void)aclrtFree(data); + (void)aclDestroyDataBuffer(dataBuffer); + } + + (void)aclmdlDestroyDataset(output_); + output_ = nullptr; +} + +Result ModelProcess::Execute() +{ + aclError ret = aclmdlExecute(modelId_, input_, output_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("execute model failed, modelId is %u", modelId_); + return FAILED; + } + + INFO_LOG("model execute success"); + return SUCCESS; +} + +void ModelProcess::Unload() +{ + if (!loadFlag_) { + WARN_LOG("no model had been loaded, unload failed"); + return; + } + + aclError ret = aclmdlUnload(modelId_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("unload model failed, modelId is %u", modelId_); + } + + if (modelDesc_ != nullptr) { + (void)aclmdlDestroyDesc(modelDesc_); + modelDesc_ = nullptr; + } + + if (modelMemPtr_ != nullptr) { + aclrtFree(modelMemPtr_); + modelMemPtr_ = nullptr; + modelMemSize_ = 0; + } + + if (modelWeightPtr_ != nullptr) { + aclrtFree(modelWeightPtr_); + modelWeightPtr_ = nullptr; + modelWeightSize_ = 0; + } + + loadFlag_ = false; + INFO_LOG("unload model success, modelId is %u", modelId_); +} + +aclmdlDataset *ModelProcess::GetModelOutputData() +{ + return output_; +} + + diff --git a/src/sample_process.cpp b/src/sample_process.cpp new file mode 100644 index 0000000..c5ab436 --- /dev/null +++ b/src/sample_process.cpp @@ -0,0 +1,178 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File sample_process.cpp +* Description: handle acl resource +*/ +#include "sample_process.h" +#include +#include "model_process.h" +#include "acl/acl.h" +#include "utils.h" + +using namespace std; + +SampleProcess::SampleProcess():deviceId_(0), context_(nullptr), stream_(nullptr) +{ +} + +SampleProcess::~SampleProcess() +{ + DestroyResource(); +} + +Result SampleProcess::InitResource() +{ + // ACL init + const char *aclConfigPath = "../src/acl.json"; + aclError ret = aclInit(aclConfigPath); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("acl init failed"); + return FAILED; + } + INFO_LOG("acl init success"); + + // open device + ret = aclrtSetDevice(deviceId_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("acl open device %d failed", deviceId_); + return FAILED; + } + INFO_LOG("open device %d success", deviceId_); + + // create context (set current) + ret = aclrtCreateContext(&context_, deviceId_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("acl create context failed"); + return FAILED; + } + INFO_LOG("create context success"); + + // create stream + ret = aclrtCreateStream(&stream_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("acl create stream failed"); + return FAILED; + } + INFO_LOG("create stream success"); + + return SUCCESS; +} + +Result SampleProcess::MainProcess(string input_path) +{ + const char* omModelPath = "../model/yolov3_BGR.om"; + + vector file_vec; + Utils::GetAllFiles(input_path, file_vec); + if (file_vec.empty()) { + ERROR_LOG("Failed to deal all empty path=%s.", input_path.c_str()); + return FAILED; + } + + // model init + ModelProcess processModel; + aclError ret = processModel.LoadModelFromFileWithMem(omModelPath); + if (ret != SUCCESS) { + ERROR_LOG("execute LoadModelFromFileWithMem failed"); + return FAILED; + } + ret = processModel.CreateDesc(); + if (ret != SUCCESS) { + ERROR_LOG("execute CreateDesc failed"); + return FAILED; + } + ret = processModel.CreateOutput(); + if (ret != SUCCESS) { + ERROR_LOG("execute CreateOutput failed"); + return FAILED; + } + + for (string path : file_vec) { + shared_ptr image_path = nullptr; + MAKE_SHARED_NO_THROW(image_path, ConsoleParams); + if (image_path == nullptr) { + ERROR_LOG("Failed to deal file=%s. Reason: new EngineTrans failed.", + path.c_str()); + continue; + } + // arrange image information, if failed, skip this image + if (!Utils::Preprocess(image_path, path)) { + continue; + } + + ret = processModel.CreateInput((void*) image_path->data.get(), image_path->size); + if (ret != SUCCESS) { + ERROR_LOG("execute CreateInput failed"); + return FAILED; + } + + ret = processModel.Execute(); + if (ret != SUCCESS) { + ERROR_LOG("execute inference failed"); + return FAILED; + } + + // release model input buffer + processModel.DestroyInput(); + + aclmdlDataset *modelOutput = processModel.GetModelOutputData(); + if (modelOutput == nullptr) { + ERROR_LOG("get model output data failed"); + return FAILED; + } + + ret = Utils::Postprocess(path, modelOutput); + if (ret != SUCCESS) { + ERROR_LOG("pull model output data failed"); + return FAILED; + } + } + return SUCCESS; +} + +void SampleProcess::DestroyResource() +{ + aclError ret; + if (stream_ != nullptr) { + ret = aclrtDestroyStream(stream_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("destroy stream failed"); + } + stream_ = nullptr; + } + INFO_LOG("end to destroy stream"); + + if (context_ != nullptr) { + ret = aclrtDestroyContext(context_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("destroy context failed"); + } + context_ = nullptr; + } + INFO_LOG("end to destroy context"); + + ret = aclrtResetDevice(deviceId_); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("reset device failed"); + } + INFO_LOG("end to reset device is %d", deviceId_); + + ret = aclFinalize(); + if (ret != ACL_ERROR_NONE) { + ERROR_LOG("finalize acl failed"); + } + INFO_LOG("end to finalize acl"); +} diff --git a/src/utils.cpp b/src/utils.cpp new file mode 100644 index 0000000..a95adc4 --- /dev/null +++ b/src/utils.cpp @@ -0,0 +1,237 @@ +/** +* Copyright 2020 Huawei Technologies Co., Ltd +* +* 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. + +* File utils.cpp +* Description: handle file operations +*/ +#include "utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +using namespace std; + +const static std::vector yolov3Label = {"person", "bicycle", "car", "motorbike", +"aeroplane","bus", "train", "truck", "boat", +"traffic light", "fire hydrant", "stop sign", "parking meter", +"bench", "bird", "cat", "dog", "horse", +"sheep", "cow", "elephant", "bear", "zebra", +"giraffe", "backpack", "umbrella", "handbag","tie", +"suitcase", "frisbee", "skis", "snowboard", "sports ball", +"kite", "baseball bat", "baseball glove", "skateboard", "surfboard", +"tennis racket", "bottle", "wine glass", "cup", +"fork", "knife", "spoon", "bowl", "banana", +"apple", "sandwich", "orange", "broccoli", "carrot", +"hot dog", "pizza", "donut", "cake", "chair", +"sofa", "potted plant", "bed", "dining table", "toilet", +"TV monitor", "laptop", "mouse", "remote", "keyboard", +"cell phone", "microwave", "oven", "toaster", "sink", +"refrigerator", "book", "clock", "vase","scissors", +"teddy bear", "hair drier", "toothbrush"}; + +enum BBoxIndex {TOPLEFTX=0,TOPLEFTY,BOTTOMRIGHTX,BOTTOMRIGHTY,SCORE,LABEL}; + +Result Utils::Postprocess(const string &path, aclmdlDataset *modelOutput) +{ + size_t outDatasetNum = aclmdlGetDatasetNumBuffers(modelOutput); + if (outDatasetNum != 2) { + return FAILED; + } + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(modelOutput, 1); + if (dataBuffer == nullptr) { + ERROR_LOG("get model output aclmdlGetDatasetBuffer failed"); + return FAILED; + } + void* data = aclGetDataBufferAddr(dataBuffer); + if (data == nullptr) { + ERROR_LOG("aclGetDataBufferAddr from dataBuffer failed."); + } + uint32_t count; + aclrtMemcpy(&count, sizeof(count), data, sizeof(count), ACL_MEMCPY_DEVICE_TO_DEVICE); + INFO_LOG("box count=%d",count); + dataBuffer = aclmdlGetDatasetBuffer(modelOutput, 0); + if (dataBuffer == nullptr) { + ERROR_LOG("get model output aclmdlGetDatasetBuffer failed"); + return FAILED; + } + data = aclGetDataBufferAddr(dataBuffer); + if (data == nullptr) { + ERROR_LOG("aclGetDataBufferAddr from dataBuffer failed."); + } + float outInfo[count*6]; + aclrtMemcpy(&outInfo, sizeof(outInfo), data, sizeof(outInfo), ACL_MEMCPY_DEVICE_TO_DEVICE); + cv::Rect rect; + int font_face = 0; + double font_scale = 1; + int thickness = 2; + int baseline; + cv::Mat resultImage = cv::imread(path, CV_LOAD_IMAGE_COLOR); + for(uint32_t b=0;b &path_vec) { + char *char_path = const_cast(path.c_str()); + const char *char_split = kImagePathSeparator.c_str(); + char *tmp_path = strtok(char_path, char_split); + while (tmp_path) { + path_vec.emplace_back(tmp_path); + tmp_path = strtok(nullptr, char_split); + } +} + +void Utils::GetAllFiles(const string &path, vector &file_vec) { + // split file path + vector path_vector; + SplitPath(path, path_vector); + + for (string every_path : path_vector) { + // check path exist or not + if (!IsPathExist(path)) { + ERROR_LOG("Failed to deal path=%s. Reason: not exist or can not access.", + every_path.c_str()); + continue; + } + // get files in path and sub-path + GetPathFiles(every_path, file_vec); + } +} + +void Utils::GetPathFiles(const string &path, vector &file_vec) { + struct dirent *dirent_ptr = nullptr; + DIR *dir = nullptr; + if (IsDirectory(path)) { + dir = opendir(path.c_str()); + while ((dirent_ptr = readdir(dir)) != nullptr) { + // skip . and .. + if (dirent_ptr->d_name[0] == '.') { + continue; + } + + // file path + string full_path = path + kPathSeparator + dirent_ptr->d_name; + // directory need recursion + if (IsDirectory(full_path)) { + GetPathFiles(full_path, file_vec); + } else { + // put file + file_vec.emplace_back(full_path); + } + } + } + else { + file_vec.emplace_back(path); + } +} + +bool Utils::Preprocess(shared_ptr &image_path, + const string &path) { + // read image using OPENCV + cv::Mat mat = cv::imread(path, CV_LOAD_IMAGE_COLOR); + //resize + cv::Mat mat_rs; + cv::resize(mat, mat_rs, cv::Size(MODEL_INPUT_WIDTH, MODEL_INPUT_HEIGHT)); + + if (mat.empty()) { + ERROR_LOG("read image failed."); + return false; + } + + // set property + image_path->input_path = path; + image_path->img_width = mat_rs.cols; + image_path->img_height = mat_rs.rows; + + // set image data + uint32_t size = mat_rs.rows * mat_rs.cols*3; + void *image_buf_ptr = nullptr; + aclrtMalloc(&image_buf_ptr, (size_t)(size), ACL_MEM_MALLOC_HUGE_FIRST); + + if (image_buf_ptr == nullptr) { + ERROR_LOG("new image buffer failed."); + return false; + } + aclError mem_ret = aclrtMemcpy(image_buf_ptr, size, mat_rs.ptr(), size, ACL_MEMCPY_DEVICE_TO_DEVICE); + + if (mem_ret != 0) { + aclrtFree(image_buf_ptr); + delete[] (u_int8_t *)image_buf_ptr; + ERROR_LOG("memcpy_s failed."); + image_buf_ptr = nullptr; + return false; + } + image_path->size = size; + image_path->data.reset((u_int8_t *)image_buf_ptr, + [](u_int8_t* p){ + aclrtFree(p);}); + return true; +}