Skip to main content

模型加载

模型加载

按照模型构建中的说明构建出模型后,再加载该模型,为模型执行做准备。

接口调用流程

开发应用时,如果涉及整网模型推理,则应用程序中必须包含模型加载的代码逻辑,关于模型加载的接口调用流程,请先参见AscendCL接口调用流程了解整体流程,再查看本节中的流程说明。本节描述的是整网模型加载的接口调用流程,对于算子模型加载与执行的详细说明请参见单算子调用

AscendCL提供两套模型加载的接口,用户可根据编程习惯、使用场景选择对应的模型加载接口:

  • 图1所示,针对不同的加载方式(从文件加载、从内存加载等),只需设置接口中的配置参数,适用各种加载方式,但涉及多个接口配合使用,分别用于创建配置对象、设置对象中的属性值、加载模型。
  • 图2所示,根据不同的加载方式(从文件加载、从内存加载等)选择不同的接口,操作相对简单,但需要记住各种方式的加载接口

图1 模型加载流程(通过接口中的配置参数区分加载方式)

图2 模型加载流程(通过不同接口区分加载方式)

关键接口的说明如下:

  • 在模型加载前,需要先构建出适配昇腾AI处理器的离线模型(*.om文件),构建方式请参见模型构建

  • 当由用户管理内存时,为确保内存不浪费,在申请工作内存、权值内存前,需要调用aclmdlQuerySize接口查询模型运行时所需工作内存权值内存的大小

    如果模型输入数据的Shape不确定,则不能调用aclmdlQuerySize接口查询内存大小,在加载模型时,就无法由用户管理内存,因此需选择由系统管理内存的模型加载接口(例如,aclmdlLoadFromFileaclmdlLoadFromMem)。

  • 支持以下方式加载模型,模型加载成功后,返回标识模型的模型ID:

    • 使用aclmdlSetConfigOpt接口、aclmdlLoadWithConfig接口时,是通过配置对象中的属性来区分,在加载模型时是从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。
    • 使用以下接口时,是从使用的接口上区分从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。
      • aclmdlLoadFromFile:从文件加载离线模型数据,由系统内部管理内存。
      • aclmdlLoadFromMem:从内存加载离线模型数据,由系统内部管理内存。
      • aclmdlLoadFromFileWithMem:从文件加载离线模型数据,由用户自行管理模型运行的内存(包括工作内存和权值内存,工作内存用于模型执行过程中的临时数据,权值内存用于存放权值数据)。
      • aclmdlLoadFromMemWithMem:从内存加载离线模型数据,由用户自行管理模型运行的内存(包括工作内存和权值内存)。

示例代码

模型加载成功,会返回标识模型的ID,在模型执行时需要使用该ID。

您可以从样例介绍中获取完整样例代码。

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br><br>// 1.初始化变量。<br>// 此处的..表示相对路径,相对可执行文件所在的目录<br>// 例如,编译出来的可执行文件存放在out目录下,此处的..就表示out目录的上一级目录<br>const char* omModelPath = "../model/resnet50.om"<br>// ......<br>// 2.根据模型文件获取模型执行时所需的权值内存大小、工作内存大小。<br>aclError ret = aclmdlQuerySize(omModelPath, &modelMemSize_, &modelWeightSize_);<br>// 3.根据工作内存大小,申请Device上模型执行的工作内存。<br>ret = aclrtMalloc(&modelMemPtr_, modelMemSize_, ACL_MEM_MALLOC_HUGE_FIRST);<br>// 4.根据权值内存的大小,申请Device上模型执行的权值内存。<br>ret = aclrtMalloc(&modelWeightPtr_, modelWeightSize_, ACL_MEM_MALLOC_HUGE_FIRST);<br>// 5.加载离线模型文件,由用户自行管理模型运行的内存(包括权值内存、工作内存)。<br>// 模型加载成功,返回标识模型的ID。<br>ret = aclmdlLoadFromFileWithMem(modelPath, &modelId_, modelMemPtr_, modelMemSize_, modelWeightPtr_, modelWeightSize_);<br>// ......<br>

父主题: 模型推理

模型执行

基本原理

