【2023 · CANN训练营第一季】- 应用开发深入讲解 第四节 学习笔记

一、学习目标

1.了解DVPP+推理端到端样例的执行流程和原理

2.学会如何分析模型及CV样例如何开发

二、样例调试

1.日志

(1)运行应用程序后,若出现报错或异常,需获取日志进一步定位问题。日志文件的默认目录为SHOME/ascend/log,·可通过环境变量指定日志文件的落盘路径,但需确保该目录为任意有读写权限的目录。

export ASCEND_PROCESS_LOG_PATH=/$HOME/xxx

可通过环境变量将日志打屏显示

export ASCEND_SLOG_PRINT_TO_STDOUT=1

(2)日志格式如下:

[Level] ModuleName(PID,PName):DateTimeMS [FileName:LineNumber]LogContent

(3)日志级别设置

日志模块根据系统设置的日志级别,记录不同详细程度的内容,满足不同系统维护需求。

设置全局日志级别,例如:

export ASCEND_GLOBAL_LOG_LEVEL=1

设置模块日志级别,例如:

export ASCEND_MODULE_LOG_LEVEL=TBE=O:RUNTIME=0

开启Event日志:

export ASCEND_GLOBAL_EVENT_ENABLE=O

2.接口调用逻辑问题

3.软件约束问题

4. 输入数据问题

三、样例结构

结合sampleResnetDVPP样例进行分析

样例流程如图:

模型转换:使用ATC工具将Resnet50.onnx模型转换为离线om模型。
资源初始化:初始化所有资源,包括DVPP初始化、模型初始化等。
输入数据处理:使用DVPP将数据处理到模型需要的大小。
模型推理:使用om模型进行推理。
输出数据处理:对模型推理结果进行处理,该样例是将输出前五置信度的标签进行打印。
资源释放:释放所有资源,包括DVPP及模型资源等。
数据传输:样例运行过程中进行的数据传输动作

四、模型分析

原始模型及输入输出分析是应用开发中极为关键的一环,也是最难的一环,模型分析的正确与否直接决定了样例是否可以正确编写,以及编写后是否能正常输出。

主要包含:原始模型获取、原始模型输入分析、预处理分析、原始模型输出分析及后处理分析。

  

五、样例编写

1.模型转换

经过上一节的分析,需要使用aipp对数据进行预处理,具体需要实现的有:

(1)将输入从YUV转换成RGB格式

(2)输入数据归一化,均值为[0.485255,0.456255,0.406*255],系数为[1/0.229255,1/0.224255,1/0.225*255]

因此aipp配置为

2.资源初始化

(1)AscendCL初始化

使用AscendCL接口开发应用时,必须先初始化AscendCL,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常。

const char *aclConfigPath = "../src/acl.json";
aclError ret = aclInit(aclConfigPath);

(2)运行管理资源申请与释放

初始化AscendCL后,需要按照固定流程申请运行管理资源。

// 指定运算的Device
aclError ret = aclrtSetDevice(deviceId_);
// 显式创建一个Context,用于管理Stream对象
ret = aclrtCreateContext(&context_, deviceId_);
// 显式创建一个Stream,用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序执行任务
ret = aclrtCreateStream(&stream_);

(3)DVPP初始化

代码需要使用DVPP进行JpegD和Resize操作,由于这些操作中包含一些可复用的资源,所以在初始化中直接申请,避免程序运行过程中反复申请。     

//创建图片数据处理通道时的通道描述信息
dvppChannelDesc_ = acldvppCreateChannelDesc();
//创建图片数据处理的通道。
ret = acldvppCreateChannel(dvppChannelDesc_);
//创建图片缩放配置数据、指定缩放算法
acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig();
aclError ret = acldvppSetResizeConfigInterpolation(resizeConfig_, 0);
//vpc输入输出图片描述创建
vpc InputDesc_ = acldvppCreatePicDesc();
vpc OutputDesc_ = acldvppCreatePicDesc();
//JPEGD输出图片描述创建
jepgdoutputDesc_ = acldvppCreatePicDesc();

(4) 模型初始化

模型操作中存在可复用的操作,可以在初始化过程中进行操作。

3.输入数据处理

输入数据处理使用的是DVPP,主要为图片数据加载->JPEGD解码->VPC处理。

4.模型推理及数据后处理

5.资源释放

当程序运行结束后,需要将初始化的资源全部释放。

六、样例编译运行

编写CMakeList并进行编译运行.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值