下载
中文
注册

运行图像分类样例

本节以容器OS为ubuntu作为示例,通过在容器中运行ResNet-50网络图片分类样例,验证环境是否可用。

样例描述

基于Caffe ResNet-50网络实现图片分类,该样例主要是基于Caffe ResNet-50网络(单输入、单Batch)实现图片分类的功能。

在该样例中:

  1. 先使用样例提供的脚本transferPic.py,将2张*.jpg图片都转换为*.bin格式,同时将图片从1024*683的分辨率缩放为224*224。
  2. 加载离线模型om文件,对2张图片进行同步推理,分别得到推理结果,再对推理结果进行处理,输出top5置信度的类别标识。

在加载离线模型前,提前将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型。

样例代码结构如下所示

├── data
│   ├── dog1_1024_683.jpg            //测试数据,需要按指导获取测试图片,放到data目录下
│   ├── dog2_1024_683.jpg            //测试数据,需要按指导获取测试图片,放到data目录下
 
├── inc
│   ├── model_process.h               //声明模型处理相关函数的头文件
│   ├── sample_process.h              //声明资源初始化/销毁相关函数的头文件                   
│   ├── utils.h                       //声明公共函数(例如:文件读取函数)的头文件
 
├── script
│   ├── transferPic.py               //将*.jpg转换为*.bin,同时将图片从1024*683的分辨率缩放为224*224
 
├── src
│   ├── acl.json         //系统初始化的配置文件
│   ├── CMakeLists.txt         //编译脚本
│   ├── main.cpp               //主函数,图片分类功能的实现文件
│   ├── model_process.cpp      //模型处理相关函数的实现文件
│   ├── sample_process.cpp     //资源初始化/销毁相关函数的实现文件                                          
│   ├── utils.cpp              //公共函数(例如:文件读取函数)的实现文件
 
├── .project     //工程信息文件,包含工程类型、工程描述、运行目标设备类型等
├── CMakeLists.txt    //编译脚本,调用src目录下的CMakeLists文件

获取样例

获取样例需要下载相关依赖,请确保容器能够连接网络。

操作步骤如下:

  1. 执行如下命令,进入容器(本例为“1dc80f32c263”)。
    docker exec -it 1dc80f32c263 /bin/bash
  2. 执行如下命令安装依赖。
    apt update 
    apt install git cmake -y
  3. 在容器任意目录下(如“/home”)执行如下命令获取sample仓代码。
    cd /home
    git clone https://gitee.com/ascend/samples.git

    如果返回类似以下回显信息:

    fatal: unable to access 'https://gitee.com/ascend/samples.git/': server certificate verification failed. CAfile: none CRLfile: none

    则执行git config --global http.sslVerify "false"命令关闭证书检验,再执行git clone https://gitee.com/ascend/samples.git命令获取sample仓代码。

准备模型和图片

  1. 执行如下命令安装Python依赖。
    pip3 install Pillow attrs psutil
  2. 进入sample仓代码所在目录,执行以下命令,进入样例目录“samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification”
    cd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification

    下文中的“样例目录”均指“samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification”目录

  3. 准备ResNet-50模型
    1. 获取ResNet-50原始模型。
      执行如下命令创建caffe_model目录,并获取ResNet-50网络的模型文件(*.prototxt)、权重文件(*.caffemodel)。
      mkdir -p caffe_model
      cd caffe_model
      wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt --no-check-certificate
      wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel --no-check-certificate
    2. 配置环境变量。
      source /usr/local/Ascend/ascend-toolkit/set_env.sh 
    3. “样例目录”下执行如下命令将ResNet-50原始模型转换为适配昇腾AI处理器的离线模型(*.om文件)。
      cd /home/samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
      atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascendxxx --input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:0

      其中“--soc_version”参数值(加粗内容所示)需根据npu-smi info命令查询的Name参数值填写。

      • --soc_version:昇腾AI处理器的版本,格式为Ascendxxx

        xxx为Name参数值。需执行npu-smi info命令,获取Name参数值。

      • --model:原始模型文件路径。
      • --weight:权重文件路径。
      • --framework:原始框架类型。0:表示Caffe;1:表示MindSpore;3:表示TensorFlow;5:表示ONNX。
      • --soc_version:昇腾AI处理器的版本。
      • --input_format:输入数据的Format。
      • --input_fp16_nodes:指定输入数据类型为FP16的输入节点名称。
      • --output_type和--out_nodes:这2个参数配合使用,指定prob节点的第一个输出的数据类型为float32。
      • --output:生成的resnet50.om文件存放在“样例目录/model”目录下。
  4. 准备测试图片。

    “样例目录/data”目录下获取样例图片,如果data目录不存在,可在样例目录下执行mkdir -p data命令创建。

    cd data
    wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg --no-check-certificate
    wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg --no-check-certificate

    执行如下命令,将*.jpg转换为*.bin,同时将图片从1024*683的分辨率缩放为224*224。在“样例目录/data“目录下生成2个*.bin文件。

    python3 ../script/transferPic.py

