diff --git a/tutorials/mxBaseSample/CMakeLists.txt b/tutorials/mxBaseSample/CMakeLists.txt index d09903dea662eeb68a785f3be1f9547d1bb06f2f..67166fe5f7f6cdc9a90e4f55898eb68fe1c96d06 100644 --- a/tutorials/mxBaseSample/CMakeLists.txt +++ b/tutorials/mxBaseSample/CMakeLists.txt @@ -8,10 +8,10 @@ include_directories(./yolov3Detection) file(GLOB_RECURSE YOLOV3_POSTPROCESS ${PROJECT_SOURCE_DIR}/yolov3PostProcess/*cpp) file(GLOB_RECURSE YOLOV3_DETECTION ${PROJECT_SOURCE_DIR}/yolov3Detection/*cpp) set(TARGET mxBase_sample) -add_compile_options(-std=c++11 -fPIE -fstack-protector-all -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -s -pie -Wall) +add_compile_options(-std=c++14 -fPIE -fstack-protector-all -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -s -pie -Wall) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private) -set(MX_SDK_HOME ${SDK安装路径}) +set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") include_directories( ${MX_SDK_HOME}/include @@ -28,6 +28,13 @@ link_directories( ) add_executable(mxBase_sample main.cpp ${YOLOV3_DETECTION} ${YOLOV3_POSTPROCESS}) + +set(cpprest_DIR ${MX_SDK_HOME}/opensource/lib/libcpprest.so) +if(EXISTS ${cpprest_DIR}) + target_link_libraries(mxBase_sample cpprest) + add_definitions(-DMX_VERSION_5) +endif() + target_link_libraries(mxBase_sample glog mxbase diff --git a/tutorials/mxBaseSample/README.md b/tutorials/mxBaseSample/README.md index 5defb7274bdc6153293584c05e707bea1eb44d81..f48533c8a9fb8dae7863503109afe5637253bfc0 100644 --- a/tutorials/mxBaseSample/README.md +++ b/tutorials/mxBaseSample/README.md @@ -1,53 +1,71 @@ +# 基于MxBaseV1接口的yoloV3目标检测 -# C++ 基于MxBase 的yolov3图像检测样例及yolov3的后处理模块开发 +## 1 介绍 +### 1.1 简介 + +开发样例是基于mxBase开发的端到端推理的C++应用程序,通过 yolov3 进行目标检测,并把可视化结果保存到本地。其中包含yolov3的后处理模块开发。 -## 介绍 -本开发样例是基于mxBase开发的端到端推理的C++应用程序,可在昇腾芯片上进行 yolov3 目标检测,并把可视化结果保存到本地。其中包含yolov3的后处理模块开发。 该Sample的主要处理流程为: + Init > ReadImage >Resize > Inference >PostProcess >DeInit -## 模型转换 +### 1.2 支持的产品 -**步骤1** 模型获取 -在ModelZoo上下载YOLOv3模型。[下载地址](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ActionRecognition/ATC%20YOLOv3%28FP16%29%20from%20TensorFlow%20-%20Ascend310.zip) -**步骤2** 模型存放 -将获取到的YOLOv3模型pb文件放至上一级的models文件夹中 -**步骤3** 执行模型转换命令 +本项目支持昇腾Atlas 500 A2。 -(1) 配置环境变量 -#### 设置环境变量(请确认install_path路径是否正确) -#### Set environment PATH (Please confirm that the install_path is correct). -```c -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +### 1.3 支持的版本 +本样例配套的MxVision版本、CANN版本、Driver/Firmware版本如下所示: -``` -(2) 转换模型 -``` -atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -``` +| MxVision版本 | CANN版本 | Driver/Firmware版本 | +| --------- |---------| -------------- | +| 5.0.0 |7.0.0 | 23.0.0 | +| 6.0.RC3 | 8.0.RC3 | 24.1.RC3 | -## 编译与运行 -**步骤1** 修改CMakeLists.txt文件 将set(MX_SDK_HOME ${SDK安装路径}) 中的${SDK安装路径}替换为实际的SDK安装路径 +### 1.4 三方依赖 +无 -**步骤2** 设置环境变量 -ASCEND_HOME Ascend安装的路径,一般为/usr/local/Ascend -LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径,包括ACL,开源软件库,libmxbase.so以及libyolov3postprocess.so的路径 + +## 2 设置环境变量 + +```bash +#设置CANN环境变量(请确认install_path路径是否正确) +. ${ascend-toolkit-path}/set_env.sh + +#设置MindX SDK 环境变量,SDK-path为mxVision SDK 安装路径 +. ${SDK-path}/set_env.sh ``` -export ASCEND_HOME=/usr/local/Ascend -export ASCEND_VERSION=nnrt/latest -export ARCH_PATTERN=. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} + + + +## 3 准备模型 + +**步骤1:** 通过[下载地址](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ActionRecognition/ATC%20YOLOv3%28FP16%29%20from%20TensorFlow%20-%20Ascend310.zip)下载YOLOv3模型。 + + +**步骤2:** 将获取到的YOLOv3模型的pb文件放在`mxBaseSample/model/`下。 + +**步骤3:** 在`mxBaseSample/model/`下执行模型转换命令 + +```bash +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310B1 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" ``` +- 执行完模型转换脚本后,若提示如下信息说明模型转换成功,并可以在`mxBaseSample/model/`下找到名为`yolov3_tf_bs1_fp16.om`模型文件。 -**步骤3** cd到mxbase目录下,执行如下编译命令: -bash build.sh +```bash +ATC run success, welcome to the next use. +``` -**步骤4** 制定jpg图片进行推理,准备一张推理图片放入mxbase 目录下。eg:推理图片为test.jpg -cd 到mxbase 目录下 +## 4 编译与运行 +**步骤1:** 在`mxBaseSample/`下执行如下编译命令: +```bash +bash build.sh ``` +**步骤2:** 准备推理图片 + +准备一张jpg格式的推理图片并命名为`test.jpg`, 并放入`mxBaseSample/`目录下,执行: +```bash ./mxBase_sample ./test.jpg ``` +**步骤3:** 查看结果 + +结果以`result.jpg`的形式保存在`mxBaseSample/`目录下。 diff --git a/tutorials/mxBaseSample/build.sh b/tutorials/mxBaseSample/build.sh index df3ce0f2d94dabe0690e9c43ab4d336e11526ce5..c71d505918ed4e8f816600651997be0f13bbb98f 100644 --- a/tutorials/mxBaseSample/build.sh +++ b/tutorials/mxBaseSample/build.sh @@ -48,7 +48,6 @@ function build_yolov3() echo "Failed to build yolov3." exit ${ret} fi - make install } check_env diff --git a/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.cpp b/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.cpp index 761be3d81d351966c185b6d055ec0fbd19a10d09..a5313e014fb1b5fd2fddd535a1c39c40a462a944 100644 --- a/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.cpp +++ b/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.cpp @@ -58,7 +58,8 @@ APP_ERROR Yolov3Detection::LoadLabels(const std::string &labelPath, std::map> &config) { + std::map &config) +{ MxBase::ConfigData configData; const std::string checkTensor = initParam.checkTensor ? "true" : "false"; configData.SetJsonValue("CLASS_NUM", std::to_string(initParam.classNum)); @@ -73,9 +74,13 @@ void Yolov3Detection::SetYolov3PostProcessConfig(const InitParam &initParam, configData.SetJsonValue("ANCHOR_DIM", std::to_string(initParam.anchorDim)); configData.SetJsonValue("CHECK_MODEL", checkTensor); - auto jsonStr = configData.GetCfgJson().serialize(); - config["postProcessConfigContent"] = std::make_shared(jsonStr); - config["labelPath"] = std::make_shared(initParam.labelPath); +#ifdef MX_VERSION_5 + auto jsonStr = configData.GetCfgJson().serialize(); +#else + auto jsonStr = configData.GetCfgJson(); +#endif + config["postProcessConfigContent"] = *std::make_shared(jsonStr); + config["labelPath"] = *std::make_shared(initParam.labelPath); } APP_ERROR Yolov3Detection::Init(const InitParam &initParam) { @@ -103,7 +108,7 @@ APP_ERROR Yolov3Detection::Init(const InitParam &initParam) { return ret; } - std::map> config; + std::map config; SetYolov3PostProcessConfig(initParam, config); // 初始化yolov3后处理对象 post_ = std::make_shared(); diff --git a/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.h b/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.h index a0ca54c42239eee049b256207cba57793938c42f..a5afeda30fb23b9fc879f446f203605dfbc57b37 100644 --- a/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.h +++ b/tutorials/mxBaseSample/yolov3Detection/Yolov3Detection.h @@ -53,7 +53,7 @@ protected: APP_ERROR LoadLabels(const std::string &labelPath, std::map &labelMap); APP_ERROR WriteResult(MxBase::TensorBase &tensor, const std::vector> &objInfos); - void SetYolov3PostProcessConfig(const InitParam &initParam, std::map> &config); + void SetYolov3PostProcessConfig(const InitParam &initParam, std::map &config); private: std::shared_ptr dvppWrapper_; // 封装DVPP基本编码、解码、扣图功能 std::shared_ptr model_; // 模型推理功能处理 diff --git a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.cpp b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.cpp index b8b67efdc01af9d20a766ac88b5efab76baf6a27..f2cc562220710ce3101923e09f31d7a73cc600f2 100644 --- a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.cpp +++ b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.cpp @@ -54,7 +54,8 @@ Yolov3PostProcess &Yolov3PostProcess::operator=(const Yolov3PostProcess &other) return *this; } -APP_ERROR Yolov3PostProcess::Init(const std::map> &postConfig) { +APP_ERROR Yolov3PostProcess::Init(const std::map& postConfig) +{ LogDebug << "Start to Init Yolov3PostProcess."; APP_ERROR ret = ObjectPostProcessBase::Init(postConfig); if (ret != APP_ERR_OK) { diff --git a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h index ec9f7ca110bae54d808932878ec840c5f0db4c05..d098c6338e0a99fd26e86f892de6640ac2063866 100644 --- a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h +++ b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h @@ -55,7 +55,7 @@ public: Yolov3PostProcess &operator=(const Yolov3PostProcess &other); - APP_ERROR Init(const std::map> &postConfig) override; + APP_ERROR Init(const std::map &postConfig) override; APP_ERROR DeInit() override; @@ -63,7 +63,7 @@ public: const std::vector &resizedImageInfos = {}, const std::map> ¶mMap = {}) override; protected: - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; void ObjectDetectionOutput(const std::vector &tensors, std::vector> &objectInfos,