00 引言
Vision SDK是MindSDK中面向图片和视频视觉分析的SDK,提供了基本的视频、图像智能分析能力及编程框架。
-
通过API接口方式开发:提供原生的推理API以及算子加速库,用户可通过调用API接口的方式开发应用。对于有固定应用开发流程的用户,建议采用此方式,借用Vision SDK提供算法加速能力构建CV应用。
-
通过流程编排方式开发:采用模块化的设计理念,将业务流程中的各个功能单元封装成独立的插件。用户可以用流程编排的方式,通过插件的串接快速构建业务,进行应用开发。此方式提供常用功能插件,具备流程编排能力,提供插件自定义开发功能。 Vision SDK致力于简化昇腾芯片推理业务开发过程,降低使用昇腾芯片开发的门槛,相比于ACLlite,它更简单易用。
下面以Atlas 推理系列产品为例,使用Vision SDKPython接口开发图像分类应用进行演示,图像分类模型推理流程图如图所示。样例取用Caffe框架ResNet-50模型。
01 准备工作
-
获取样例代码。
请访问获取链接,获取样例代码压缩包。
-
登录已安装Vision SDK的开发环境并将样例代码压缩包上传。
-
解压样例代码压缩包,进入解压后的目录,命令参考如下。
unzip resnet50_sdk_python_sample.zip
cd resnet50_sdk_python_sample
-
准备用于推理的图片数据。
用户可使用样例中的“test.jpg”测试图片,也可获取其他图片进行测试(请将获取的图片名称更名为“test.jpg”)。
02 代码解析
在该样例中,关键步骤与代码参考如下,不可以直接拷贝编译运行,完整样例代码请参考样例文件。
-
在“main.py”文件中,引入样例所需的第三方库以及Vision SDK模型推理所需文件。
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 后处理接口
程序主要流程如下:
if __name__ == "__main__":
base.mx_init() # 初始化 Vision SDK 资源
process() # 程序主要逻辑
base.mx_deinit() # 去初始化 Vision SDK 资源
-
配置模型相关变量,如图片路径、模型路径、配置文件路径、标签路径等。
'''配置模型相关变量'''
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
-
对输入数据进行前处理。先使用OpenCV读入图片,得到三维数组,再进行相应的图片裁剪、缩放、转换颜色空间等处理并将其转化为推理所需要的数据格式(Tensor类型)。
'''前处理'''
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类
-
使用model.infer()接口进行模型推理,得到模型输出结果。
'''模型推理'''
model = base.model(modelPath=model_path, deviceId=device_id) # 初始化 base.model 类
output = model.infer([img])[0] # 执行推理。输入数据类型:List[base.Tensor], 返回模型推理输出的 List[base.Tensor]
-
对模型输出进行后处理。利用Vision SDK提供的后处理模块,可得到预测类别及其置信度并将其在原图上呈现。
'''后处理'''
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')
03 运行推理
-
配置环境变量(以CANN的默认安装路径“/usr/local/Ascend/ascend-toolkit”和Vision SDK的安装路径/usr/local/Ascend/mxVision-{version}为例)。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/mxVision-{version}/set_env.sh
-
运行推理。
bash run.sh
如返回如下信息,则表示运行成功。
Standard Poodle: 0.98583984375
save infer result success
推理完成后,在当前文件夹下生成“result.png”文件,图片结果如图所示,展示图片的类别标签及其对应的置信度。