编译及运行应用(昇腾910 AI处理器)
- 模型转换。
- 以运行用户登录开发环境。
- 参考《CANN 开发辅助工具指南》中的“ATC工具使用指南”章节,准备环境,包括获取工具、设置环境变量。
- 准备数据。
您可以从以下链接中获取ResNet-50网络的模型文件(*.prototxt)、预训练模型文件(*.caffemodel),并以运行用户将获取的文件上传至开发环境的“vpc_jpeg_resnet50_imagenet_classification样例目录/caffe_model”目录下。如果目录不存在,需要自行创建。
- 将ResNet-50网络转换为适配昇腾AI处理器的离线模型(*.om文件),转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片。
切换到vpc_jpeg_resnet50_imagenet_classification样例所在目录,执行如下命令:
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50_aipp --soc_version=${soc_version} --insert_op_conf=caffe_model/aipp.cfg
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
可从ATC安装路径的“atc/data/platform_config”目录下查看昇腾AI处理器的版本,对应“*.ini”文件的名字(不带.ini后缀)即为soc_version。
- --output:生成的resnet50_aipp.om文件存放在“样例目录/model”目录下。建议使用命令中的默认设置,否则在编译代码前,您还需要修改sample_process.cpp中的omModelPath参数值。
const char* omModelPath = "../model/resnet50_aipp.om";
关于各参数的详细解释,请参见《CANN 开发辅助工具指南》中的“ATC工具使用指南”章节。
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
- 以运行用户登录开发环境,并切换到vpc_jpeg_resnet50_imagenet_classification样例所在的目录。
- 编译代码。
- 设置环境变量,编译脚本src/CMakeLists.txt通过环境变量所设置的头文件、库文件的路径来编译代码。
如下为设置环境变量的示例,请将$HOME/Ascend/ascend-toolkit/latest替换为FwkACLlib安装包的实际安装路径。
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=$HOME/Ascend/ascend-toolkit/latest/fwkacllib/lib64/stub
设置环境变量后,还需修改src/CMakeLists.txt文件中的如下配置段,将“acllib”修改为“fwkacllib”。
# Header path include_directories( ${INC_PATH}/acllib/include/ ../inc/ )
使用“$HOME/Ascend/ascend-toolkit/latest/fwkacllib/lib64/stub”目录下的*.so库,是为了编译基于AscendCL接口的代码逻辑时,不依赖其它组件(例如Driver)的任何*.so库。
编译通过后,在Host上运行应用时,通过配置环境变量,应用会链接到Host上“$HOME/Ascend/nnae/latest/fwkacllib/lib64”目录下的*.so库,运行时会自动链接到依赖其它组件的*.so库。
- 在样例目录下,创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host”。
mkdir -p build/intermediates/host
- 切换到“build/intermediates/host”目录,执行cmake生成编译文件。
“../../../src”表示CMakeLists.txt文件所在的目录,请根据实际目录层级修改。
基于运行环境的操作系统架构,配置的环境变量不同:
- 当开发环境与运行环境操作系统架构相同时,执行如下命令编译。
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
- 设置环境变量,编译脚本src/CMakeLists.txt通过环境变量所设置的头文件、库文件的路径来编译代码。
- 准备输入图片。
请从以下链接获取该样例的输入图片,并以运行用户将获取的文件上传至开发环境的“vpc_jpeg_resnet50_imagenet_classification样例目录/data”目录下。如果目录不存在,需自行创建。
https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/dvpp_vpc_8192x8192_nv12.yuv
https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/persian_cat_1024_1536_283.jpg
https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/wood_rabbit_1024_1061_330.jpg
https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/wood_rabbit_1024_1068_nv12.yuv
- 运行应用。
- 以运行用户将开发环境的vpc_jpeg_resnet50_imagenet_classification样例目录及目录下的文件上传到运行环境(Host),例如“$HOME/acl_vpc_jpege_resnet50”。
- 以运行用户登录运行环境(Host)。
- 设置环境变量。如下为设置环境变量的示例,请根据实际安装情况替换路径。
export LD_LIBRARY_PATH=$HOME/Ascend/nnae/latest/fwkacllib/lib64
- 切换到可执行文件main所在的目录,例如“acl_vpc_jpege_resnet50/out”,给该目录下的main文件加执行权限。
chmod +x main
- 切换到可执行文件main所在的目录,例如“acl_vpc_jpege_resnet50/out”,运行可执行文件。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,缩放,再进行模型推理,分别得到两张图片的推理结果。
./main 0
执行结果示例如下,提示信息中的classType表示类别标识、top1表示该分类的最大置信度、top5表示最大的5个置信度之和,这些值可能会根据版本、环境有所不同,请以实际情况为准(类别编号283表示["Persian cat"],类别编号330表示["wood rabbit", "cottontail", "cottontail rabbit"]):
[INFO] acl init success [INFO] open device 0 success [INFO] create context success [INFO] create stream success [INFO] dvpp init resource success [INFO] load model ../model/resnet50_aipp.om success [INFO] create model description success [INFO] create model output success [INFO]--------------------------------------------- [INFO] start to process picture:../data/persian_cat_1024_1536_283.jpg [INFO] call JpegD [INFO] call vpcResize [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[283], top1[xxxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] start to process picture:../data/wood_rabbit_1024_1061_330.jpg [INFO] call JpegD [INFO] call vpcResize [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[330], top1[xxxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] Unload model success, modelId is 1 [INFO] execute sample success [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device is 0
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,抠图,再进行模型推理,分别得到两张图片的推理结果。
./main 1
执行结果示例如下,提示信息中的classType表示类别标识、top1表示该分类的最大置信度、top5表示最大的5个置信度之和,这些值可能会根据版本、环境有所不同,请以实际情况为准(类别编号284表示["Siamese cat", "Siamese"],类别编号330表示["wood rabbit", "cottontail", "cottontail rabbit"]):
[INFO] acl init success [INFO] open device 0 success [INFO] create context success [INFO] create stream success [INFO] dvpp init resource success [INFO] load model ../model/resnet50_aipp.om success [INFO] create model description success [INFO] create model output success [INFO]--------------------------------------------- [INFO] start to process picture:../data/persian_cat_1024_1536_283.jpg [INFO] call JpegD [INFO] call vpcCrop [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[284], top1[xxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] start to process picture:../data/wood_rabbit_1024_1061_330.jpg [INFO] call JpegD [INFO] call vpcCrop [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[330], top1[xxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] Unload model success, modelId is 1 [INFO] execute sample success [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device is 0
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,抠图贴图,再进行模型推理,分别得到两张图片的推理结果。
./main 2
执行结果示例如下,提示信息中的classType表示类别标识、top1表示该分类的最大置信度、top5表示最大的5个置信度之和,这些值可能会根据版本、环境有所不同,请以实际情况为准(类别编号284表示["Siamese cat", "Siamese"],类别编号331表示["hare"]):
[INFO] acl init success [INFO] open device 0 success [INFO] create context success [INFO] create stream success [INFO] dvpp init resource success [INFO] load model ../model/resnet50_aipp.om success [INFO] create model description success [INFO] create model output success [INFO]--------------------------------------------- [INFO] start to process picture:../data/persian_cat_1024_1536_283.jpg [INFO] call JpegD [INFO] call vpcCropAndPaste [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[284], top1[xxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] start to process picture:../data/wood_rabbit_1024_1061_330.jpg [INFO] call JpegD [INFO] call vpcCropAndPaste [INFO] Process dvpp success [INFO] model execute success [INFO] result : classType[331], top1[xxxxxx], top5[xxxxxx] [INFO]--------------------------------------------- [INFO] Unload model success, modelId is 1 [INFO] execute sample success [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device is 0
- 将一张YUV420SP格式的图片编码为*.jpg格式的图片。
./main 3
执行结果示例如下:
[INFO] acl init success [INFO] open device 0 success [INFO] create context success [INFO] create stream success [INFO] dvpp init resource success [INFO] start to process picture:../data/wood_rabbit_1024_1068_nv12.yuv [INFO] call JpegE [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device is 0
- 将一张分辨率为8192*8192的YUV420SP格式的图片缩放至4000*4000。
./main 4
执行结果示例如下:
[INFO] acl init success [INFO] open device 0 success [INFO] create context success [INFO] create stream success [INFO] get run mode success [INFO] dvpp process 8k resize begin [INFO] dvpp init resource success [INFO] dvpp process 8k resize success [INFO] end to destroy stream [INFO] end to destroy context [INFO] end to reset device is 0 [INFO] end to finalize acl
执行可执行文件成功后,同时会在main文件同级的result目录下生成结果文件,便于后期查看。结果文件如下:
- dvpp_output_0:persian_cat_1024_1536_283.jpg图片经过缩放或抠图或抠图贴图之后的结果图片。
- dvpp_output_1:wood_rabbit_1024_1061_330.jpg图片经过缩放或抠图或抠图贴图之后的结果图片。
- model_output_0:persian_cat_1024_1536_283.jpg图片的模型推理结果,二进制文件。
- model_output_0.txt:persian_cat_1024_1536_283.jpg图片的模型推理结果,txt文件。
- model_output_1:wood_rabbit_1024_1061_330.jpg图片的模型推理结果,二进制文件。
- model_output_1.txt:wood_rabbit_1024_1061_330.jpg图片的模型推理结果,txt文件。
- jpege_output_0.jpg:wood_rabbit_1024_1068_nv12.yuv图片结果编码后的结果图片。
- dvpp_vpc_4000x4000_nv12.yuv:dvpp_vpc_8192x8192_nv12.yuv图片缩放后的结果图片。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片,缩放,再进行模型推理,分别得到两张图片的推理结果。