编译运行

  1. 切换至“样例目录”。
    cd /home/samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
  2. 设置环境变量,配置程序编译依赖的头文件与库文件路径。
    以CANN的默认安装路径“/usr/local/Ascend”为例,用户请根据CANN的实际安装路径配置。
    export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest
    export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
    • DDK_PATH:编译脚本会根据“{DDK_PATH}环境变量值/runtime/include/acl”目录查找编译依赖的头文件。
    • NPU_HOST_LIB:编译脚本会根据{NPU_HOST_LIB}环境变量指向的目录查找编译依赖的库文件。
  3. 创建目录用于存放编译文件(以“build/intermediates/host”为例)。
    mkdir -p build/intermediates/host
  4. 切换到“build/intermediates/host”目录,执行如下命令生成可执行文件,生成的可执行文件在“样例目录/out”目录下。
    cd build/intermediates/host
    cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
    make
  5. 在“样例目录/out”目录下,执行如下命令运行可执行文件。
    cd /home/samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/out
    ./main
    执行成功后,关键提示信息示例如下,提示信息(如下加粗内容所示,为推理结果)中的index表示类别标识、value表示该分类的最大置信度,这些值可能会根据版本、环境有所不同,请以实际情况为准:
    [INFO]  acl init success
    [INFO]  set device 0 success
    [INFO]  create context success
    [INFO]  create stream success
    [INFO]  get run mode success
    [INFO]  load model ../model/resnet50.om success
    [INFO]  create model description success
    [INFO]  create model input success
    [INFO]  create model output success
    [INFO]  start to process file:../data/dog1_1024_683.bin
    [INFO]  model execute success
    [INFO]  top 1: index[161] value[0.763672]
    [INFO]  top 2: index[162] value[0.157593]
    [INFO]  top 3: index[167] value[0.039215]
    [INFO]  top 4: index[163] value[0.021835]
    [INFO]  top 5: index[166] value[0.011871]
    [INFO]  output data success
    [INFO]  start to process file:../data/dog2_1024_683.bin
    [INFO]  model execute success
    [INFO]  top 1: index[267] value[0.935547]
    [INFO]  top 2: index[266] value[0.041107]
    [INFO]  top 3: index[265] value[0.018967]
    [INFO]  top 4: index[219] value[0.002865]
    [INFO]  top 5: index[160] value[0.000311]
    [INFO]  output data success
    [INFO]  destroy model input success
    [INFO]  destroy model output success
    [INFO]  unload model success, modelId is 1
    [INFO]  destroy model description success
    [INFO]  execute sample success
    [INFO]  end to destroy stream
    [INFO]  end to destroy context
    [INFO]  end to reset device 0
    [INFO]  end to finalize acl
  6. 类别标签和类别的对应关系与训练模型时使用的数据集有关,本样例使用的模型是基于imagenet数据集进行训练的,您可以单击Link查阅imagenet数据集的标签及类别的对应关系,推理结果如下所示。
    图1 dog1_1024_683.jpg
    表1 dog1_1024_683.jpg推理结果

    类别标签

    类别(推理结果)

    161

    巴吉特,巴吉特猎犬

    162

    小猎犬

    167

    英国猎狐犬

    163

    猎犬,侦查犬

    166

    沃克猎犬,沃克猎犬

    图2 dog2_1024_683.jpg
    表2 dog2_1024_683.jpg推理结果

    类别标签

    类别(推理结果)

    267

    标准贵宾犬

    266

    微型贵宾犬

    265

    玩具贵宾犬

    219

    可卡犬,英国可卡犬,可卡犬

    160

    阿富汗猎犬,阿富汗