开发应用时,如果涉及整网模型推理,则应用程序中必须包含模型执行的代码逻辑,关于模型执行的接口调用流程,请先参见AscendCL接口调用流程了解整体流程,再查看本节中的流程说明。本节描述的是整网模型执行的接口调用流程,对于算子模型加载与执行的详细说明请参见单算子调用

  • 在模型加载之后,模型执行之前,需要准备输入、输出数据结构,将输入数据传输到模型输入数据结构的对应内存中。
  • 模型执行结束后,若无需使用输入数据、aclmdlDesc类型、aclmdlDataset类型、aclDataBuffer类型等相关资源,需及时释放内存、销毁对应的数据类型,防止内存异常。模型可能存在多个输入、多个输出,每个输入/输出的内存地址、内存大小用aclDataBuffer类型的数据来描述,针对每个输入/输出,需调用aclDestroyDataBuffer接口销毁相应的aclDataBuffer类型,并调用aclrtFree接口释放内存中的数据。

模型执行流程

图1 基本的模型推理流程

关键接口的说明如下:

  1. 调用aclmdlCreateDesc接口创建描述模型基本信息的数据类型。

  2. 调用aclmdlGetDesc接口根据模型加载中返回的模型ID获取模型基本信息

  3. 准备模型执行的输入、输出数据结构,具体流程,请参见准备模型执行的输入/输出数据结构

    如果模型的输入涉及动态Batch动态分辨率动态AIPP动态维度(ND格式)等特性,请参见模型动态Shape输入推理模型动态AIPP推理

  4. 执行模型推理

    对于固定的多Batch场景,需要满足batch size后,才能将输入数据发送给模型进行推理。不满足batch size时,用户需根据自己的实际场景处理。

    当前系统支持模型的同步推理和异步推理:

  5. 获取模型推理的结果,用于后续处理。

    • 对于同步推理,直接获取模型推理的输出数据即可。
    • 对于异步推理,在实现Callback功能时,在回调函数内获取模型推理的结果,供后续使用。
  6. 释放内存

    调用aclrtFree接口释放Device上的内存。

  7. 释放相关数据类型的数据

    在模型推理结束后,需依次调用aclDestroyDataBuffer接口、aclmdlDestroyDataset接口及时释放描述模型输入、输出数据类型的数据。如果存在多个输入、输出,需调用多次aclDestroyDataBuffer接口。

准备模型执行的输入/输出数据结构

AscendCL提供了以下数据类型来描述模型、描述其输入输出以及存放数据的内存,在模型执行前,需要构造好这些数据类型,作为模型执行的输入:

  • 使用aclmdlDesc类型的数据描述模型基本信息(例如输入/输出的个数、名称、数据类型、Format、维度信息等)。

    模型加载成功后,用户可根据模型的ID,调用aclmdlGetDesc接口获取该模型的描述信息,进而从模型的描述信息中获取模型输入/输出的个数、内存大小、维度信息、Format、数据类型等信息,可参见aclmdlDesc类型下的操作接口。

  • 使用aclmdlDataset类型的数据描述模型的输入/输出数据,模型可能存在多个输入、多个输出。

    调用aclmdlDataset类型下的操作接口添加aclDataBuffer类型的数据、获取aclDataBuffer的个数等。

  • 每个输入/输出的内存地址、内存大小用aclDataBuffer类型的数据来描述。

    调用aclDataBuffer类型下的操作接口获取内存地址、内存大小等。

    图2 aclmdlDataset类型与aclDataBuffer类型的关系

了解相关的数据类型后,可以使用这些数据类型的操作接口准备模型的输入、输出数据结构,如下图所示。

图3 模型执行的输入/输出数据结构的准备流程

关键说明如下:

示例代码

此处的示例代码是处理图片分类模型的输出结果,屏显每张图片的top5置信度的类别编号。用户可根据实际需求,自行实现模型推理输出数据的处理逻辑。

