常见算法模型示例

位置路径

常见算法模型示例位于 onnx_ptq/examples 路径的: classification/detection/segmentation/ 文件夹中。

准备数据集

数据集下载地址

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

数据集参考结构

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

数据集说明
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 模型为例,使用算法模型示例包中 classification/resnet50/ 路径下脚本分步骤演示浮点模型到定点模型转换的过程。

进入Docker容器

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

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

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

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

验证模型是否能够执行

如下所示,运行脚本:

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

准备校准用的数据集

在同一路径下继续执行 02_preprocess.sh 脚本,如下所示:

# 将 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工具生成数据集和运行定点模型精度时,两者使用的环境需要保证一致。