1 样例调试
1.1 日志文件
运行应用程序后,若出现报错或异常,需录取日志进一步定位问题。日志文件的默认目录为$HOME/ascend/log。
- 可通过环境变量指定日志文件的落盘路径
export ASCEND_PROCESS_LOG_PATH=/$HOME/xxx
但需要确保该目录为任意有读写权限的目录。
- 可通过环境变量移目志打屏显示
export ASCEND_SLOG_PRINT_T0_STDOUT=1
如果使用打屏方式显示日志,也可以在启动应用进程时,通过输出主定向方式将白志保存到指定文件中。例如:/main > log.txt。
1.2 日志格式
1.3 接口调用逻辑问题
1.4 软件约束问题
- 输入图片格式不支持,JPEG图片解码失败
- 注册算子数超过最大规格,模型加载失败
- 使用正确的输入图片格式
- 按限制使用规定数量的算子
1.5 输入数据问题
- 输入码流异常,视频解码丢帧/丢包
- 输入图片异常,JPEG图片解码失败
- 检查异常码流
- 检查异常图片
2 端到端样例结构
2.1 开发说明
对于CV类的应用开发,一般而言都有如下几个步骤:
- 样例结构设计
设计样例的流程编排,为后续步骤做准备。 - 原始模型及输入输出分析
分析模型的输入输出,将模型转换为离线om模型。 - 样例编写
根据编排好的流程及转换完成的模型进行样例的编写。 - 样例编译运行
编写CMakeList,并进行样例编译与运行。
本章将结合sampleResnetDVPP的样例对流程进行介绍,样例效果如下:
2.2 样例结构
- 模型转换:使用ATC工具将Resnet50.onnx模型转换为离线om模型。
- 资源初始化:初始化所有资源,包括DVPP初始化、模型初始化等。
- 输入数据处理:使用DVPP将数据处理到模型需要的大小。
- 模型推理:便用om模型进行推理。
- 输出数据处理:对模型推理结果进行处理,该样例是将输出前五置信度的标签进行打印。
- 资源释放:释放所有资源,包括DVPP及模型资源等。
- 数据传输:样例运行过程中进行的数据传输动作
3 原始模型及输入输出分析
3.1 原始模型输入分析
3.2 原始模型输出分析
3.3 数据预处理/后处理分析
为了加快图片处理速度,所以预处理需要使用DVPP,根据前面得到的输入数据信息,预处理需要经过如下步骤:
其中AIPP的操作需要在模型转换的过程中操作。预处理如图所示进行JpegD和Resize即可。
由模型输出分析可知,输出结果为1000个类别的置信度。所以数据后处理操作如下:
- 将1000个置信度信息保存下来。
- 将1000个置信度结果相加。
- 取出topk的置信度结果并除以总置信度取值〈相当于做一次softmax,将置信度归一化到[0,1]之间,且保证所有置信度相加结果为1)。
- 输出topk的标签及置信度。
4 样例编写
4.1 模型转换
分析完模型的输入输出,预处理及后处理后,接下来就要使用昇腾CANN提供的ATC工具进行模型转换了。
由前面的分析可以知道,ATC需要进行色域转换、减均值和归一化的操作。同时由于数据并未像pytorch数据处理一样,归一化到[0,1]之间,所以实际数据内容还是[0,255]的。所以AIPP整体需要进行如下处理:
- 数据需要从YUV专换成RGB格式;
- 减去的均值mean应该是[0.485255,0.456255,0.406*255];
- 除去的系数std应该是[0.229255,0.224255,0.225*255];
- 由于原本的计算公式可抽象为(data-m ean)/std,而在AIPP中计算公式可抽象为(data-m ean)std,所以系数std应该为[1/(0.229255),1/(0.224255),1/(0.225255)];