您可以从样例介绍中获取完整样例代码。

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br> 10<br> 11<br> 12<br> 13<br> 14<br> 15<br> 16<br> 17<br> 18<br> 19<br> 20<br> 21<br> 22<br> 23<br> 24<br> 25<br> 26<br> 27<br> 28<br> 29<br> 30<br> 31<br> 32<br> 33<br> 34<br> 35<br> 36<br> 37<br> 38<br> 39<br> 40<br> 41<br> 42<br> 43<br> 44<br> 45<br> 46<br> 47<br> 48<br> 49<br> 50<br> 51<br> 52<br> 53<br> 54<br> 55<br> 56<br> 57<br> 58<br> 59<br> 60<br> 61<br> 62<br> 63<br> 64<br> 65<br> 66<br> 67<br> 68<br> 69<br> 70<br> 71<br> 72<br> 73<br> 74<br> 75<br> 76<br> 77<br> 78<br> 79<br> 80<br> 81<br> 82<br> 83<br> 84<br> 85<br> 86<br> 87<br> 88<br> 89<br> 90<br> 91<br> 92<br> 93<br> 94<br> 95<br> 96<br> 97<br> 98<br> 99<br>100<br>101<br>102<br>103<br>104<br>105<br>106<br>107<br>108<br>109<br>110<br>111<br>112<br>113<br>114<br>115<br>116<br>cpp<br>// 1 根据模型的ID,获取该模型的描述信息。<br>// modelDesc_为aclmdlDesc类型。<br>modelDesc_ = aclmdlCreateDesc();<br>ret = aclmdlGetDesc(modelDesc_, modelId_);<br>// 2 准备模型推理的输入数据结构<br>// (1)申请输入内存<br>size_t modelInputSize;<br>void *modelInputBuffer = nullptr;<br>// 当前示例代码中的模型只有一个输入,所以index为0,如果模型有多个输入,则需要先调用aclmdlGetNumInputs接口获取模型输入的数量<br>modelInputSize = aclmdlGetInputSizeByIndex(modelDesc_, 0);<br>aclRet = aclrtMalloc(&modelInputBuffer, modelInputSize, ACL_MEM_MALLOC_NORMAL_ONLY);<br>// (2)准备模型的输入数据结构<br>// 创建aclmdlDataset类型的数据,描述模型推理的输入,input_为aclmdlDataset类型<br>input_ = aclmdlCreateDataset();<br>aclDataBuffer *inputData = aclCreateDataBuffer(modelInputBuffer, modelInputSize);<br>ret = aclmdlAddDatasetBuffer(input_, inputData);<br>// 3 准备模型推理的输出数据结构<br>// (1)创建aclmdlDataset类型的数据,描述模型推理的输出,output_为aclmdlDataset类型<br>output_ = aclmdlCreateDataset();<br>// (2)获取模型的输出个数.<br>size_t outputSize = aclmdlGetNumOutputs(modelDesc_);<br>// (3)循环为每个输出申请内存,并将每个输出添加到aclmdlDataset类型的数据中.<br>for (size_t i = 0; i < outputSize; ++i) &#123;<br> size_t buffer_size = aclmdlGetOutputSizeByIndex(modelDesc_, i);<br> void *outputBuffer = nullptr;<br> aclError ret = aclrtMalloc(&outputBuffer, buffer_size, ACL_MEM_MALLOC_NORMAL_ONLY);<br> aclDataBuffer* outputData = aclCreateDataBuffer(outputBuffer, buffer_size); <br> ret = aclmdlAddDatasetBuffer(output_, outputData);<br> &#125;<br>// 4 模型执行<br>string testFile[] = &#123;<br> "../data/dog1_1024_683.bin",<br> "../data/dog2_1024_683.bin"<br> &#125;;<br>for (size_t index = 0; index < sizeof(testFile) / sizeof(testFile[0]); ++index) &#123;<br> // 4.1 自定义函数ReadBinFile,调用C++标准库std::ifstream中的函数读取图片文件,输出图片文件占用的内存大小inputBuffSize以及图片文件存放在内存中的地址inputBuff<br> void *inputBuff = nullptr;<br> uint32_t inputBuffSize = 0;<br> auto ret = Utils::ReadBinFile(fileName, inputBuff, inputBuffSize);<br> <br> // 4.2 准备模型推理的输入数据<br> // 在申请运行管理资源时调用aclrtGetRunMode接口获取软件栈的运行模式<br> // 如果运行模式为ACL_DEVICE,则g_isDevice参数值为true,表示软件栈运行在Device侧,无需传输图片数据或在Device内传输数据 ;否则,需要调用内存复制接口将数据传输到Device<br> if (!g_isDevice) &#123;<br> // if app is running in host, need copy data from host to device<br> // modelInputBuffer、modelInputSize分别表示模型推理输入数据的内存地址、内存大小,在输入/输出数据结构准备时申请该内存<br> aclError aclRet = aclrtMemcpy(modelInputBuffer, modelInputSize, inputBuff, inputBuffSize, ACL_MEMCPY_HOST_TO_DEVICE);<br> (void)aclrtFreeHost(inputBuff);<br> &#125; else &#123; // app is running in device<br> aclError aclRet = aclrtMemcpy(modelInputBuffer, modelInputSize, inputBuff, inputBuffSize, ACL_MEMCPY_DEVICE_TO_DEVICE);<br> (void)aclrtFree(inputBuff);<br> &#125;<br> // 4.3 执行模型推理<br> // modelId_表示模型ID,在模型加载成功后,会返回标识模型的ID<br> // input_、output_分别表示模型推理的输入、输出数据,在准备模型推理的输入、输出数据结构时已定义<br> aclError ret = aclmdlExecute(modelId_, input_, output_)<br> <br> // 处理模型推理的输出数据,输出top5置信度的类别编号 <br> // output_表示模型执行的输出<br> for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(output_); ++i) &#123;<br> // 获取每个输出的内存地址和内存大小<br> aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, i);<br> void* data = aclGetDataBufferAddr(dataBuffer);<br> size_t len = aclGetDataBufferSizeV2(dataBuffer);<br> // 将内存中的数据转换为float类型<br> float *outData = NULL;<br> outData = reinterpret_cast<float*>(data);<br> <br> // 屏显每张图片的top5置信度的类别编号<br> map<float, int, greater<float> > resultMap;<br> for (int j = 0; j < len / sizeof(float); ++j) &#123;<br> resultMap[*outData] = j;<br> outData++;<br> &#125;<br> int cnt = 0;<br> for (auto it = resultMap.begin(); it != resultMap.end(); ++it) &#123;<br> // print top 5<br> if (++cnt > 5) &#123;<br> break;<br> &#125;<br> INFO_LOG("top %d: index[%d] value[%lf]", cnt, it->second, it->first);<br> &#125;<br>&#125;<br>// 5 释放模型推理的输入、输出资源<br>// 释放输入资源,包括数据结构和内存<br>for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(input_); ++i) &#123;<br> aclDataBuffer *dataBuffer = aclmdlGetDatasetBuffer(input_, i);<br> (void)aclDestroyDataBuffer(dataBuffer);<br>&#125;<br>(void)aclmdlDestroyDataset(input_);<br>input_ = nullptr;<br>aclrtFree(modelInputBuffer);<br>// 释放输出资源,包括数据结构和内存<br>for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(output_); ++i) &#123;<br> aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, i);<br> void* data = aclGetDataBufferAddr(dataBuffer);<br> (void)aclrtFree(data);<br> (void)aclDestroyDataBuffer(dataBuffer);<br>&#125;<br>(void)aclmdlDestroyDataset(output_);<br>output_ = nullptr;<br>

