Rspress

# #常见算法模型示例

## #位置路径

常见算法模型示例位于 `horizon_model_convert_sample` 路径的： `03_classification/`、 `04_detection/` 和 `07_segmentation/` 文件夹中。

## #准备数据集

### #数据集下载地址

数据集的下载地址可参考下表：

数据集 | 下载地址
--- | ---
ImageNet | https://www.image-net.org/download.php
COCO | https://cocodataset.org/
VOC | http://host.robots.ox.ac.uk/pascal/VOC/ （需要下载2007和2012两个版本）
Cityscapes | https://github.com/mcordts/cityscapesScripts

### #数据集参考结构

为方便您进行后续步骤，在数据集下载完成后，您需要按照如下地平线建议的结构对评测数据集进行处理。

数据集 | 说明
ImageNet数据集 | 我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `imagenet/ ├── calibration_data │ ├── ILSVRC2012_val_00000001.JPEG │ ├── ... │ └── ILSVRC2012_val_00000100.JPEG ├── ILSVRC2017_val.txt ├── val │ ├── ILSVRC2012_val_00000001.JPEG │ ├── ... │ └── ILSVRC2012_val_00050000.JPEG └── val.txt`
COCO数据集 | 我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `coco/ ├── calibration_data │ ├── COCO_val2014_000000181007.jpg │ ├── ... │ └── COCO_val2014_000000181739.jpg └── coco_val2017 ├── annotations │ ├── instances_train2017.json │ └── instances_val2017.json └── images ├── 000000000139.jpg ├── 000000000285.jpg ├── ... ├── 000000581615.jpg └── 000000581781.jpg`
VOC数据集 | 请注意： 请您注意，VOC2012目录下目前存储了VOC2007和VOC2012两份数据集，请您按照如下目录结构对评测数据集进行处理。 数据准备过程中如遇问题请联系地平线。 `VOCdevkit/ └── VOC2012 ├── Annotations │ ├── 2007_000027.xml │ ├── ... │ └── 2012_004331.xml ├── ImageSets │ ├── Action │ │ ├── jumping_train.txt │ │ ├── jumping_trainval.txt │ │ ├── jumping_val.txt │ │ ├── ... │ │ ├── val.txt │ │ ├── walking_train.txt │ │ ├── walking_trainval.txt │ │ └── walking_val.txt │ ├── Layout │ │ ├── train.txt │ │ ├── trainval.txt │ │ └── val.txt │ ├── Main │ │ ├── aeroplane_train.txt │ │ ├── aeroplane_trainval.txt │ │ ├── aeroplane_val.txt │ │ ├── ... │ │ ├── train.txt │ │ ├── train_val.txt │ │ ├── trainval.txt │ │ ├── tvmonitor_train.txt │ │ ├── tvmonitor_trainval.txt │ │ ├── tvmonitor_val.txt │ │ └── val.txt │ └── Segmentation │ ├── train.txt │ ├── trainval.txt │ └── val.txt ├── JPEGImages │ ├── 2007_000027.jpg │ ├── ... │ └── 2012_004331.jpg ├── SegmentationClass │ ├── 2007_000032.png │ ├── ... │ └── 2011_003271.png ├── SegmentationObject │ ├── 2007_000032.png │ ├── ... │ └── 2011_003271.png └── train.txt`
Cityscapes数据集 | 我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `cityscapes/ ├── cityscapes_calibration_data │ ├── aachen_000000_000019_leftImg8bit.png │ ├── ... │ └── aachen_000099_000019_leftImg8bit.png ├── gtFine │ ├── test │ │ ├── berlin │ │ ├── ... │ │ └── munich │ ├── train │ │ ├── aachen │ │ ├── ... │ │ └── zurich │ └── val │ ├── frankfurt │ ├── lindau │ └── munster ├── leftImg8bit │ ├── test │ │ ├── berlin │ │ ├── ... │ │ └── munich │ ├── train │ │ ├── aachen │ │ ├── ... │ │ └── zurich │ └── val │ ├── frankfurt │ ├── lindau │ └── munster ├── license.txt └── README`

## #准备模型

在使用模型转换示例包时，请您先准备好对应的浮点模型。

注解

OE包默认不携带示例对应的校准数据集和原始模型，您需要在对应的示例文件夹内执行 `00_init.sh` 获取当前示例所需的模型和校准数据集。

## #算法模型示例的使用演示

本小节以 Resnet50 模型为例，使用算法模型示例包中 `03_classification/03_resnet50/` 路径下脚本分步骤演示浮点模型到定点模型转换的过程。

### #进入Docker容器

首先，根据 Docker容器部署 一节内容完成Docker环境的安装和配置并进入docker容器。

### #下载原始模型及校准数据集

在 `03_classification/03_resnet50/` 文件夹内执行 `00_init.sh` 获取当前示例所需的模型和校准数据集。

