注:本样例涉及相关知识点,以下学习视频提供了系统且全面的讲解。
ATC 模型转换
该视频对于将原始模型转化为适配昇腾处理器的离线模型(*.om 文件)过程的讲解,帮助理解模型准备环节的原理与操作要点。
AscendCL 模型推理基础流程
该视频对于 AscendCL 模型推理基础流程的讲解,帮助理解本样例利用 YOLOV7 模型进行推理时,推理线程的运作原理和执行步骤。
AscendCL DVPP媒体数据处理
该视频对于DVPP的讲解,介绍了DVPP中的 图片或视频 进行 解码、缩放 等操作,帮助理解样例中数据预处理环节的具体实现方式
该样例主要是基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。
将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型(*.om文件),在样例中,加载该om文件,将1个*.h265格式的视频码流(仅包含一帧)循环10次解码出10张YUV420SP NV12格式的图片,对该10张图片做缩放,再对10张YUV420SP NV12格式的图片进行推理,分别得到推理结果后,再对推理结果进行处理,输出最大置信度的类别标识以及top5置信度的总和。
转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片,才能符合模型的输入要求。
样例代码结构如下所示。
├── caffe_model
│ ├── aipp.cfg //带色域转换参数的配置文件,模型转换时使用
├── data
│ ├── vdec_h265_1frame_rabbit_1280x720.h265 //测试数据,需要按指导获取测试图片,放到data目录下
├── inc
│ ├── dvpp_process.h //声明数据预处理相关函数的头文件
│ ├── model_process.h //声明模型处理相关函数的头文件
│ ├── sample_process.h //声明资源初始化/销毁相关函数的头文件
│ ├── utils.h //声明公共函数(例如:文件读取函数)的头文件
│ ├── vdec_process.h //声明视频处理函数的头文件
├── scripts
│ ├── host_version.conf // version配置
│ ├── testcase_200dk.sh // Atlas200dk脚本
│ ├── testcase_300.sh // Atlas300脚本
├── src
│ ├── acl.json //系统初始化的配置文件
│ ├── CMakeLists.txt //编译脚本
│ ├── dvpp_process.cpp //数据预处理相关函数的实现文件
│ ├── main.cpp //主函数,图片分类功能的实现文件
│ ├── model_process.cpp //模型处理相关函数的实现文件
│ ├── sample_process.cpp //资源初始化/销毁相关函数的实现文件
│ ├── utils.cpp //公共函数(例如:文件读取函数)的实现文件
│ ├── vdec_process.cpp //声明视频处理函数的实现文件
├── .project //工程信息文件,包含工程类型、工程描述、运行目标设备类型等
├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
操作系统及架构:CentOS 7.6 x86_64、CentOS aarch64、Ubuntu 18.04 x86_64、EulerOS x86、EulerOS aarch64
编译器:g++或aarch64-linux-gnu-g++
芯片:Atlas 200/300/500 推理产品、Atlas 推理系列产品(配置Ascend 310P AI处理器)、Atlas 训练系列产品
python及依赖的库:python3.7.5
已在环境上部署昇腾AI软件栈,并配置对应的的环境变量,请参见Link中对应版本的CANN安装指南。
以下步骤中,开发环境指编译开发代码的环境,运行环境指运行算子、推理或训练等程序的环境,运行环境上必须带昇腾AI处理器。开发环境和运行环境可以合设在同一台服务器上,也可以分设,分设场景下,开发环境下编译出来的可执行文件,在运行环境下执行时,若开发环境和运行环境上的操作系统架构不同,则需要在开发环境中执行交叉编译。
配置CANN基础环境变量和Python环境变量,请参见Link。
以运行用户登录开发环境。
下载sample仓代码并上传至环境后,请先进入根目录下“cplusplus/level2_simple_inference/1_classification/vdec_resnet50_classification”样例目录。
请注意,下文中的样例目录均指“cplusplus/level2_simple_inference/1_classification/vdec_resnet50_classification”目录。
准备ResNet-50模型。
获取ResNet-50原始模型。
您可以从以下链接中获取ResNet-50网络的模型文件(*.prototxt)、权重文件(*.caffemodel),并以运行用户将获取的文件上传至开发环境的“样例目录/caffe_model“目录下。如果目录不存在,需要自行创建。
将ResNet-50网络转换为适配昇腾AI处理器的离线模型(*.om文件),转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片。
切换到样例目录,执行如下命令(以昇腾310 AI处理器为例):
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --soc_version=Ascend310 --insert_op_conf=caffe_model/aipp.cfg --output=model/resnet50_aipp
--model:原始模型文件路径。
--weight:权重文件路径。
--framework:原始框架类型。0:表示Caffe;1:表示MindSpore;3:表示TensorFlow;5:表示ONNX。
--soc_version:昇腾AI处理器的版本。进入“CANN软件安装目录/compiler/data/platform_config”目录,".ini"文件的文件名即为昇腾AI处理器的版本,请根据实际情况选择。
--insert_op_conf:插入AIPP(AI Preprocessing)算子的配置文件路径,用于在AI Core上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。
--output:生成的resnet50_aipp.om文件存放在“样例目录/model“目录下。建议使用命令中的默认设置,否则在编译代码前,您还需要修改sample_process.cpp中的omModelPath参数值。
const char* omModelPath = "../model/resnet50_aipp.om";
准备测试视频码流。
从以下链接获取测试视频码流文件,并以运行用户上传至开发环境的“样例目录/data“目录下。如果目录不存在,需自行创建。
配置CANN基础环境变量和Python环境变量,请参见Link。
编译代码。
以运行用户登录开发环境。
下载sample仓代码并上传至环境后,请先进入根目录下“cplusplus/level2_simple_inference/1_classification/vdec_resnet50_classification”样例目录。
请注意,下文中的样例目录均指“cplusplus/level2_simple_inference/1_classification/vdec_resnet50_classification”目录。
设置环境变量,配置程序编译依赖的头文件与库文件路径。
设置以下环境变量后,编译脚本会根据“{DDK_PATH}环境变量值/runtime/include/acl”目录查找编译依赖的头文件,根据{NPU_HOST_LIB}环境变量指向的目录查找编译依赖的库文件。“$HOME/Ascend”请替换“Ascend-cann-toolkit”包的实际安装路径。
注意,在配置{NPU_HOST_LIB}环境变量时,需使用的“runtime/lib64/stub”目录下*.so库,确保在编译基于AscendCL接口的应用程序时,不依赖其它组件(例如Driver)的*.so库,编译成功后,运行应用程序时,系统会根据LD_LIBRARY_PATH环境变量查找“Ascend-cann-toolkit安装目录/runtime/lib64”目录下的*.so库,同时会自动链接到所依赖的其它组件的*.so库。
当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
当开发环境与运行环境的操作系统架构不同时,配置示例如下所示:
例如,当开发环境为X86架构、运行环境为AArch64架构时,则涉及交叉编译,需在开发环境上安装AArch64架构的软件包,将{DDK_PATH}环境变量的路径指向AArch64架构的软件包安装目录(如下所示),便于使用与运行环境架构相同的软件包中的头文件和库文件来编译代码。
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
您可以登录对应的环境,执行“uname -a”命令查询其操作系统的架构。
切换到样例目录,创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host“。
mkdir -p build/intermediates/host
切换到“build/intermediates/host“目录,执行cmake生成编译文件。
“../../../src“表示CMakeLists.txt文件所在的目录,请根据实际目录层级修改。
将DCMAKE_SKIP_RPATH设置为TRUE,代表不会将rpath信息(即NPU_HOST_LIB配置的路径)添加到编译生成的可执行文件中去,可执行文件运行时会自动搜索实际设置的LD_LIBRARY_PATH中的动态链接库。
当开发环境与运行环境操作系统架构相同时,执行如下命令编译。
cd build/intermediates/host
cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
当开发环境与运行环境操作系统架构不同时,执行以下命令进行交叉编译。
例如,当开发环境为X86架构,运行环境为AArch64架构时,执行以下命令进行交叉编译。
cd build/intermediates/host
cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE
执行make命令,生成的可执行文件main在“样例目录/out“目录下。
make
运行应用。
以运行用户将开发环境的样例目录及目录下的文件上传到运行环境(Host),例如“$HOME/acl_vdec_resnet50”。
以运行用户登录运行环境(Host)。
切换到可执行文件main所在的目录,例如“$HOME/acl_vdec_resnet50/out”,给该目录下的main文件加执行权限。
chmod +x main
切换到可执行文件main所在的目录,例如“$HOME/acl_vdec_resnet50/out”,运行可执行文件。
./main
可执行文件执行成功后,在屏幕上的关键提示信息示例如下,提示信息中的classType表示类别标签、top1表示该分类的最大置信度、top5表示最大的5个置信度之和,这些值可能会根据版本、环境有所不同,请以实际情况为准。
说明: 类别标签和类别的对应关系与训练模型时使用的数据集有关,本样例使用的模型是基于imagenet数据集进行训练的,您可以在互联网上查阅imagenet数据集的标签及类别的对应关系,例如,可单击Link查看。
......
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_0, size=4000
[INFO] start check result file:./result/model_output_0
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_0.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_1, size=4000
[INFO] start check result file:./result/model_output_1
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_1.txt]
[INFO] result:classType[688],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_2, size=4000
[INFO] start check result file:./result/model_output_2
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_2.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_3, size=4000
[INFO] start check result file:./result/model_output_3
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_3.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_4, size=4000
[INFO] start check result file:./result/model_output_4
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_4.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_5, size=4000
[INFO] start check result file:./result/model_output_5
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_5.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_6, size=4000
[INFO] start check result file:./result/model_output_6
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_6.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_7, size=4000
[INFO] start check result file:./result/model_output_7
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_7.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_8, size=4000
[INFO] start check result file:./result/model_output_8
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_8.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] Process dvpp success
[INFO] model execute success
[INFO] output[0] DataBuffer, buffer addr = 0x10100007c000, buffer size = 4000
[INFO] memcopy output data from device to host buffer success.
[INFO] create output file success, filename=./result/model_output_9, size=4000
[INFO] start check result file:./result/model_output_9
[INFO] check result success, file exist
[INFO] reselut file: [./result/model_output_9.txt]
[INFO] result:classType[331],top1[xxxxxx],top5[xxxxxx]
[INFO] unload model success, modelId is 1
[INFO] execute sample success
......
在该样例中,涉及的关键功能点及关键接口,如下所示:
初始化
Device管理
Context管理
Stream管理
内存管理
数据传输
调用aclrtMemcpy接口通过内存复制的方式实现数据传输。
数据预处理
视频解码
调用aclvdecSendFrame接口将视频码流解码成YUV420SP格式图片。
缩放
调用acldvppVpcResizeAsync接口将YUV420SP NV12格式图片缩小成分辨率为224*224的图片。
模型推理
调用aclmdlLoadFromFileWithMem接口从*.om文件加载模型。
调用aclmdlExecute接口执行模型推理。
推理前,通过*.om文件中的色域转换参数将YUV420SP格式的图片转换为RGB格式的图片。
调用aclmdlUnload接口卸载模型。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。