父主题: 模型推理

模型卸载

关于模型卸载的接口调用流程,请参见AscendCL接口调用流程

基本原理

在模型推理结束后,还需要通过aclmdlUnload接口卸载模型,并销毁aclmdlDesc类型的模型描述信息、释放模型运行的工作内存和权值内存。

示例代码

<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br><br>// 1. 卸载模型<br>aclError ret = aclmdlUnload(modelId_);<br>// 2. 释放模型描述信息<br>if (modelDesc_ != nullptr) &#123;<br> (void)aclmdlDestroyDesc(modelDesc_);<br> modelDesc_ = nullptr;<br>&#125;<br>// 3. 释放模型运行的工作内存<br>if (modelWorkPtr_ != nullptr) &#123;<br> (void)aclrtFree(modelWorkPtr_);<br> modelWorkPtr_ = nullptr;<br> modelWorkSize_ = 0;<br>&#125;<br>// 4. 释放模型运行的权值内存<br>if (modelWeightPtr_ != nullptr) &#123;<br> (void)aclrtFree(modelWeightPtr_);<br> modelWeightPtr_ = nullptr;<br> modelWeightSize_ = 0;<br>&#125;<br>

父主题: 模型推理

媒体数据处理视频课程

通过在线视频课程学习该功能,请参见AscendCL DVPP媒体数据处理

父主题: 媒体数据处理(含图像/视频等)

媒体数据处理基础知识

本章主要介绍图像/视频/音频数据处理的具体功能、接口调用流程以及示例代码。

图像/视频/音频数据处理的典型功能介绍

