本章节介绍的样例适用于Atlas 推理系列产品和Atlas 200I/500 A2 推理产品。
下面以Atlas 推理系列产品为例,使用Vision SDK Python接口开发图像分类应用进行演示,图像分类模型推理流程图如图1所示。样例取用Caffe框架ResNet-50模型。
软件依赖名称 |
推荐版本 |
获取链接 |
||
---|---|---|---|---|
操作系统 |
请参见支持的硬件和操作系统 |
- |
||
系统依赖 |
- |
|||
CANN开发套件包 |
8.0.0 |
CANN获取链接。 |
||
npu-driver驱动包 |
Ascend HDK 24.1.0 |
请参见版本配套表,根据实际硬件设备型号选择与MindSDK 6.0.0配套的驱动、固件。 请参见各硬件产品中驱动和固件安装升级指南获取对应的指导。 |
||
npu-firmware固件包 |
Ascend HDK 24.1.0 |
|||
numpy |
1.25.2 |
|
||
opencv-python |
4.9.0.80 |
|
||
Python |
3.9.2 |
建议通过获取源码包编译安装,安装步骤可参考安装Python依赖。 |
请访问获取链接,获取样例代码压缩包。
1 2 |
unzip resnet50_sdk_python_sample.zip cd resnet50_sdk_python_sample |
样例代码目录结构参考如下。
1 2 3 4 5 6 7 8 9 10 11 12 |
|-- resnet50_sdk_python_sample | |-- main.py | |-- README.md | |-- run.sh # 运行程序的脚本,运行前建议使用dos2unix工具执行dos2uinx run.sh命令,对脚本进行格式化处理 | |-- data | | |-- test.jpg #测试使用的图片 | |-- model | | |-- resnet50.caffemodel | | |-- resnet50.prototxt | |-- utils | | |-- resnet50.cfg | | |-- resnet50_clsidx_to_labels.names |
用户可使用样例中的“test.jpg”测试图片,也可获取其他图片进行测试(请将获取的图片名称更名为“test.jpg”)。
在该样例中,关键步骤与代码参考如下,不可以直接拷贝编译运行,完整样例代码请参考样例文件。
1 2 3 4 5 6 |
import numpy as np # 用于对多维数组进行计算 import cv2 # 图片处理三方库,用于对图片进行前后处理 from mindx.sdk import Tensor # Vision SDK 中的 Tensor 数据结构 from mindx.sdk import base # Vision SDK 推理接口 from mindx.sdk.base import post # post.Resnet50PostProcess 为 resnet50 后处理接口 |
1 2 3 4 |
if __name__ == "__main__": base.mx_init() # 初始化 Vision SDK 资源 process() # 程序主要逻辑 base.mx_deinit() # 去初始化 Vision SDK 资源 |
1 2 3 4 5 6 7 |
'''配置模型相关变量''' pic_path = 'data/test.jpg' # 单张图片 model_path = "model/resnet50.om" # 模型路径 device_id = 0 # 指定运算的Device config_path='utils/resnet50.cfg' # 后处理配置文件 label_path='utils/resnet50_clsidx_to_labels.names' # 类别标签文件 img_size = 256 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'''前处理''' img_bgr = cv2.imread(pic_path) img_rgb = img_bgr[:,:,::-1] img = cv2.resize(img_rgb, (img_size, img_size)) # 缩放到目标大小 hw_off = (img_size - 224) // 2 # 对图片进行切分,取中间区域 crop_img = img[hw_off:img_size - hw_off, hw_off:img_size - hw_off, :] img = crop_img.astype("float32") # 转为 float32 数据类型 img[:, :, 0] -= 104 # 常数 104,117,123 用于将图像转换到Caffe模型需要的颜色空间 img[:, :, 1] -= 117 img[:, :, 2] -= 123 img = np.expand_dims(img, axis=0) # 扩展第一维度,适应模型输入 img = img.transpose([0, 3, 1, 2]) # 将 (batch,height,width,channels) 转为 (batch,channels,height,width) img = np.ascontiguousarray(img) # 将内存连续排列 img = Tensor(img) # 将numpy转为转为Tensor类 |
1 2 3 |
'''模型推理''' model = base.model(modelPath=model_path, deviceId=device_id) # 初始化 base.model 类 output = model.infer([img])[0] # 执行推理。输入数据类型:List[base.Tensor], 返回模型推理输出的 List[base.Tensor] |
1 2 3 4 5 6 7 8 9 10 11 |
'''后处理''' postprocessor = post.Resnet50PostProcess(config_path=config_path, label_path=label_path) # 获取后处理对象 pred = postprocessor.process([output])[0][0] # 利用Vision SDK接口进行后处理,pred:<ClassInfo classId=... confidence=... className=...> confidence = pred.confidence # 获取类别置信度 className = pred.className # 获取类别名称 print('{}: {}'.format(className, confidence)) # 打印出结果 '''保存推理图片''' img_res = cv2.putText(img_bgr, f'{className}: {confidence:.2f}', (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1) # 将预测的类别与置信度添加到图片 cv2.imwrite('result.png', img_res) print('save infer result success') |
1 2 |
source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/mxVision-{version}/set_env.sh |
1
|
bash run.sh |
如返回如下信息,则表示运行成功。
1 2 |
Standard Poodle: 0.98583984375 save infer result success |
推理完成后,在当前文件夹下生成“result.png”文件,图片结果如图3所示,展示图片的类别标签及其对应的置信度。