跳到主要内容

MindX SDK 应用开发指南

学习向导

使用导引

mxVision用户指南用于引导开发者基于现有模型,通过mxVision API接口开发方式或流程编排方式实现目标识别、图像分类等功能。

您可以了解到以下内容:

  • mxVision软件架构、基本概念以及各开发方式对应的使用流程。
  • 如何使用mxVision API接口进行应用开发,如何通过流程编排插件实现应用。

拥有C/C++、Python语言开发能力,对推理应用开发有一定了解的开发者,可更好的理解该产品。

初次使用,建议先了解基本概念,选择适合实际业务,理解习惯的开发方式,再通过对应的章节具体学习开发实现mxVision应用。

基本概念

表1 概念介绍

概念描述
同步/异步本文中提及的同步、异步是站在调用者和执行者的角度,在当前场景下,若在调用接口后不等待Device执行完成再返回,则表示调度是异步的;若在调用接口后需等待Device执行完成再返回,则表示调度是同步的。
HostHost指与Device相连接的x86_64服务器、ARM服务器,会利用Device提供的NN(Neural-Network )计算能力,完成业务。
DeviceDevice指安装了昇腾AI处理器的硬件设备,利用PCIe接口与Host侧连接,为Host提供NN计算能力。若存在多个Device,多个Device之间的内存资源不能共享。
StreamStream用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在Device上执行。
AIPPAIPP(Artificial Intelligence Pre-Processing)用于在AI Core上完成图像预处理,包括色域转换(转换图像格式)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等。 AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。
- 静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数(无法修改)。 如果使用静态AIPP方式,多Batch情况下共用同一份AIPP参数。
- 动态AIPP:模型转换时设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AIPP参数。 如果使用动态AIPP方式,多Batch可使用不同的AIPP参数。
动态Batch/动态分辨率在某些场景下,模型每次输入的batch size或分辨率是不固定的,如检测出目标后再执行目标识别网络,由于目标个数不固定导致目标识别网络输入BatchSize不固定。
- 动态Batch:用户执行推理时,其batch size是动态可变的。
- 动态分辨率: 用户执行推理时,每张图片的分辨率H * W是动态可变的。
动态维度(ND格式)为了支持Transformer等网络在输入格式的维度不确定的场景,需要支持ND格式下任意维度的动态设置。 ND表示支持任意格式,当前N ≤ 4。
通道在RGB色彩模式下,图像通道就是指单独的红色R、绿色G、蓝色B部分。也就是说,一幅完整的图像,是由红色绿色蓝色三个通道组成的,它们共同作用产生了完整的图像。同样在HSV色系中指的是色调H,饱和度S,亮度V三个通道。
DVPPDVPP(Digital Video Pre-Processing)是昇腾AI处理器内置的图像处理单元,通过媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、格式转换、图片编解码、视频编解码等。
VPCVPC(Vision Preprocessing Core)负责图像处理功能,支持对图片做抠图、缩放、格式转换等操作。
EULAEnd User License Agreement,华为企业业务最终用户许可协议。
AscendCLAscend Computing Languag,是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库,提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等API,能够实现利用昇腾硬件计算资源、在昇腾CANN平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。简单来说,就是统一的API框架,实现对所有资源的调用。

开发流程

关键步骤说明

  1. 使用mxVision接口进行应用开发,需首先进行初始化才能进行后续处理,在整体应用流程完成后还需进行去初始化,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常,具体请参见初始化与去初始化
  2. 媒体数据处理/模型推理。
    1. 媒体数据处理功能,可实现图像编解码、抠图、缩放、补边、色域转换等操作,具体请参见媒体数据处理
    2. 模型推理,可实现如目标识别,图像分类等应用,环节可参考以下几个步骤,具体请参见模型推理
      1. 模型推理前,需准备合适的om模型。
      2. 模型加载,将准备好的模型通过文件或内存方式加载到系统中,具体请参见模型推理
      3. (可选)媒体数据处理,模型推理前,可对输入的媒体数据进行处理,如图片解码、抠图、缩放、补边等操作。
      4. 模型执行,使用模型实现图片分类、目标识别等功能。
      5. (可选)模型后处理,对模型推理输出的数据进行后处理操作,此处根据用户的实际需求来处理推理结果,如整理为可理解阅读的具体结果。模型后处理支持通过三种方式进行:
        • (推荐)自行选择模型后处理方式。
        • 通过调用mxVision接口进行,具体操作请参见模型后处理
        • 在已有模型的基础上进行二次开发,具体请参见模型后处理开发
  3. 调用MxDeInit()接口进行去初始化,具体请参见初始化与去初始化

父主题: 使用API接口方式开发(C++)

初始化与去初始化

功能介绍

  • mxVision应用开发初始化接口,在代码调用相关接口之前,需调用全局初始化函数MxInit()申请设备资源和日志资源。
  • 如需配置全局变量(如调整VPC通道资源池数量),可调用MxInit(const AppGlobalCfg &globalCfg)接口,通过传入配置参数进行调整。

mxVision接口全部执行完毕后,用户需调用MxDeInit()接口对初始化的全局资源进行去初始化操作。

示例代码

以下为各初始化方法的代码示例,不可以直接拷贝编译运行,仅供参考。

  • 全局初始化,加载设备资源和日志资源。

    APP_ERROR ret = MxInit();
    // 执行全局初始化后即可正常调用mxVision接口
    ...
    // mxVision接口全部执行完毕后,调用去初始化接口释放全局资源
    ret = MxDeInit();
  • 全局初始化,加载全局变量。

    MxBase::AppGlobalCfg globalCfg;
    globalCfg.vpcChnNum = 48;
    APP_ERROR ret = MxInit(globalCfg);
    ...
    // mxVision接口全部执行完毕后,调用去初始化接口释放全局资源
    ret = MxDeInit();

父主题: 使用API接口方式开发(C++)

图片解码

功能介绍

通过对输入图片数据进行解码处理,将本地图片或图片数据转换为Image类,用于后续前处理和推理业务,类型目前支持JPEG和PNG格式。

接口调用流程

用户需准备好本地待解码的图片文件或待解码的图片数据,初始化ImageProcessor类,构造输出的Image对象,通过调用ImageProcessor类的Decode接口解码结果。

图片解码调用流程参考如下:

图1 图片解码接口调用流程

关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. ImageProcessor构造及初始化。

    用户构造ImageProcessor对象,在构造完成后可以调用InitJpegDecodeChannel()初始化通道,若不选择调用该接口,ImageProcessor将会在执行解码前自动进行通道初始化。

  3. 构造输出的Image对象。

    使用构造函数Image()存放待解码输出的图片对象。

  4. 准备数据。

    根据业务需求选择从文件加载图片从内存加载图片数据

  5. 调用Decode()接口对图片进行解码。

    用户需根据输如的不同数据类型,调用对应的Decode接口。

  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);
//(可选)初始化解码通道
imageProcessor.InitJpegDecodeChannel();
//图像解码
//解码后的图像类
Image decodedImage;
//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage, ImageFormat::YUV_SP_420);
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

父主题: 通过接口进行图像处理(Image)

Atlas 200I DK A2开发者套件

MindX SDK 应用开发指南

在线提单