API接口开发方式(Python)

本章节介绍的样例适用于Atlas 推理系列产品Atlas 200I/500 A2 推理产品

样例介绍

下面以Atlas 推理系列产品为例,使用Vision SDK Python接口开发图像分类应用进行演示,图像分类模型推理流程图如图1所示。样例取用Caffe框架ResNet-50模型。

图1 分类模型推理流程图

准备工作

  1. 请先完成Vision SDK安装部署后,再进行快速入门样例。

    表1 环境要求软件依赖

    软件依赖名称

    推荐版本

    获取链接

    操作系统

    请参见支持的硬件和操作系统

    -

    系统依赖

    -

    Ubuntu系统CentOS系统

    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

    1
    pip3 install numpy==1.25.2
    

    opencv-python

    4.9.0.80

    1
    pip3 install opencv-python==4.9.0.80
    

    Python

    3.9.2

    建议通过获取源码包编译安装,安装步骤可参考安装Python依赖

  2. 获取样例代码。

    请访问获取链接,获取样例代码压缩包。

  3. 登录已安装Vision SDK的开发环境并将样例代码压缩包上传。
  4. 解压样例代码压缩包,进入解压后的目录,命令参考如下。

    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
    

  5. 准备用于推理的图片数据。

    用户可使用样例中的“test.jpg”测试图片,也可获取其他图片进行测试(请将获取的图片名称更名为“test.jpg”)。

    图2 test.jpg

代码解析

在该样例中,关键步骤与代码参考如下,不可以直接拷贝编译运行,完整样例代码请参考样例文件。

  1. “main.py”文件中,引入样例所需的第三方库以及Vision SDK模型推理所需文件。
    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 资源
    
  2. 配置模型相关变量,如图片路径、模型路径、配置文件路径、标签路径等。
    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
    
  3. 对输入数据进行前处理。先使用OpenCV读入图片,得到三维数组,再进行相应的图片裁剪、缩放、转换颜色空间等处理并将其转化为推理所需要的数据格式(Tensor类型)。
     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类
    
  4. 使用model.infer()接口进行模型推理,得到模型输出结果。
    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]
    
  5. 对模型输出进行后处理。利用Vision SDK提供的后处理模块,可得到预测类别及其置信度并将其在原图上呈现。
     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. 配置环境变量(以CANN的默认安装路径“/usr/local/Ascend/ascend-toolkit”Vision SDK的安装路径/usr/local/Ascend/mxVision-{version}为例)。

    1
    2
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
    source /usr/local/Ascend/mxVision-{version}/set_env.sh
    

  2. 运行推理。

    1
    bash run.sh
    

    如返回如下信息,则表示运行成功。

    1
    2
    Standard Poodle: 0.98583984375
    save infer result success
    

    推理完成后,在当前文件夹下生成“result.png”文件,图片结果如图3所示,展示图片的类别标签及其对应的置信度

    图3 result.png文件