异步调用
异步调用
功能介绍
mxVision默认采用同步执行模式,部分接口已支持用户通过申请AscendStream异步执行,具体接口异步支持情况请参见API参考(C++)。
接口调用流程
- 用户通过自定义AscendStream类构造需要的Stream实例传入异步接口,通过接口传入并在指定Stream上执行,同一Stream串行指定接口任务后可通过调用Synchronize()接口阻塞应用程序或线程运行,直到该Stream中的所有任务全部完成。
- 支持多Stream异步执行,每个Stream内接口顺序执行,如果用户使用多Stream异步执行或异步执行结果需传入不支持异步接口情况,需要用户可选择执行Synchronize()接口,在适当位置执行同步Stream操作,保证结果已正确返回供后续使用。
- 对于异步调用进行媒体数据处理时,需要调用Synchronize()接口使异步任务完成才能及时归还使用的通道,避免资源池被耗尽。
图1 Stream异步模式接口调用流程(以Resize操作为例)

mxVision提供AscendStream类进行Stream管理,关键步骤说明如下:
-
调用MxInit()接口进行全局初始化。
-
初始化Stream。
用户通过向构造函数传入“deviceId”指定要创建Stream的设备,支持的“deviceId”根据用户环境存在差异。
-
创建Stream。
- 与Stream初始化绑定使用,在使用Stream前需要调用CreateAscendStream()成员函数完成Stream创建。
- 同一设备(deviceId),Stream最大支持创建1021个,具体请参见《CANN AscendCL应用软件开发指南 (C&C++)》。
-
调用异步接口。
- 支持异步的接口传入指定Stream,同一Stream中接口按顺序串行执行。
- 指定不同Stream的接口之间并行执行。
-
同步Stream。
如需保证异步执行结果在作为下一个接口入参时已执行完成,可调用Synchronize()成员函数显式同步Stream。
-
销毁Stream。
用户在业务流程完成或Stream结束时,需调用DestroyAscendStream()成员函数销毁Stream,否则可能会造成Stream耗尽情况。
-
调用MxDeInit()接口对初始化的全局资源进行去初始化。
示例代码
以图像异步缩放和yoloV3模型异步推理为例,提供关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
// 初始化
MxBase::MxInit();
{
// 用户创建目标deviceId的stream
AscendStream stream(deviceId)
stream.CreatAscendStream();
// 创建图像解码类实例
ImageProcessor imageProcessor(deviceId);
// 解码后的Image类实例
Image decodedImage;
// 根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
// 缩放后的图像类实例
Image resizedImage;
// 异步调用缩放接口
ret = imageProcessor.Resize(decodedImage, Size(416, 416), resizedImage, Interpolation::HUAWEI_HIGH_ORDER_FILTER, stream);
// 调用同步接口,可以显式保证调用后续接口时缩放已完成
stream.Synchronize();
// 将 Image 类转换为 Tensor 类
Tensor tensorImg = resizedImage.ConvertToTensor();
// yoloV3模型推理
string yoloPath = "./model/yolov3_tf_bs1_fp16.om";
Model yoloV3(yoloPath, deviceId);
// 构造推理输入输出 (单batch)
vector<Tensor> yoloV3Inputs = {tensorImg};
vector<Tensor> yoloV3Outputs = {};
// 开始异步推理
ret = yoloV3.Infer(yoloV3Inputs, yoloV3Outputs,stream);
// 调用同步接口,可以显式保证调用后续接口时缩放已完成
// 用户也可选择同步前在该stream串行其他异步接口
stream.Synchronize();
// 调用DestroyAscendStream销毁stream
stream.DestroyAscendStream();
}
//去初始化
MxBase::MxDeInit();
父主题: 使用API接口方式开发(C++)
编译运行
运行样例前,需设置mxVison环境变量。
source {mxVison安装目录}/mxVision/set_env.sh
编译
-
文件准备,用户准备好自己的源码文件“main.cpp”,以及“CMakeLists.txt”文件,“CMakeLists.txt”编写可参考如下内容:
# CMake lowest version requirementcmake_minimum_required(VERSION 3.5.2)# project informationproject(MindX_SDK_Sample)set(MX_SDK_HOME $ENV{MX_SDK_HOME})if (NOT DEFINED ENV{MX_SDK_HOME})string(REGEX REPLACE "(.*)/(.*)/(.*)/(.*)" "\\1" MX_SDK_HOME ${CMAKE_CURRENT_SOURCE_DIR})message(STATUS "set default MX_SDK_HOME: ${MX_SDK_HOME}")else ()message(STATUS "env MX_SDK_HOME: ${MX_SDK_HOME}")endif()# Compile optionsadd_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)add_definitions(-Dgoogle=mindxsdk_private)add_compile_options(-std=c++11 -fPIC -fstack-protector-all -Wall)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})set(CMAKE_CXX_FLAGS_DEBUG "-g")set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -s -pie")set(CMAKE_SKIP_RPATH TRUE)# add mxbase header pathinclude_directories(${MX_SDK_HOME}/include/${MX_SDK_HOME}/opensource/include/)# add mxbase lib pathlink_directories(${MX_SDK_HOME}/lib/${MX_SDK_HOME}/lib/modelpostprocessors/${MX_SDK_HOME}/opensource/lib/${MX_SDK_HOME}/opensource/lib64/)add_executable(main main.cpp)target_link_libraries(main glog mxbase opencv_world cpprest pthread mindxsdk_protobuf)install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) -
CMake编译。
-
在“CMakeLists.txt”文件所在目录新建“build”目录。
mkdir build -
进入“build”目录。
cd build -
执行cmake命令。
cmake .. -
执行make命令生成可执行文件“main”。
make -j
-
运行
执行编译生成的可执行文件即可运行程序。
./main
:::note 说明
- 若程序执行出现libascendcl.so报错,请参见程序执行出现libascendcl.so报错解决。
- 若尝试打印Device侧的Tensor、Image内存数据时出现coredump提示,请参见尝试打印Device侧的Tensor、Image内存数据时,发生coredump解决。 :::
父主题: 使用API接口方式开发(C++)
开发流程
流程介绍
图1 API开发流程

