---
title: 样例介绍
description: "单击vpc_jpeg_resnet50_imagenet_classification(https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/1_classification/vpc_jpeg_resnet50_imagenet_classification)获取样例"
url: https://www.hiascend.com/document/detail/zh/Atlas200IDKA2DeveloperKit/latest/Application%20Development%20Guide/aadgc/aclcppdevg_04_0012.html
sourcePath: /source/zh/Atlas200IDKA2DeveloperKit/23.0.RC2/Application Development Guide/aadgc/aclcppdevg_04_0012.html
indexId: 7c02d4551469e12b62fc9b225f5dbd45adb21e4e4daae261def8f9fd8819e01d105
---
# 样例介绍

#### 获取样例

单击vpc_jpeg_resnet50_imagenet_classification(https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/1_classification/vpc_jpeg_resnet50_imagenet_classification)获取样例


#### 功能描述

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

根据运行应用的入参，该样例可实现以下功能：

- 将一张YUV420SP格式的图片编码为*.jpg格式的图片。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片，缩放，再进行模型推理，分别得到两张图片的推理结果后，处理推理结果，输出最大置信度的类别标识以及top5置信度的总和。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片，抠图，再进行模型推理，分别得到两张图片的推理结果后，处理推理结果，输出最大置信度的类别标识以及top5置信度的总和。
- 将两张*.jpg格式的解码成两张YUV420SP NV12格式的图片，抠图贴图，再进行模型推理，分别得到两张图片的推理结果后，处理推理结果，输出最大置信度的类别标识以及top5置信度的总和。

该样例中用于推理的模型文件是*.om文件（适配昇腾AI处理器的离线模型），转换模型时，需配置色域转换参数，用于将YUV420SP格式的图片转换为RGB格式的图片，才能符合模型的输入要求。


#### 原理介绍

在该样例中，涉及的关键功能点，如下表所示。

| 初始化 | 调用aclInit接口初始化AscendCL配置。 调用aclFinalize接口实现AscendCL去初始化。 |
| --- | --- |
| Device管理 | 调用aclrtSetDevice接口指定用于运算的Device。 调用aclrtGetRunMode接口获取软件栈的运行模式，根据运行模式的不同，内部处理流程不同。 调用aclrtResetDevice接口复位当前运算的Device，回收Device上的资源。 |
| Context管理 | 调用aclrtCreateContext接口创建Context。 调用aclrtDestroyContext接口销毁Context。 |
| Stream管理 | 调用aclrtCreateStream接口创建Stream。 调用aclrtDestroyStream接口销毁Stream。 调用aclrtSynchronizeStream接口阻塞程序运行，直到指定Stream中的所有任务都完成。 |
| 内存管理 | 调用aclrtMallocHost接口申请Host上内存。 调用aclrtFreeHost释放Host上的内存。 调用aclrtMalloc接口申请Device上的内存。 调用aclrtFree接口释放Device上的内存。 执行媒体数据处理时，若需要申请Device上的内存存放输入或输出数据，需调用acldvppMalloc申请内存、调用acldvppFree接口释放内存。 |
| 数据传输 | 如果在板端环境上运行应用，则无需进行数据传输。 |
| 媒体数据处理V1 | 图片编码 调用acldvppJpegEncodeAsync接口将YUV420SP格式的图片编码为\*.jpg格式的图片。 图片解码 调用acldvppJpegDecodeAsync接口将\*.jpg图片解码成YUV420SP格式图片。 缩放 调用acldvppVpcResizeAsync接口对YUV420SP格式的输入图片进行缩放。 抠图 调用acldvppVpcCropResizeAsync接口按指定区域从输入图片中抠图，再将抠的图片存放到输出内存中，作为输出图片。 抠图贴图 调用acldvppVpcCropResizePasteAsync接口按指定区域从输入图片中抠图，再将抠的图片贴到目标图片的指定位置，作为输出图片。 |
| 模型推理 | 调用aclmdlLoadFromFileWithMem接口从\*.om文件加载模型。 调用aclmdlExecute接口执行模型推理。 推理前，通过\*.om文件中的色域转换参数将YUV420SP格式的图片转换为RGB格式的图片。 调用aclmdlUnload接口卸载模型。 |


#### 目录结构

样例代码结构如下所示。

```
├── caffe_model
│   ├── aipp.cfg        //带色域转换参数的配置文件，模型转换时使用
├── data
│   ├── persian_cat_1024_1536_283.jpg            //测试数据,需要按指导获取测试图片，放到data目录下
│   ├── wood_rabbit_1024_1061_330.jpg            //测试数据,需要按指导获取测试图片，放到data目录下
│   ├── wood_rabbit_1024_1068_nv12.yuv            //测试数据,需要按指导获取测试图片，放到data目录下
│   ├── dvpp_vpc_8192x8192_nv12.yuv               //测试数据,需要按指导获取测试图片，放到data目录下
├── inc
│   ├── dvpp_process.h               //声明媒体数据处理相关函数的头文件
│   ├── model_process.h              //声明模型处理相关函数的头文件
│   ├── sample_process.h               //声明资源初始化/销毁相关函数的头文件
│   ├── utils.h                       //声明公共函数（例如：文件读取函数）的头文件
├── src
│   ├── acl.json         //系统初始化的配置文件
│   ├── CMakeLists.txt         //编译脚本
│   ├── dvpp_process.cpp       //媒体数据处理相关函数的实现文件
│   ├── main.cpp               //主函数，图片分类功能的实现文件
│   ├── model_process.cpp      //模型处理相关函数的实现文件
│   ├── sample_process.cpp     //资源初始化/销毁相关函数的实现文件
│   ├── utils.cpp              //公共函数（例如：文件读取函数）的实现文件
├── .project     //工程信息文件，包含工程类型、工程描述、运行目标设备类型等
├── CMakeLists.txt    //编译脚本，调用src目录下的CMakeLists文件
```