图1 图像/视频数据处理

各功能的介绍如下表所示,昇腾AI处理器对这些功能的支持度请参见功能支持度说明(AIPP当前各版本均支持)。

功能

子功能模块

描述

获取视频数据

ISP(Image Signal Processing)系统控制

系统控制部分用于注册3A算法、注册Sensor驱动、初始化ISP firmware、运行ISP firmware、退出ISP firmware、配置ISP属性等功能。

MIPI Rx ioctl命令字

MIPI Rx是一个支持多种差分视频输入接口的采集单元,通过combo-PHY接收MIPI/LVDS/sub-LVDS/HiSPi接口的数据,通过不同的功能模式配置,MIPI Rx可以支持多种速度和分辨率的数据传输需求,支持多种外部输入设备。

VI(Vedio Input)

VI模块捕获视频图像,可对其做裁剪、防抖、颜色优化、亮度优化、噪声去除等处理,并输出YUV或RAW格式的图像数据。

展示视频数据

VO(Vedio Output)

VO模块接收VPSS处理后的输出图像,可进行播放控制等处理,最后按用户配置的输出协议(当前仅支持HDMI)输出给外围视频设备。

VO可配合TDE(Two Dimensional Engine)模块、HIFB(Hisilicon Framebuffer)模块,利用硬件分别进行图形绘制、叠加图形层管理。

HDMI(High Definition Multimedia Interfac)

HDMI是全数字化影像和声音发送接口,可以发送未压缩的音频及视频信号。

TDE(Two Dimensional Engine)

TDE是图形二维加速引擎,它利用硬件为 OSD(On Screen Display)和 GUI(Graphics User Interface)提供快速的图形绘制功能,主要有快速拷贝、快速色彩填充、模式填充(当前仅支持Alpha Blending操作)。

HIFB(Hisilicon Framebuffer)

HIFB用于管理叠加图形层,它不仅提供Linux Framebuffer的基本功能,还在Linux Framebuffer的基础上增加图层显示起始位置修改、层间Alpha等扩展功能。

区域管理

Region

叠加在视频上的OSD (On Screen Display)和遮挡在视频上的色块统称为区域。区域管理模块,用于统一管理这些区域资源,用于在视频上显示一些特定信息(如通道号、时间戳等)、或在视频中填充色块用于遮挡,当前该功能需配合VPSS一起使用。

图像/视频数据处理

VPSS(Video Process Sub-System)

VPSS模块支持对输入图像进行统一预处理,如去噪、去隔行、裁剪等,然后再对各通道分别进行处理,如缩放、加边框等。

AIPP(Artificial Intelligence Pre-Processing)

AIPP人工智能预处理,在AI Core上完成数据预处理,主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等。

AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP中的一种来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。
  • 静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数(无法修改)。

    如果使用静态AIPP方式,多Batch情况下共用同一份AIPP参数,AIPP参数值在使用ATC工具进行模型转换时设置,ATC工具的详细说明请ATC工具使用指南

  • 动态AIPP:模型转换时仅设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AIPP参数。

    如果使用动态AIPP方式,多Batch可使用不同的AIPP参数,各Batch所使用的AIPP参数值通过AscendCL提供的接口来设置,请参见模型动态AIPP推理中的介绍。

DVPP(Digital Vision Pre-Processing)

DVPP是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括以下功能:

  • VPC(Vision Preprocessing Core):处理YUV、RGB等格式的图片,包括缩放、抠图、图像金字塔、色域转换等。
  • JPEGD(JPEG Decoder):JPEG压缩格式-->YUV格式的图片解码。
  • JPEGE(JPEG Encoder):YUV格式-->JPEG压缩格式的图片编码。
  • VDEC(Video Decoder):H264/H265格式-->YUV/RGB格式的视频码流解码。
  • VENC(Video Encoder):YUV420SP格式-->H264/H265格式的视频码流编码。
  • PNGD(PNG Decoder):PNG格式-->RGB格式的图片解码。

AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,但由于DVPP硬件上的约束,DVPP处理后的图片格式、分辨率有可能不满足模型的要求,因此还需要再经过AIPP进一步做色域转换、抠图、填充等处理。

音频数据获取和输出

AI(Audio Input)

AI模块捕获音频数据 。

AO(Audio Output)

通过ADEC模块解码后的音频数据,AO模块支持播放音频。

