一、学习目标
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并进行编译运行.