基于ResNet-50网络实现图片分类(图片解码+缩放+同步推理)
功能描述
该样例主要是基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。
将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型(*.om文件),在样例中,加载该om文件,对2张*.jpg图片进行解码、缩放、推理,分别得到推理结果后,再对推理结果进行处理,输出最大置信度的类别标识。
转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片,才能符合模型的输入要求。
原理介绍
在该样例中,涉及的关键功能点,如下表所示。
初始化 |
|
---|---|
Device管理 |
|
Stream管理 |
|
内存管理 |
执行媒体数据处理时,若需要申请Device上的内存存放输入或输出数据,需调用acldvppMalloc申请内存、调用acldvppFree接口释放内存。 |
数据传输 |
如果在Host上运行应用,则需调用aclrtMemcpy接口:
如果在板端环境上运行应用,则无需进行数据传输。 |
媒体数据处理V1 |
|
模型推理 |
|
数据后处理(单算子调用) |
处理模型推理的结果,通过调用算子Cast将推理结果的数据类型从float32转成float16,再调用ArgMaxD算子从推理结果中查找最大置信度的类别标识。 通过aclopSetModelDir接口加载单算子模型文件,通过aclopCast接口执行Cast算子、通过aclopExecuteV2接口执行ArgMaxD算子。 |
目录结构
样例代码结构如下所示。
├── caffe_model │ ├── aipp.cfg //带色域转换参数的配置文件,模型转换时使用 ├── data │ ├── dog1_1024_683.jpg //测试数据,需要按指导获取测试图片,放到data目录下 │ ├── dog2_1024_683.jpg //测试数据,需要按指导获取测试图片,放到data目录下 ├── inc │ ├── dvpp_process.h //声明媒体数据处理相关函数的头文件 │ ├── model_process.h //声明模型处理相关函数的头文件 │ ├── sample_process.h //声明资源初始化/销毁相关函数的头文件 │ ├── singleOp_process.h //声明单算子执行相关函数的头文件 │ ├── utils.h //声明公共函数(例如:文件读取函数)的头文件 ├── out │ ├── op_models │ ├──├──op_list.json //Cast算子和ArgMaxD算子的算子描述信息 ├── src │ ├── acl.json //系统初始化的配置文件 │ ├── CMakeLists.txt //编译脚本 │ ├── dvpp_process.cpp //媒体数据处理相关函数的实现文件 │ ├── main.cpp //主函数,图片分类功能的实现文件 │ ├── model_process.cpp //模型处理相关函数的实现文件 │ ├── sample_process.cpp //资源初始化/销毁相关函数的实现文件 │ ├── singleOp_process.cpp //单算子执行相关函数的实现文件 │ ├── utils.cpp //公共函数(例如:文件读取函数)的实现文件 ├── .project //工程信息文件,包含工程类型、工程描述、运行目标设备类型等 ├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
编译及运行应用(Control CPU开放形态)
- 模型转换。
- 以运行用户登录开发环境。
- 参考《ATC工具使用指南》,准备环境,包括获取工具、设置环境变量。
- 准备数据。
您可以从以下链接中获取ResNet-50网络的模型文件(*.prototxt)、权重文件(*.caffemodel),并以运行用户将获取的文件上传至开发环境的“vpc_resnet50_imagenet_classification样例目录/caffe_model”目录下。如果目录不存在,需要自行创建。
- 将ResNet-50网络转换为适配昇腾AI处理器的离线模型(*.om文件),转换模型时,需配置色域转换参数,用于将YUV420SP格式的图片转换为RGB格式的图片。
切换到vpc_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";
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
- 将Cast和ArgMaxD两个算子的算子描述信息(*.json文件)编译成适配昇腾AI处理器的离线模型(*.om文件),用于运行算子时使用。
切换到vpc_resnet50_imagenet_classification样例所在的目录,执行如下命令:
atc --singleop=out/op_models/op_list.json --soc_version=${soc_version} --output=out/op_models
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
可从ATC安装路径的“atc/data/platform_config”目录下查看昇腾AI处理器的版本,对应“*.ini”文件的名字(不带.ini后缀)即为soc_version。
- --output参数:生成的om文件必须放在“out/op_models”目录下。
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
- 以运行用户登录开发环境,并切换到vpc_resnet50_imagenet_classification样例所在的目录。
- 准备输入图片。
请从以下链接获取该样例的输入图片,并以运行用户将获取的文件上传至开发环境的“vpc_resnet50_imagenet_classification样例目录/data”目录下。如果目录不存在,需自行创建。
https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg
https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg
- 运行应用。
- 以运行用户将开发环境的vpc_resnet50_imagenet_classification样例目录及目录下的文件上传到运行环境(Device),例如“$HOME/acl_dvpp_resnet50”。
- 以运行用户登录运行环境(Device)。
- 切换到可执行文件main所在的目录,例如“acl_dvpp_resnet50/out”,给该目录下的main文件加执行权限。
chmod +x main
- 切换到可执行文件main所在的目录,例如“acl_dvpp_resnet50/out”,运行可执行文件。
./main
执行成功后,在屏幕上显示最大置信度的类别标识,示例如下,类别编号161表示["basset", "basset hound"],类别编号267表示["standard poodle"]。
[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] start to process picture:../data/dog1_1024_683.jpg [INFO] Process dvpp success [INFO] model execute success [INFO] execute singleOp Cast success [INFO] execute ArgMaxD success [INFO] singleOp process success [INFO] ---> index of classification result is 161 [INFO] start to process picture:../data/dog2_1024_683.jpg [INFO] Process dvpp success [INFO] model execute success [INFO] execute singleOp Cast success [INFO] execute ArgMaxD success [INFO] singleOp process success [INFO] ---> index of classification result is 267 [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