`# 1. 进入示例脚本放置的文件夹 cd samples/ai_toolchain/horizon_model_convert_sample/03_classification/03_resnet50/ # 2. 执行脚本下载原始模型及校准数据集 sh 00_init.sh`

### #验证模型是否能够执行

如下所示，运行脚本：

`# 执行模型检查 sh 01_check.sh`

### #准备校准用的数据集

在同一路径下继续执行 `02_preprocess.sh` 脚本，如下所示：

`# 将 01_common/calibration_data/imagenet 中的图片 # 转换到: ./calibration_data_rgb sh 02_preprocess.sh`
注解

- 我们从ImageNet数据集抽取了100张图作为校准数据集，在校准前，我们对数据进行了预处理：short size resize/crop size/NHWC to NCHW/转为rgb。

- `hb_compile` 工具会从转换得到二进制数据中读取数据，预处理过的二进制数据文件格式为 npy，dtype为uint8。

### #build模型

在同一路径下继续执行 `03_build.sh` 脚本，如下所示：

`sh 03_build.sh`
注解

上述脚本使用 `hb_compile` 工具转换模型，最需要关注的是转换的配置文件，请参考 模型量化编译 章节。

上述脚本的输出如下所示：

`ls model_output | cat resnet50_224x224_nv12.hbm resnet50_224x224_nv12_calibrated_model.onnx resnet50_224x224_nv12_ptq_model.onnx resnet50_224x224_nv12_optimized_float_model.onnx resnet50_224x224_nv12_original_float_model.onnx resnet50_224x224_nv12_quantized_model.bc resnet50_224x224_nv12.html resnet50_224x224_nv12.json resnet50_224x224_nv12_quant_info.json resnet50_224x224_nv12_advice.json resnet50_224x224_nv12_node_info.csv hb_compile.log`
注解

您暂时只需要关心 resnet50_224x224_nv12.hbm 文件。

### #单张图片推理

执行 `04_inference.sh` 脚本进行单张图片的推理过程，如下所示：

`sh 04_inference.sh`
注解

- 因为图片推理过程时，需要对图片进行 前处理，对模型数据进行 后处理，所以我们提供了一个示例Python脚本。具体请参考 `sh 04_inference.sh` 。

- 此脚本只是对单张图片进行推理，验证单张图片的推理结果是否符合预期，如果想做精度测评，可以参考 `05_evaluate.sh` 脚本。

### #精度测试

继续执行 `05_evaluate.sh` 脚本进行精度评测，如下所示：

`export PARALLEL_PROCESS_NUM=${parallel_process_num} sh 05_evaluate.sh`
注解

- 因为精度评测时，需要对图片进行 前处理，对模型数据进行 后处理，所以我们提供了一个示例Python脚本。具体请参考 `sh 05_evaluate.sh`。

- 为了加快评测速度，可以通过 `-p` 选项适当调整并发进程数，但需要注意内存的占用情况。当 `-p` 选项值不填或者设置为 `0` 时，CPU环境中的定点模型将按照10个进程数处理，其他场景均按1个进程数处理。

## #常见问题

### #复现的精度为什么与文档中提供的指标有细微差异？

出现此种现象的原因可能有以下两点：

1. 在不同的服务器环境下，计算方式上可能会有细小的区别，就会导致不同的服务器环境中编译出来的定点onnx模型的精度与文档的记录值有细微数据波动。

2. 使用的第三方库如opencv、numpy等库的版本不同，导致图片经过前处理后的得到的结果不同，这种情况也会导致精度复现时与文档中的记录值有细微数据波动。

出现这种情况，您可以不用过于担心，文档中提供的记录指标仅作为参考，您在复现时的精度与文档中的记录值有细微差异是正常现象，可以正常跑通精度即可。

### #定点模型精度为何与ai_benchmark示例中的hbm文件上板精度无法对齐？

在标准交付中，我们在添加示例的时候，定点模型精度和ai_benchmark示例中的hbm文件上板精度是已经做了对齐处理的。

如果您发现定点模型精度与ai_benchmark示例中的hbm文件上板精度无法对齐的情况，建议您优先检查模型输入是否一致。 由于执行定点模型评估脚本时，使用到的是图片类型的数据集；而上板使用到的hbm模型，需要使用hb_eval_preprocess工具转换后的二进制数据集。 基于此点，如果您在上板时使用的数据集并非通过上述方式生成的,我们建议您先在运行定点模型的精度的相同服务器上，使用我们的数据预处理工具（即hb_eval_preprocess工具）重新生成上板需要的数据集，重跑上板精度，以保证模型输入一致。

注意

注意，在使用hb_eval_preprocess工具生成数据集和运行定点模型精度时，两者使用的环境需要保证一致。

页面目录