---
title: 运行图像分类样例
description: "基于Caffe ResNet-50网络实现图片分类，该样例主要是基于Caffe ResNet-50网络（单输入、单Batch）实现图片分类的功能。"
url: https://www.hiascend.com/document/detail/zh/300Vtest/latest/300V_0044.html
sourcePath: /source/zh/300Vtest/300VG/300V_0044.html
indexId: 1d8bfae310c14f5b06a334f04fee62ef15920df70fd7f93d6baafdf1a2091c6540
---
# 运行图像分类样例

#### 样例描述

基于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文件
```


#### 获取样例

在任意目录下（如“/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"
```


#### 准备模型和图片

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模型。

  a. 获取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
```


  b. 将ResNet-50原始模型转换为适配昇腾AI处理器的离线模型（*.om文件）。
执行npu-smi info命令查看芯片名称，如下图所示，红框处为芯片名称。
在“样例目录”下执行如下命令，以下命令只适用于310P芯片。

```
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=Ascend310P3
--input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:0
```


    - --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. 设置环境变量，配置程序编译依赖的头文件与库文件路径。

```
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
```


  若回显类似如下报错信息，表示未安装cmake。

```
bash: cmake: command not found
```


  请执行如下命令安装。

```
apt-get update
apt-get install -y cmake
```


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(https://blog.csdn.net/u013491950/article/details/83927968)查阅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 | 阿富汗猎犬，阿富汗 |