关键步骤说明
- 使用mxVision接口进行应用开发,需首先进行初始化才能进行后续处理,具体请参见初始化。
- 媒体数据处理/模型推理。
父主题: 使用API接口方式开发(Python)
初始化
功能介绍
mxVision应用开发初始化接口,在代码调用相关接口之前,需调用全局初始化函数mx_init()申请设备资源和日志资源。
示例代码
以下为初始化方法的代码示例,不可以直接拷贝运行,仅供参考。
全局初始化,加载设备资源和日志资源。
from mindx.sdk import base
base.mx_init()
## 执行全局初始化后即可正常调用mxVision接口
父主题: 使用API接口方式开发(Python)
图片解码
功能介绍
通过对输入图片数据进行解码处理,将本地图片转换为Image类,用于后续前处理和推理业务,类型目前支持JPEG和PNG格式。
接口调用流程
用户需准备好本地待解码的图片文件,初始化ImageProcessor类,通过调用ImageProcessor类的decode接口解码返回输出的Image对象。
图片解码调用流程参考如下:
图1 图片解码接口调用流程

关键步骤说明如下:
-
调用mx_init()接口进行全局初始化。
-
ImageProcessor初始化。
用户构造ImageProcessor对象,构造时需用户指定设备ID。
-
调用decode接口对图片进行解码。
用户需根据解码的不同需要,传入对应格式参数到decode接口。
示例代码
以下为功能特性关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
from mindx.sdk import base
from mindx.sdk.base import ImageProcessor, Image
## 图像解码
## 初始化ImageProcessor对象
imageProcessor = ImageProcessor(device_id)
image_path = "test_image.jpg"
## 读取图片路径进行解码,解码格式为nv12(YUV_SP_420)
decoded_image = imageProcessor.decode(image_path, base.nv12)
父主题: 媒体数据处理
在线提单