音频数据编解码

AENC(Audio Encoder)

通过AI模块获取的音频数据,AENC模块支持对其进行编码,输出音频码流。

ADEC(Audio Decoder)

ADEC支持解码G.711aG.711u等协议的音频码流,再通过AO模块播放音频。

DVPP图像/视频数据处理的典型使用场景

如果源图或视频的分辨率、格式等与模型的要求不一致时,我们可以将源图或视频处理成符合模型的要求。如下为典型场景的举例。

  • 视频解码、缩放

    使用Yolov3模型实现目标检测的场景下,用户提供的输入视频为H264/H265编码格式、分辨率为1920*1080,但Yolov3模型要求的输入图片格式为RGB/YUV、分辨率为416*416,两者不一致,此时可对视频执行以下一系列处理。

    图2 视频解码、缩放使用场景图

  • 图片解码、缩放、格式转换

    使用Resnet50模型实现图片分类的场景下,用户提供的输入图片为JPEG编码格式、分辨率为1280*720,但Resnet50模型要求的输入图片格式为RGB、分辨率为224*224,两者不一致,此时可对图片执行以下一系列处理。

    图3 图片解码、缩放、格式转换使用场景图

  • 抠图、缩放、格式转换

    使用Resnet50模型实现图片分类的场景下,用户提供的输入图片格式为YUV420SP、分辨率为1280*720,但Resnet50模型要求的输入图片格式为RGB、分辨率为224*224,两者不一致,此时对图片执行以下一系列处理。

    图4 抠图、缩放、格式转换使用场景图

媒体数据处理功能开发流程

图5 开发流程

  1. 准备环境

    请参见。

  2. 创建代码目录

    在开发应用前,您需要先创建目录,存放代码文件、编译脚本、测试图片数据、模型文件等

    如下仅是示例,供参考:

    ├App名称
    ├── model // 该目录下存放模型文件
    │ ├── xxx.json

    ├── data
    │ ├── xxxxxx // 测试数据

    ├── inc // 该目录下存放声明函数的头文件
    │ ├── xxx.h

    ├── out // 该目录下存放输出结果

    ├── src
    │ ├── xxx.json // 系统初始化的配置文件
    │ ├── CMakeLists.txt // 编译脚本
    │ ├── xxx.cpp // 实现文件
  3. (可选)构建模型

    模型推理场景下,必须要有适配昇腾AI处理器的离线模型(*.om文件),请参见模型构建

    :::note 说明 如果应用中涉及模型推理,则需要构建模型。 :::

  4. 开发应用

    依赖的头文件和库文件的说明请参见调用接口依赖的头文件和库文件说明

    如果应用中涉及模型推理,请参见模型推理扩展更多特性编写相应的代码。

  5. 编译运行应用,请参见应用调试

父主题: 媒体数据处理(含图像/视频等)

V1与V2版本的差别

本手册中媒体数据处理V1版本与媒体数据处理V2版本的接口都是描述处理媒体数据的接口,用于实现抠图、图片缩放、格式转换等功能,但两套接口不能混用

V2版本的功能比V1版本更多,如下:

  • JPEGE:V2版本接口支持高级的参数配置,如huffman表配置。
  • VENC:V2版本接口支持更加细化的码控参数配置和效果调优,如I/P帧QP、宏块码控等。
  • VDEC:V2版本接口支持更细化的内存控制,如设置输入码流缓存。
  • 视频数据获取功能(ISP系统控制&MIPI命令字&VI功能):仅V2版本接口支持。
  • VPSS视频处理:仅V2版本接口支持。
  • 音频相关功能,包括录音、播音、音量调节:仅V2版本接口支持。
  • 视频数据展示功能(VO功能&HDMI外设):仅V2版本接口支持。

昇腾AI处理器对V2版本各功能的支持度,请参见功能支持度说明

note

须知

Atlas 200/500 A2推理产品上,支持V1和V2两个版本的媒体数据处理接口,建议使用V2版本中的接口,保证后续版本接口功能以及业务的连续演进。

父主题: 媒体数据处理(含图像/视频等)

功能支持度说明

昇腾AI处理器对媒体数据处理V1版本各功能的支持度如下表所示。

昇腾AI处理器VPCJPEGDJPEGEPNGDVDECVENC
Atlas 200/500 A2推理产品

父主题: 媒体数据处理V1

在线提单