S100 OpenExplorer

# #AI Benchmark使用说明

AI Benchmark示例包提供了嵌入式应用开发常见分类、检测、分割、光流、追踪估计，雷达多任务，bev，深度估计模型和在线建图的性能和精度评测示例。 其中性能评测示例包括单帧延迟评测和多线程评测示例，充分利用调用BPU的速度进行评测。 示例包中预置了源码、可执行程序和评测脚本，您可以在地平线开发板上进行体验，并基于这些示例直接进行应用开发，降低开发门槛。

## #发布物说明

AI Benchmark示例包位于 horizon_S100_open_explorer 发布物的 `samples/ucp_tutorial/dnn/ai_benchmark/` 路径下，主要包括以下内容：

编号 | 名称 | 内容
--- | --- | ---
1 | code | 包含示例源代码和编译脚本。
2 | S100 | 示例包上板运行环境。

### #示例包结构

注解

上板模型需要先在OE包的 `samples/ai_toolchain/model_zoo/runtime/ai_benchmark/` 目录下的 `resolve_ai_benchmark_ptq.sh` 和 `resolve_ai_benchmark_qat.sh` 脚本进行获取。

​示例包结构如下所示：

`├── code # 示例源码文件夹 │ ├── build_ptq_s100_qnx.sh │ ├── build_ptq_s100.sh │ ├── build_qat_s100_qnx.sh │ ├── build_qat_s100.sh │ ├── build.sh # 通用的编译脚本，被build_ptq_xxx.sh和build_qat_xxx.sh调用 │ ├── CMakeLists.txt │ ├── include # 源码头文件 │ │ ├── base │ │ ├── input │ │ ├── method │ │ ├── output │ │ ├── plugin │ │ └── utils │ ├── README.md │ ├── resolve.sh # 下载模型性能评测数据集的脚本 │ └── src # 示例源码 │ ├── input │ ├── method │ ├── output │ ├── plugin │ ├── simple_example.cc │ └── utils ├── s100 # 示例包运行环境 │ ├── ptq # PTQ方案模型示例 │ │ ├── data # 模型性能评测数据集 │ │ ├── mini_data # Mini评测数据集 │ │ ├── model # PTQ方案模型 │ │ │ ├── README.md │ │ │ └── runtime -> ../../../../../../model_zoo/runtime/ai_benchmark/ptq # 软链接指向OE包中的模型，板端运行环境需要自行指定模型路径 │ │ ├── README.md │ │ ├── script # 执行脚本 │ │ │ ├── aarch64 # 编译产生可执行文件及依赖库 │ │ │ ├── classification # 分类模型示例 │ │ │ ├── config # 模型推理配置文件 │ │ │ ├── detection # 检测模型示例 │ │ │ ├── segmentation # 分割模型示例 │ │ │ ├── env.sh # 基础环境脚本 │ │ │ └── README.md │ │ └── tools # 精度评测工具 │ └── qat # QAT方案模型示例 │ ├── data # 模型性能评测数据集 │ ├── mini_data # Mini评测数据集 │ ├── model # QAT方案模型 │ │ ├── README.md │ │ └── runtime -> ../../../../../../model_zoo/runtime/ai_benchmark/qat # 软链接指向OE包中的模型，板端运行环境需要自行指定模型路径 │ ├── README.md │ ├── script # 执行脚本 │ │ ├── aarch64 # 编译产生可执行文件及依赖库 │ │ ├── bev # bev模型示例 │ │ ├── classification # 分类模型示例 │ │ ├── config # 模型推理配置文件 │ │ ├── detection # 检测模型示例 │ │ ├── disparity_pred # 深度估计模型示例 │ │ ├── multitask # 多任务模型示例 │ │ ├── online_map # 在线建图模型示例 │ │ ├── opticalflow # 光流模型示例 │ │ ├── segmentation # 分割模型示例 │ │ ├── tracking # 追踪模型示例 │ │ ├── traj_pred # 轨迹预测示例 │ │ ├── env.sh # 基础环境脚本 │ │ └── README.md │ └── tools # 前处理及精度评测工具 └── README.md`

- code：该目录内是评测程序的源码，用来进行模型性能和精度评测。
- s100：该目录内提供了已经编译好的应用程序，以及各种评测脚本，用来测试多种模型在地平线BPU上运行的性能和精度等。
- build_ptq_s100.sh：PTQ真机程序一键编译脚本。
- build_qat_s100.sh：QAT真机程序一键编译脚本。
- build_ptq_s100_qnx.sh：PTQ QNX系统程序一键编译脚本。
- build_qat_s100_qnx.sh：QAT QNX系统程序一键编译脚本。

### #示例模型

AI Benchmark示例包的模型发布物包括PTQ模型和QAT模型发布物：

- PTQ模型model_zoo需要通过执行 `samples/ai_toolchain/model_zoo/runtime/ai_benchmark/` 路径下的 `resolve_ai_benchmark_ptq.sh` 脚本进行获取。
- QAT模型model_zoo需要通过执行 `samples/ai_toolchain/model_zoo/runtime/ai_benchmark/` 路径下的 `resolve_ai_benchmark_qat.sh` 脚本进行获取。

其中包含常用的分类、检测、分割和光流预测等模型，模型命名规则为 {model_name}_{backbone}_{input_size}_{input_type}。

AI Benchmark示例包内包含的PTQ和QAT模型发布物的性能数据可参考 模型性能Benchmark 章节。

### #公共数据集

示例中会使用到数据集，对应数据集的下载您可参考 数据集下载 章节，数据准备过程中如遇问题请联系地平线。

## #环境构建

使用AI Benchmark示例包之前，您需要保证开发板环境和编译环境可用：

- 开发板准备

  1. 拿到开发板后，升级系统镜像到示例包推荐的系统镜像版本。

  2. 确保本地开发机和开发板可以远程连接。

- 编译环境准备

  编译需要当前环境安装好交叉编译工具，请根据 环境部署 部分的指引进行安装。 然后执行 code 目录下的build_ptq_s100.sh和build_qat_s100.sh脚本即可一键编译真机环境下的可执行程序，如需在QNX平台下编译，可运行build_ptq_s100_qnx.sh和build_qat_s100_qnx.sh脚本。可执行程序和对应依赖会自动复制到 s100/ptq/script 和 s100/qat/script 目录下的 aarch64 目录下。

注解

需要注意，在Linux平台编译时 `build.sh` 脚本里指定的交叉编译工具链的位置是 opt 目录下，如果安装在其他位置，需要手动修改下脚本中的如下内容。

`export CC=/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc export CXX=/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++`

同样地，在qnx平台编译时，`build.sh` 脚本里指定的交叉编译工具链的位置是 /opt/qnx800/host/linux/x86_64 ，如果安装在其它位置，可以修改环境变量QNX_HOST的值来指定交叉编译工具链的位置。

`export QNX_HOST=/opt/qnx800/host/linux/x86_64`

## #示例使用

### #评测示例

​评测示例脚本主要在 script 和 tools 目录下。

script 目录下是板上运行的评测脚本，包括常见分类、检测、分割、光流、追踪等模型。每个模型下面有以下三个脚本：

脚本 | 描述
--- | ---
fps.sh | 实现多线程fps统计（多线程调度，可以根据需求自由设置线程数）。
latency.sh | 实现单帧延迟性能统计（一个线程，单帧）。
accuracy.sh | 用于精度评测。

`script: ├── aarch64 # 编译产生的可执行文件及依赖库 │ ├── bin │ └── lib ├── env.sh # 基础配置 ├── config │ ├── model │ │ ├── data_name_list # image_name配置文件 │ │ └── input_init # 模型输入配置文件 │ │ └── input_order # 模型输入顺序 │ ├── preprocess │ │ └── centerpoint_preprocess_5dim.json # 前处理配置文件 │ └── reference_points # 模型参考点信息 │ │ ├── bev_gkt_mixvargenet_multitask_nuscenes │ │ └── ... ├── detection # 检测模型 │ ├── fcos_efficientnetb0_mscoco # 在此目录中还有其他模型, 仅以此模型目录为参考 │ │ ├── accuracy.sh │ │ ├── fps.sh │ │ ├── latency.sh │ │ ├── workflow_accuracy.json # 精度配置文件 │ │ ├── workflow_fps.json # 性能配置文件 │ │ └── workflow_latency.json # 单帧延时配置文件 │ └──... ├── ... └── README.md`

ptq/tools 目录下主要包括 python_tools 下的精度计算脚本，用于PTQ模型的精度评测。

`python_tools └── accuracy_tools ├── cls_imagenet_eval.py ├── det_coco_eval.py ├── det_voc_eval.py ├── metrics │ ├── cityscapes_metric.py │ ├── coco_config.py │ ├── coco_metric.py │ └── voc_metric.py └── seg_cityscapes_eval.py`

qat/tools 目录下主要包括前处理脚本及精度计算脚本，用于QAT模型的精度评测。

`tools/ ├── eval_preprocess │ ├── util │ ├── ...... │ └── voc.py ├── python_tools │ └── accuracy_tools │ ├── argoverse_util │ ├── nuscenes_metric_pro │ ├── whl_package │ ├── bev_eval.py │ ├── ...... │ └── yolov3_eval.py └── README.md`
注意

评测前需要执行以下命令，将 ptq （或者 qat ）目录拷贝到开发板上。

`scp -r samples/ucp_tutorial/dnn/ai_benchmark/s100/ptq root@192.168.1.1:/userdata/ptq/ scp -r samples/ucp_tutorial/dnn/ai_benchmark/s100/qat root@192.168.1.1:/userdata/qat/`

### #json配置文件参数信息

本小节按照输入配置项（input_config）、输出配置项（output_config）及workflow配置项的维度，分别对workflow_fps.json、workflow_latency.json及workflow_accuracy.json中的配置项进行简单说明。

注解

下方给出的配置项参数信息为通用配置项信息，一些示例模型由于模型特殊性，还会有额外的配置项，具体请您参考示例模型json文件。

#### #输入配置项（input_config）

参数名称 | 参数说明 | 涉及json文件
--- | --- | ---
input_type | 设置输入数据格式，支持图像或者bin文件。 | fps.json、latency.json、accuracy.json
height | 设置输入数据高度。 | fps.json、latency.json、accuracy.json
width | 设置输入数据宽度。 | fps.json、latency.json、accuracy.json
data_type | 设置输入数据类型，支持类型可参考 `hbDNNDataType`小节。 对应数据类型由上到下排序，分别对应数字0,1,2... 如HB_DNN_TENSOR_TYPE_S4对应数字0， HB_DNN_TENSOR_TYPE_U4对应数字1， HB_DNN_TENSOR_TYPE_S8对应数字2... | fps.json、latency.json、accuracy.json
image_list_file | 设置预处理数据集lst文件所在路径。 | fps.json、latency.json、accuracy.json
need_pre_load | 设置是否使用预加载方式对数据集读取。 | fps.json、latency.json、accuracy.json
limit | 设置处理中和处理完的输入数据量间差值的阈值，用于控制输入数据的处理线程。 | fps.json、latency.json、accuracy.json
need_loop | 设置是否循环读取数据进行评测。 | fps.json、latency.json、accuracy.json
max_cache | 设置预加载的数据个数。 请注意： 此参数生效时会预处理图片并读取到内存中，为保障您的程序稳定运行，请不要设置过大的值，建议您的数值设置不超过30。 | fps.json、latency.json、accuracy.json

#### #输出配置项（output_config）

参数名称 | 参数说明 | 涉及json文件
--- | --- | ---
output_type | 设置输出数据类型。 | fps.json、latency.json、accuracy.json
in_order | 设置是否按顺序进行输出。 | fps.json、latency.json、accuracy.json
enable_view_output | 设置是否将输出结果可视化。 | fps.json、latency.json
image_list_enable | 可视化时，设置为true，则可将输出结果保存为图像类型。 | fps.json、latency.json
view_output_dir | 设置可视化结果输出文件路径。 | fps.json、latency.json
eval_enable | 设置是否对精度进行评估。 | accuracy.json
output_file | 设置模型输出结果文件。 | accuracy.json

#### #workflow配置项

模型推理配置项：

参数名称 | 参数说明 | 涉及json文件
--- | --- | ---
method_type | 设置模型推理方法，此处需配置为 `InferMethod`。 | fps.json、latency.json、accuracy.json
method_config | 设置模型推理参数。 core：设置推理core id。 model_file：指定模型文件。 | fps.json、latency.json、accuracy.json

后处理配置项：

参数名称 | 参数说明 | 涉及json文件
--- | --- | ---
thread_count | 设置后处理线程数，取值范围为 `1-8`。 | fps.json、latency.json、accuracy.json
method_type | 设置后处理方法。 | fps.json、latency.json、accuracy.json
method_config | 设置后处理参数。 | fps.json、latency.json、accuracy.json

### #性能评测

性能评测分为latency和fps两方面。

#### #使用说明

latency：

进入到需要评测的模型目录下，执行 `sh latency.sh` 即可测试出单帧延迟。如下所示：

`I0419 02:35:07.041095 39124 output_plugin.cc:80] Infer latency: [avg: 13.124ms, max: 13.946ms, min: 13.048ms], Post process latency: [avg: 3.584ms, max: 3.650ms, min: 3.498ms].`
注解

- `infer` 表示模型推理耗时。
- `Post process` 表示后处理耗时。

fps：

该功能采用多线程并发方式，旨在让模型可以在BPU上达到极致的性能。由于多线程并发及数据采样的原因，在程序启动阶段帧率值会较低，之后帧率会上升并逐渐趋于稳定，帧率的浮动范围控制在0.5%之内。 进入到需要评测的模型目录下执行 `sh fps.sh` 即可测试出帧率。如下所示：

`I0419 02:35:00.044417 39094 output_plugin.cc:109] Throughput: 1129.39fps # 模型帧率`

#### #命令行参数说明

fps.sh脚本内容如下：

`#!/bin/sh source ../../env.sh export SHOW_FPS_LOG=1 export STAT_CYCLE=100 # 设置环境变量，FPS 统计周期 ${app} \ --config_file=workflow_fps.json \ --log_level=1`

latency.sh脚本内容如下：

`#!/bin/sh source ../../env.sh export SHOW_LATENCY_LOG=1 # 设置环境变量，打印 LATENCY 级别log export STAT_CYCLE=50 # 设置环境变量，LATENCY 统计周期 ${app} \ --config_file=workflow_latency.json \ --log_level=1`

#### #结果可视化

如果您希望可以看到模型单次推理出来效果，可以修改workflow_latency.json，重新运行latency.sh脚本，即可在output_dir目录下生成展示效果。

注意

生成展示效果时，由于dump效果的原因，脚本运行会变慢。仅支持运行latency.sh脚本dump。

可视化操作步骤 参考如下：

1. 修改workflow_latency.json配置文件

   `"output_config": { "output_type": "image", "enable_view_output": true, # 开启可视化 "view_output_dir": "./output_dir", # 可视化结果输出路径 "image_list_enable": true, "in_order": false }`

2. 执行latency.sh脚本

   `sh latency.sh`

注意

bev模型可视化需要指定场景信息和homography矩阵路径，homography矩阵用于相机视角和鸟瞰图的转换，不同场景有各自的homography矩阵。在线建图模型可视化需要指定下对应的局部地图的感知范围。

bev模型的workflow_latency.json配置文件我们建议修改成如下形式：

`"output_config": { "output_type": "image", "enable_view_output": true, # 开启可视化 "view_output_dir": "./output_dir", # 可视化结果输出路径 "bev_ego2img_info": [ "../../config/visible/bev/scenes.json", # 输入的场景信息 "../../config/visible/bev/boston.bin", # boston场景的homography矩阵 "../../config/visible/bev/singapore.bin" # singapore场景的homography矩阵 ], "image_list_enable": true, "in_order": false }`

在线建图模型的workflow_latency.json配置文件我们建议修改成如下形式：

`"output_config": { "output_type": "image", "enable_view_output": true, # 开启可视化 "view_output_dir": "./output_dir", # 可视化结果输出路径 "bev_range": [ -30.0, -15.0, -10.0, 30.0, 15.0, 10.0 ], # 局部地图的感知范围 "image_list_enable": true, "in_order": false }`
注意

qcnet模型可视化和精度评测集成在一起。

qcnet模型可视化方法如下：

`python3 qcnet_eval.py --eval_path \ # 推理结果eval.log文件路径 --gt_files_path \ # data数据集挂载路径 --msg_pack_path \ # eval.log解析后转存msgpack路径 --vis_save_path # 可视化存储路径`

不同类别的模型可以实现的 可视化效果 也不相同，参考下表：

模型类别 | 可视化效果
--- | ---
分类 |
2d检测 |
3d检测 |
分割 |
关键点 |
车道线 |
光流 |
雷达 |
雷达多任务 |
bev |
轨迹预测 |
深度估计 |
在线建图 |
occ预测 |

注意

轨迹预测可视化时如果需要可视化minidata以外的图片，需要额外配置道路信息、轨迹信息文件到 minidata/argoverse1/visualization 中，生成配置文件可使用 densetnt_process.py 预处理脚本，将 --is-gen-visual-config 参数设为 true。

### #精度评测

​模型评测分为五步：

1. 数据预处理。

2. 数据挂载。

3. 生成lst文件。

4. 模型推理。

5. 精度计算。

#### #数据预处理

下文将分别对PTQ和QAT模型数据预处理方式进行介绍。

PTQ模型数据预处理：

PTQ模型数据预处理需要在x86仿真环境下运行 `hb_eval_preprocess` 工具，对数据集进行预处理。 所谓预处理是指数据在送入模型之前的特定处理操作，比如：图片resize、crop和padding等操作。 该工具集成于 `horizon_tc_ui` 工具内，安装对应的install脚本即可使用该工具。 原始数据集经过工具预处理之后，会生成模型对应的前处理二进制文件.bin文件集。

小技巧

关于 `hb_eval_preprocess` 工具命令行参数及使用方法，可键入 `hb_eval_preprocess -h`， 或查看PTQ工具文档中的 hb_eval_preprocess工具 一节内容。

下面将详细介绍示例包中每一个模型对应的数据集，以及对应数据集的预处理操作。

PTQ模型使用到的数据集包括以下几种：

数据集 | 说明
--- | ---
VOC 数据集 | 用于使用 `VOC2012` 数据集的检测模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。 示例中主要用到 Main 文件下的val.txt文件，JPEGImages 中的源图片和 Annotations 中的标注数据。 2. 数据集预处理方式示例： `hb_eval_preprocess -m ssd_mobilenetv1 \ -i VOCdevkit/VOC2012/JPEGImages \ -v VOCdevkit/VOC2012/ImageSets/Main/val.txt \ -o ./pre_ssd_mobilenetv1`
COCO 数据集 | 用于使用 `coco_val2017` 数据集的检测模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。 示例中主要用到 annotations 文件夹下的instances_val2017.json标注文件和 images 中的图片。 2. 数据集预处理方式示例： `hb_eval_preprocess -m model_name \ -i coco/coco_val2017/images \ -o ./pre_model_name`
ImageNet 数据集 | 用于使用 `imagenet` 数据集的分类模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。 示例中主要用到标注文件val.txt 和 val 目录中的源图片。 2. 数据集预处理方式示例： `hb_eval_preprocess -m model_name \ -i imagenet/val \ -o ./pre_model_name`
Cityscapes 数据集 | 用于使用 `cityscapes` 数据集的分割模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。 示例中主要用到 ./gtFine/val 中的标注文件和 ./leftImg8bit/val 中的源图片。 2. 数据集预处理方式示例： `hb_eval_preprocess -m model_name \ -i cityscapes/leftImg8bit/val \ -o ./pre_model_name`

QAT模型数据预处理：

QAT模型数据预处理需要在x86仿真环境下执行 `ai_benchmark/s100/qat/tools/eval_preprocess` 中对应模型的前处理脚本。 下面将详细介绍示例包中模型对应的数据集，以及其预处理操作。

小技巧

使用前请修改脚本中的数据集路径及保存路径使脚本正常运行。

数据集 | 说明
--- | ---
ImageNet 数据集 | 用于QAT分类模型mixvargenet_imagenet、mobilenetv1_imagenet、mobilenetv2_imagenet、resnet18_imagenet、resnet50_imagenet、horizon_swin_transformer_imagenet、vit_small_imagenet和vargnetv2_imagenet的评测。 数据集预处理方式： `python3 imagenet.py --image-path=./standard_imagenet/val/ \ --save-path=./pre_model_name`
COCO 数据集 | 用于QAT检测模型fcos_efficientnetb0_mscoco, detr_resnet50_mscoco, detr_efficientnetb3_mscoco 和 deform_detr_resnet50_mscoco的评测。 数据集预处理方式： fcos_efficientnetb0_mscoco `python3 fcos_process.py --image-path=./mscoco/images/val2017/ \ --label-path=./mscoco/images/annotations/instances_val2017.json \ --save-path=./pre_fcos_efficientnetb0_mscoco` detr_resnet50_mscoco, detr_efficientnetb3_mscoco, deform_detr_resnet50_mscoco `python3 detr_process.py --image-path=./mscoco/images/val2017/ \ --label-path=./mscoco/images/annotations/instances_val2017.json \ --save-path=./pre_detr`
Cityscapes 数据集 | 用于QAT分割模型unet_mobilenetv1_cityscapes的评测，不需要前处理直接使用验证集数据即可。
Kitti3D 数据集 | 用于QAT检测模型pointpillars_kitti_car的评测。 1. 本数据集您可以于 Kitti3D数据集官网下载地址 下载，我们建议您下载以下压缩包，数据准备过程中如遇问题请联系地平线。 `. ├── kitti3d ├── data_object_calib.zip # camera calibration matrices of object data set ├── data_object_image_2.zip # left color images of object data set ├── data_object_label_2.zip # taining labels of object data set └── data_object_veloodyne.zip # velodyne point cloud` 建议您将下载的数据集解压成如下结构： `. ├── kitti3d_origin ├── ImageSets │ ├── test.txt │ ├── train.txt │ ├── trainval.txt │ └── val.txt ├── testing │ ├── calib │ ├── image_2 │ └── velodyne └── training ├── calib ├── image_2 ├── label_2 └── velodyne` 2. 数据集预处理方式： `python3 pointpillars_process.py --data-path=./kitti3d_origin \ --save-path=./pre_kitti3d \ --height=1 --width=150000`
Culane 数据集 | 用于QAT检测模型ganet_mixvargenet_culane的评测。 1. 本数据集您可以于 Culane数据集官网下载地址下载，我们建议您下载以下压缩包，数据准备过程中如遇问题请联系地平线。 `. ├── culane ├── annotations_new.tar.gz ├── driver_23_30frame.tar.gz ├── driver_37_30frame.tar.gz ├── driver_100_30frame.tar.gz ├── driver_161_90frame.tar.gz ├── driver_182_30frame.tar.gz ├── driver_193_90frame.tar.gz ├── laneseg_label_w16.tar.gz └── list.tar.gz` 其中 annotations_new.tar.gz 需要最后解压，以对原始的注释文件进行更正，建议您将下载的数据集解压成如下结构： `. ├── culane # 根目录 ├── driver_23_30frame # 数据集和注释 │ ├── 05151640_0419.MP4 # 数据集的一段，包含每一帧图片 │ │ ├──00000.jpg # 源图片 │ │ ├──00000.lines.txt # 注释文件，其中每个行给出车道标记关键点的x，y坐标 │ ...... ├── driver_37_30frame ├── driver_100_30frame ├── driver_161_90frame ├── driver_182_30frame ├── driver_193_90frame ├── laneseg_label_w16 # 车道分段标签 └── list # 训练，验证，测试列表` 2. 数据集预处理方式： `python3 ganet_process.py --image-path=./culane \ --save-path=./pre_culane`
Nuscenes 数据集 | 用于QAT检测模型fcos3d_efficientnetb0_nuscenes，centerpoint_pointpillar_nuscenes，lidar多任务模型centerpoint_mixvargnet_multitask_nuscenes，bev模型bev_gkt_mixvargenet_multitask_nuscenes， bev_lss_efficientnetb0_multitask_nuscenes，bev_ipm_efficientnetb0_multitask_nuscenes，bev_ipm_4d_efficientnetb0_multitask_nuscenes，bevformer_tiny_resnet50_detection_nuscenes， detr3d_efficientnetb3_nuscenes，petr_efficientnetb3_nuscenes，在线建图模型maptroe_henet_tinym_bevformer_nuscenes和occ模型flashocc_henet_lss_occ3d_nuscenes的评测。 1. 本数据集您可以于 Nuscenes数据集官网下载地址 下载，我们建议您下载以下压缩包，数据准备过程中如遇问题请联系地平线。 `. ├── Nuscenes ├── nuScenes-map-expansion-v1.3.zip ├── nuScenes-map-expansion-v1.2.zip ├── nuScenes-map-expansion-v1.1.zip ├── nuScenes-map-expansion-v1.0.zip ├── v1.0-mini.tar ├── v1.0-test_blobs.tar ├── v1.0-test_meta.tar ├── v1.0-trainval01_blobs.tar ├── v1.0-trainval02_blobs.tar ├── v1.0-trainval03_blobs.tar ├── v1.0-trainval04_blobs.tar ├── v1.0-trainval05_blobs.tar ├── v1.0-trainval06_blobs.tar ├── v1.0-trainval07_blobs.tar ├── v1.0-trainval08_blobs.tar ├── v1.0-trainval09_blobs.tar ├── v1.0-trainval10_blobs.tar └── v1.0-trainval_meta.tar` 对于lidar多任务模型，还需从官网下载lidar分割标签lidarseg，并按照nuscenes官网教程更新v1.0-trainval，建议您将下载的数据集解压成如下结构： `. ├── Nuscenes ├── can_bus ├── lidarseg ├── maps ├── nuscenes │ └── meta │ ├── maps │ ├── v1.0-mini │ └── v1.0-trainval ├── samples ├── sweeps ├── v1.0-mini └── v1.0-trainval` 对于在线建图模型maptroe_henet_tinym_bevformer_nuscenes，还需从 OpenStreetMap官网 下载boston-seaport、singapore-onenorth、singapore-hollandvillage、singapore-queenstown地区.shp格式的地图文件。 对于Occupancy模型，还需从 CVPR2023-3D-Occupancy-Prediction官网 下载“gts”，建议您将下载的数据集组织为如下结构： `. ├── Nuscenes ├── maps ├── samples ├── sweeps ├── v1.0-mini ├── v1.0-trainval └── gts (new)` 2. 数据集预处理方式： 请注意： fcos3d_process.py除了生成预处理图片外，还会对待使用的相机内参进行处理，生成相应的相机内参配置文件。 centerpoint_preprocess.py，bev_preprocess.py和lidar_preprocess.py除了生成预处理数据外，还会在预处理数据路径下生成一个 `val_gt_infos.pkl` 文件用于精度计算。 maptr_preprocess.py除了生成预处理数据外，还会在预处理数据路径下生成一个 `nuscenes_map_anns_val.json` 文件作为真实标签用于精度计算。此外，需要通过 `--model` 指定模型的名称，可选项有maptroe_henet_tinym_bevformer_nuscenes。 bev_preprocess.py需要通过 `--model` 指定模型的名称，可选项有bev_gkt_mixvargenet_multitask_nuscenes，bev_lss_efficientnetb0_multitask_nuscenes， bev_ipm_efficientnetb0_multitask_nuscenes，bev_ipm_4d_efficientnetb0_multitask_nuscenes，bevformer_tiny_resnet50_detection_nuscenes， detr3d_efficientnetb3_nuscenes，petr_efficientnetb3_nuscenes,flashocc_henet_lss_occ3d_nuscenes。 参考命令如下： fcos3d_efficientnetb0_nuscenes `python3 fcos3d_process.py --src-data-dir=./Nuscenes \ --file-path=../../script/config/model/data_name_list/nuscenes_names.txt \ --save-path=./processed_fcos3d_images` centerpoint_pointpillar_nuscenes `python3 centerpoint_preprocess.py --data-path=./Nuscenes \ --save-path=./nuscenes_lidar_val` bev model `python3 bev_preprocess.py --model=model_name \ --data-path=./Nuscenes \ --meta-path=./Nuscenes/meta \ --reference-path=../../script/config/reference_points \ --save-path=./nuscenes_bev_val` centerpoint_mixvargnet_multitask_nuscenes `python3 lidar_preprocess.py --data-path=./Nuscenes \ --save-path=./nuscenes_lidar_val` flashocc_henet_lss_occ3d_nuscenes `python3 bev_preprocess.py --model=model_name \ --data-path=./Nuscenes \ --meta-path=./Nuscenes/meta \ --reference-path=../../script/config/reference_points \ --save-path=./nuscenes_bev_val \ --with-occ-gt` maptroe_henet_tinym_bevformer_nuscenes `python3 maptr_preprocess.py --model=model_name \ --data-path=./Nuscenes \ --meta-path=./Nuscenes/meta \ --sdmap-path=./data_osm \ --reference-path=../../script/config/reference_points \ --save-path=./nuscenes_map_val`
Mot17 数据集 | 用于QAT多目标跟踪模型motr_efficientnetb3_mot17的评测。 1. 本数据集您可以于 Mot17数据集官网下载地址 下载，我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `. ├── valdata # 根目录 ├── gt_val │ ├── MOT17-02-SDP │ ├── MOT17-04-SDP │ ├── MOT17-05-SDP │ ├── MOT17-09-SDP │ ├── MOT17-10-SDP │ ├── MOT17-11-SDP │ ├── MOT17-13-SDP ├── images │ └── train │ ├── MOT17-04-SDP │ ├── MOT17-05-SDP │ ├── MOT17-09-SDP │ ├── MOT17-10-SDP │ ├── MOT17-11-SDP │ ├── MOT17-13-SDP └── mot17.val` 2. 数据集预处理方式： `python3 motr_process.py --image-path=./valdata/images/train \ --save-path=./processed_motr`
Carfusion 数据集 | 用于QAT检测模型keypoint_efficientnetb0_carfusion的评测。 1. 本数据集您可以于 Carfusion数据集官网下载地址下载，我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `. ├── carfusion # 根目录 ├── train └── test` 2. 数据集预处理方式： `# 首先生成评测需要的数据（如您第一次使用本数据集，必须使用下方脚本生成） python3 gen_carfusion_data.py --src-data-path=carfusion \ --out-dir=cropped_data \ --num-workers 2` 执行第一个脚本后的目录如下： `. ├── cropped_data # 根目录 ├── test └── simple_anno` 保证data-root指定的地址与cropped_data同一级，然后运行下方指令： `python3 keypoints_preprocess.py --data-root=./ \ --label-path=cropped_data/simple_anno/keypoints_test.json \ --save-path=./processed_carfusion`
Argoverse1 数据集 | 用于QAT检测模型densetnt_argoverse1的评测。 1. 本数据集您可以于 Argoverse1数据集官网下载地址下载，我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `. ├── arogverse-1 # 根目录 ├── map_files └── val` 2. 数据集预处理方式： densetnt_process.py除了生成预处理输入外，还会在src-path下生成相应的评测meta文件。评测仅需使用 `--src-path` 和 `--dst-path`两个参数即可，无需关注其他参数。 `python3 densetnt_process.py --src-path=arogverse-1 \ --dst-path=processed_arogverse1`
Argoverse2 数据集 | 用于QAT检测模型qcnet_oe_argoverse2的评测。 1. 本数据集您可以于 Argoverse2数据集官网下载地址下载val.tar，我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `. |-- argoverse-2 # 根目录 |-- val` 2. 数据集预处理方式： 通过qcnet_argoverse2_preprocess.py和qcnet_argoverse2_dataset.py生成评测需要的数据.仅需使用 `--src-data-dir` 和 `--target-data-dir`两个参数即可，无需关注其他参数 `python3 qcnet_argoverse2_preprocess.py --src-data-dir arogverse-2 \ --target-data-dir processed_arogverse2 \ --pack-type lmdb --num-samples 24988`
SceneFlow 数据集 | 用于QAT深度估计模型stereonetplus_mixvargenet_sceneflow的评测。 1. 本数据集您可以于 SceneFlow数据集官网下载地址 下载，我们建议您将下载的数据集解压成如下结构，数据准备过程中如遇问题请联系地平线。 `. ├── SceneFlow # 根目录 ├── FlyingThings3D │ ├── disparity │ ├── frames_finalpass └── SceneFlow_finalpass_test.txt` 2. 数据集预处理方式： stereonet_preprocess.py除了生成预处理数据外，还会在预处理数据路径下生成一个`val_gt_infos.pkl` 文件用于精度计算。 `python3 stereonet_preprocess.py --data-path=SceneFlow/ \ --data-list=SceneFlow/SceneFlow_finalpass_test.txt \ --save-path=sceneflow_val`

#### #数据挂载

由于数据集相对较大，不适合直接放在开发板上，可以采用挂载的方式供开发板读取，需要在服务器PC端和板端进行如下操作：

服务器PC端：

注意

请注意，执行下方操作需要服务器PC端root权限。

1. 编辑 `/etc/exports`，增加一行：`/nfs *(insecure,rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)`。`/nfs` 表示本机挂载路径，可替换为您所指定目录。

2. 执行命令 `exportfs -a -r`，使/etc/exports生效。

板端：

1. 创建需要挂载的目录： `mkdir -p /mnt`。

2. 挂载： `mount -t nfs {PC端IP}:/nfs /mnt -o nolock`。

完成将PC端的 /nfs 文件夹挂载至板端 /mnt 文件夹。按照此方式，将包含预处理数据的文件夹挂载至板端， 并将 /data 目录软链接至板端 /ptq 或 /qat 目录下，与 /script 同级目录。

#### #生成lst文件

示例中精度计算脚本的运行流程是：

1. 根据 `workflow_accurary.json` 中的 `image_list_file` 参数值，去寻找对应数据集的 `lst` 文件。

2. 根据 `lst` 文件存储的前处理文件路径信息，去加载每一个前处理文件，然后进行推理。

因此生成预处理文件之后，需要生成对应的lst文件，将每一张前处理文件的路径写入到lst文件中，而这个路径与数据集在板端的存放位置有关。 这里我们推荐其存放位置与 `./data/dataset_name/pre_model_name` 预处理数据文件夹同级目录。

PTQ预处理数据集结构如下：

`|── ptq | |── data | | |── cityscapes | | | |── pre_deeplabv3plus_efficientnetb0 | | | | |── xxxx.bin # 前处理好的二进制文件 | | | | |── .... | | | |── pre_deeplabv3plus_efficientnetb0.lst # lst文件：记录每一个前处理文件的路径 | | | |── .... | | |── .... | |── model | | |── ... | |── script | | |── ...`

QAT预处理数据集结构如下：

`|── qat | |── data | | |── carfusion | | | |── pre_keypoints | | | | |── xxxx # 前处理好的数据 | | | | |── .... | | | |── pre_carfusion.lst # lst文件：记录每一个前处理文件的路径 | | |── .... | |── model | | |── ... | |── script | | |── ...`

对应的lst文件，参考生成方式如下：

除bev系列、motr_efficientnetb3_mot17、stereonetplus_mixvargenet_sceneflow, maptroe_henet_tinym_bevformer_nuscenes和densetnt_argoverse1, qcnet_oe_argoverse2模型外，其余模型的lst文件参考生成方式：

`find ../../../data/coco/pre_centernet_resnet101 -name "*bin*" > ../../../data/coco/pre_centernet_resnet101.lst`
注解

-name后的参数需要根据预处理后的数据集格式进行对应调整，如bin、png。

这样生成的lst文件中存储的路径为一个相对路径：`../../../data/coco/pre_centernet_resnet101/` ， 可以与 `workflow_accuracy.json` 默认的配置路径吻合。

如果需要更改前处理数据集的存放位置，则需要确保对应的 `lst` 文件可以被 `workflow_accuracy.json` 读取到。 其次需要确保程序根据 `lst` 中的路径信息，能读取到对应的前处理文件。

对于bev系列、motr_efficientnetb3_mot17、stereonetplus_mixvargenet_sceneflow、maptroe_henet_tinym_bevformer_nuscenes、densetnt_argoverse1和qcnet_oe_argoverse2模型，lst文件参考生成方式：

模型名 | lst文件参考生成方式及说明
--- | ---
densetnt_argoverse1 | 参考生成方式： `sh generate_acc_lst.sh` 这样生成的lst文件中存储的路径为一个相对路径： `../../../data/argoverse1/densetnt/` ，可以与 `workflow_accuracy.json` 默认的配置路径吻合。
qcnet_oe_argoverse2 | 我们提供了专门的脚本`generate_acc_lst.sh` 用于生成lst文件，使用方式如下： `sh generate_acc_lst.sh ../../../data/argoverse2_qcnet/fp32_sample/val \ ../../../data/argoverse2_qcnet` 该脚本需要输入两个参数：`预处理好的data挂载路径` 和 `生成list的输出路径`，这样生成的lst文件中存储的路径为一个相对路径： `../../../data/argoverse2_qcnet/` ，可以与 `workflow_accuracy.json` 默认的配置路径吻合。
Bev maptroe_henet_tinym_bevformer_nuscenes | 以bev_ipm_efficientnetb0_multitask_nuscenes模型为例，该模型有图像和参考点两种输入，同一帧输入的图片和参考点名称相同。 为了保证输入相对应，在执行 `find` 命令时需要添加 `sort` 按名称进行排序。maptroe_henet_tinym_bevformer_nuscenes生成方式与之相同。参考生成方式： `find ../../../data/nuscenes_bev/images -name "*bin*" | \ sort > ../../../data/nuscenes_bev/images.lst find ../../../data/nuscenes_bev/reference_points0 -name "*bin*" | \ sort > ../../../data/nuscenes_bev/reference_points0.lst` 此外，bev_ipm_4d_efficientnetb0_multitask_nuscenes和bevformer_tiny_resnet50_detection_nuscenes是时序模型，该模型对输入顺序有要求。 因此，我们提供了专门的脚本 `gen_file_list.sh` 用于生成lst文件，使用方式如下： `sh gen_file_list.sh` 这样生成的lst文件中存储的路径为一个相对路径：`../../../data/nuscenes_bev/` ，可以与 `workflow_accuracy.json` 默认的配置路径吻合。 如果需要更改前处理数据集的存放位置，则需要确保对应的 `lst` 文件可以被 `workflow_accuracy.json` 读取到。 其次需要确保程序根据 `lst` 中的路径信息，能读取到对应的前处理文件。
motr_efficientnetb3_mot17 | 参考生成方式： `sh generate_acc_lst.sh` 这样生成的lst文件中存储的路径为一个相对路径：`../../../data/mot17/motr/` ，可以与 `workflow_accuracy.json` 默认的配置路径吻合。 如果需要更改前处理数据集的存放位置，则需要确保对应的 `lst` 文件可以被 `workflow_accuracy.json` 读取到。 其次需要确保程序根据 `lst` 中的路径信息，能读取到对应的前处理文件。
stereonetplus_mixvargenet_sceneflow | 以stereonetplus_mixvargenet_sceneflow模型为例，为了保证同一帧输入的左右视图相对应，在执行 `find` 命令时需要添加 `sort` 按名称进行排序，参考生成方式如下： `find ../../../data/sceneflow/left -name "*png*" |\ sort > ../../../data/sceneflow/left.lst find ../../../data/sceneflow/right -name "*png*" |\ sort > ../../../data/sceneflow/right.lst`

#### #模型推理

accuracy.sh脚本内容中各参数说明如下：

`#!/bin/sh source ../../env.sh # 加载基础配置 export SHOW_FPS_LOG=1 # 设置环境变量，打印fps级别log ${app} \ # 可执行程序，在accuracy.sh脚本中定义 --config_file=workflow_accuracy.json \ # 加载精度测试workflow配置文件 --log_level=2 # 设置log等级`

挂载完数据后，登录开发板，执行 centernet_resnet101/ 目录下的accuracy.sh脚本，如下所示：

`root@:/userdata/ptq/script/detection/centernet_resnet101# sh accuracy.sh ../../aarch64/bin/example --config_file=workflow_accuracy.json --log_level=2 ... I0419 03:14:51.158655 39555 infer_method.cc:107] Predict DoProcess finished. I0419 03:14:51.187361 39556 ptq_centernet_post_process_method.cc:558] PTQCenternetPostProcessMethod DoProcess finished, predict result: [{"bbox":[-1.518860,71.691170,574.934631,638.294922],"prob":0.750647,"label":21,"className_name":" I0118 14:02:43.636204 24782 ptq_centernet_post_process_method.cc:558] PTQCenternetPostProcessMethod DoProcess finished, predict result: [{"bbox":[3.432283,164.936249,157.480042,264.276825],"prob":0.544454,"label":62,"className_name":" ...`

板端程序会在当前目录生成eval.log文件，该文件就是预测结果文件。

#### #精度计算

注意

请注意，精度计算部分需在docker环境或linux环境下进行操作。

精度计算我们按照PTQ模型精度和QAT模型精度计算两种情况为您展开介绍。

PTQ模型精度计算：

PTQ模型精度计算的脚本在 ptq/tools/python_tools/accuracy_tools 目录下，其中：

脚本 | 描述
--- | ---
cls_imagenet_eval.py | 用于计算使用 ImageNet 数据集评测的分类模型的精度。
det_coco_eval.py | 用于计算使用COCO数据集评测的检测模型的精度。
seg_cityscapes_eval.py | 用于计算使用Cityscapes数据集评测的分割模型的精度。
det_voc_eval.py | 用于计算使用VOC数据集评测的检测模型的精度。

以下为您说明不同类型的PTQ模型精度计算方式：

模型类型 | 精度计算方式说明
--- | ---
分类模型 | 使用ImageNet数据集的分类模型计算方式如下： `python3 cls_imagenet_eval.py --eval-log-path=eval.log \ --gt-file=val.txt` 其中： `eval-log-path`：分类模型的预测结果文件。 `gt-file`：ImageNet数据集的标注文件。
检测模型 | 1.使用COCO数据集的检测模型精度计算方式如下： `python3 det_coco_eval.py --eval-log-path=eval.log \ --annotation-path=instances_val2017.json` 其中： `eval-log-path`：检测模型的预测结果文件。 `annotation-path`：COCO数据集的标注文件。 2.使用VOC数据集的检测模型精度计算方式如下： `python3 det_voc_eval.py --eval-log-path=eval.log \ --annotation-path=../Annotations \ --val-txt-path=../val.txt` 其中： `eval-log-path`：检测模型的预测结果文件。 `annotation-path`：VOC数据集的标注文件。 `val-txt-path`：VOC数据集中ImageSets/Main文件夹下的val.txt文件。
分割模型 | 使用Cityscapes数据集的分割模型精度计算方式如下： `python3 seg_cityscapes_eval.py --eval-log-path=eval.log \ --gt-path=cityscapes/gtFine/val` 其中： `eval-log-path`：分割模型的预测结果文件。 `gt-path`：Cityscapes数据集的标注文件。

QAT模型精度计算：

QAT模型的精度计算脚本在 qat/tools/python_tools/accuracy_tools 目录下，其中：

脚本 | 描述
--- | ---
bev_eval.py | 用于计算bev模型的精度。
centerpoint_eval.py | 用于计算centerpoint_pointpillar_nuscenes雷达3D模型的精度。
cls_eval.py | 用于计算分类模型的精度。
densetnt_eval.py | 用于计算densetnt_argoverse1轨迹预测模型的精度。
qcnet_eval.py | 用于计算qcnet_oe_argoverse2轨迹预测模型的精度。
detr_eval.py | 用于计算detr和deform_detr_resnet50_mscoco检测模型的精度。
fcos3d_eval.py | 用于计算fcos3d_efficientnetb0_nuscenes检测模型的精度。
fcos_eval.py | 用于计算fcos检测模型的精度。
ganet_eval.py | 用于计算ganet_mixvargenet_culane检测模型的精度。
keypoints_eval.py | 用于计算keypoints检测模型的精度。
lidar_multitask_eval.py | 用于计算lidar多任务模型centerpoint_mixvargnet_multitask_nuscenes的精度。
motr_eval.py | 用于计算motr_efficientnetb3_mot17检测模型的精度。
parsing_eval.py | 用于计算使用Cityscapes数据集评测的分割模型的精度。
pointpillars_eval.py | 用于计算pointpillars检测模型的精度。
stereonet_eval.py | 用于计算stereonetplus_mixvargenet_sceneflow深度估计模型的精度。
maptroe_eval.py | 用于计算maptroe_henet_tinym_bevformer_nuscenes在线建图模型的精度。
flashocc_eval.py | 用于计算flashocc模型的精度。

以下为您说明不同类型的QAT模型精度计算方式：

模型类型 | 精度计算方式说明
--- | ---
Bev模型 | 1.使用nuscenes数据集的bev模型精度计算方式如下： `python3 bev_eval.py --det_eval_path=bev_det_eval.log \ --seg_eval_path=bev_seg_eval.log \ --gt_files_path=./nuscenes_bev_val/val_gt_infos.pkl \ --meta_dir=./Nuscenes/meta/` 其中： `det_eval_path`：bev模型检测任务的预测结果文件。 `seg_eval_path`：bev模型分割任务的预测结果文件。 `gt_files_path`：对nuscenes数据集进行预处理生成的gt文件。 `meta_dir`：nuscenes数据集的meta信息路径。 注意：detr3d_efficientnetb3_nuscenes, petr_efficientnetb3_nuscenes和bevformer_tiny_resnet50_detection_nuscenes不需要传入seg_eval_path 2.使用nuscenes数据集的flashocc模型精度计算方式如下： `python3 flashocc_eval.py --seg_eval_path=bev_seg_eval.log \ --gt_files_path=./nuscenes_bev_val/val_gt_infos.pkl` 其中： `seg_eval_path`：flashocc模型的预测结果文件。 `gt_files_path`：在nuscenes数据集上加上occ标签进行预处理得到的gt文件。
分类模型 | 使用CIFAR-10数据集和ImageNet数据集的分类模型计算方式如下： `python3 cls_eval.py --log_file=eval.log \ --gt_file=val.txt` 其中： `log_file`：分类模型的预测结果文件。 `gt_file`：CIFAR-10和ImageNet数据集的标注文件。
检测模型 | 1. 使用COCO数据集的检测模型精度计算方式示例如下： `python3 fcos_eval.py --eval_result_path=eval.log \ --annotation_path=instances_val2017.json \ --image_path=./mscoco/images/val2017/ # qat fcos模型需要增加--is_qat=True python3 fcos_eval.py --eval_result_path=eval.log \ --annotation_path=instances_val2017.json \ --image_path=./mscoco/images/val2017/ \ --is_qat=True` 其中： `eval_result_path`：fcos检测模型的预测结果文件。 `annotation_path`：COCO数据集的标注文件。 `image_path`：COCO原始数据集。 `is_qat`：是否是qat fcos模型结果评测。 `python3 detr_eval.py --eval_result_path=eval.log \ --annotation_path=instances_val2017.json \ --image_path=./mscoco/images/val2017/` 其中： `eval_result_path`：fcos检测模型的预测结果文件。 `annotation_path`：COCO数据集的标注文件。 `image_path`：COCO原始数据集。 2. 使用Kitti数据集的检测模型精度计算方式如下： `python3 pointpillars_eval.py --eval_result_path=eval.log \ --annotation_path=./val_gt_infos.pkl` 其中： `eval_result_path`：检测模型的预测结果文件。 `annotation_path`：预处理过程中生成的kitti3d数据集的标注文件val_gt_infos.pkl。 3. 使用Culane数据集的检测模型精度计算方式如下： `python3 ganet_eval.py --eval_path=eval.log \ --image_path=./culane` 其中： `eval_result_path`：检测模型的预测结果文件。 `image_path`：culane数据集。 4. 使用Nuscenes数据集的检测模型精度计算方式如下： `python3 fcos3d_eval.py --eval_result_path=eval.log \ --image_path=./Nuscenes` 其中： `eval_result_path`：检测模型的预测结果文件。 `image_path`：nuscenes数据集。 `python3 centerpoint_eval.py --predict_result_path=eval.log \ --gt_files_path=./nuscenes_lidar_val/val_gt_infos.pkl \ --meta_dir=./Nuscenes/meta/` 其中： `predict_result_path`：检测模型的预测结果文件。 `gt_files_path`：对nuscenes数据集进行预处理生成的gt文件。 `meta_dir`： nuscenes数据集的meta信息路径。 5. 使用Carfusion数据集的检测模型精度计算方式如下： `python3 keypoints_eval.py --anno_path=./processed_carfusion/processed_anno.json \ --eval_result_path=eval.log` 其中： `anno_path`：预处理生成的processed_anno.json文件。 `eval_result_path`：检测模型的预测结果文件。
分割模型 | 使用Cityscapes数据集的分割模型精度计算方式如下： `python3 parsing_eval.py --log_file=eval.log \ --gt_path=cityscapes/gtFine/val` 其中： `log_file`：分割模型的预测结果文件。 `gt_path`：Cityscapes数据集的标注文件。
追踪模型 | 使用mot17数据集的追踪模型计算方式如下： `python3 motr_eval.py --eval_result_path=eval_log \ --gt_val_path=valdata/gt_val` 其中： `eval_result_path`：追踪模型的预测结果文件夹。 `gt_val_path`：mot17数据集的标注文件。
多任务模型 | 使用nuscenes数据集的lidar多任务模型精度计算方式如下： `python3 lidar_multitask_eval.py --det_eval_path=det_eval.log \ --seg_eval_path=seg_eval.log \ --gt_files_path=./nuscenes_lidar_val/val_gt_infos.pkl \ --data_dir=./Nuscenes` 其中： `det_eval_path`: 检测任务的预测结果文件。 `seg_eval_path`：分割任务的预测结果文件。 `gt_files_path`：对nuscenes数据集进行预处理生成的gt文件。 `data_dir`：nuscenes数据集路径。
轨迹预测模型 | 1. 使用argoverse1数据集的追踪模型计算方式如下： `python3 densetnt_eval.py --eval_result_path=eval.log \ --meta_path=argoverse1/meta` 其中： `eval_result_path`：轨迹预测的预测结果文件。 `meta_path`：argoverse1数据集生成的的标注文件，使用预处理脚本后，生成在原数据集目录meta中。 2. 使用argoverse2数据集的追踪模型计算方式如下： `python3 qcnet_eval.py --eval_path \ --gt_files_path \ --msg_pack_path` 其中： `eval_path`：轨迹预测的预测结果文件。 `gt_files_path`：对argoverse2数据集进行预处理后生成的gt文件,`qcnet_eval.py`评测脚本会自动从data文件夹中获取对应样本的label。 `msg_pack_path`：轨迹预测的预测结果文件eval.log解析后转存msgpack的路径。脚本解析eval.log 后会将数据再转存为`<msg_pack_path>qcnet_predict_data.msgpack` 文件，脚本后续自动读取msgpack进行测评
深度估计模型 | 使用Sceneflow数据集的深度估计模型精度计算方式如下： `python3 stereonet_eval.py --log_file=eval.log \ --gt_file=val_gt_infos.pkl` 其中： `log_file`：深度估计模型的预测结果文件。 `gt_file`：对Sceneflow数据集进行预处理生成的gt文件。
在线建图模型 | 使用nuscenes数据集的在线建图模型精度计算方式如下： `python3 maptroe_eval.py --predict_result_path=eval.log \ --gt_files_path=nuscenes_map_anns_val.json` 其中： `predict_result_path`：在线建图模型的预测结果文件。 `gt_files_path`：对nuscenes数据集进行预处理生成的gt文件。

## #模型集成

### #前处理

您可根据需要自行添加模型前处理，将其部署到 `CPU` 或 `DSP` 上，以centerpoint_pointpillar_nuscenes为例：

1. 增加前处理文件qat_centerpoint_preprocess_method.cc，以及头文件qat_centerpoint_preprocess_method.h。

2. 增加模型前处理配置文件。

#### #前处理文件及头文件添加

前处理文件 `qat_centerpoint_preprocess_method.cc` 放置于 ai_benchmark/code/src/method/ 路径下， 头文件 `qat_centerpoint_preprocess_method.h` 放置于 ai_benchmark/code/include/method/ 路径下：

`|── ai_benchmark | |── code # 示例源码 | | |── include | | | |── method # 在此文件夹中添加头文件 | | | | |── qat_centerpoint_preprocess_method.h | | | | |── ... | | |── src | | | |── method # 在此文件夹中添加前处理.cc文件 | | | | |── qat_centerpoint_preprocess_method.cc | | | | |── ...`

#### #模型前处理配置文件添加

`|── ai_benchmark | |── s100/qat/script # 示例脚本文件夹 | | |── config | | | |── preprocess | | | | |── centerpoint_preprocess_5dim.json # 前处理配置脚本`

centerpoint_pointpillar_nuscenes的前处理可以部署到 `CPU` 或 `DSP` 上，这取决于配置文件 `centerpoint_pointpillar_5dim.json` 中是否配置对应参数 `run_on_dsp`。 如果配置文件中的 `run_on_dsp` 设置为 `true` ，那么前处理将在 `DSP` 上运行，否则它在 `CPU` 上运行。

#### #前处理单帧延时评测

执行 `sh latency.sh` 脚本可对前处理的单帧延迟情况进行测试。如下所示：

`I0807 15:21:15.665417 21457 output_plugin.cc:95] Pre process latency: [avg: 11.338ms, max: 14.744ms, min: 8.200ms], Infer latency: [avg: 49.327ms, max: 51.065ms, min: 48.409ms], Post process latency: [avg: 9.681ms, max: 9.886ms, min: 9.544ms].`

其中：

- `Pre process` 表示前处理耗时。
- `Infer` 表示模型推理耗时。
- `Post process` 表示后处理耗时。

### #后处理

后处理集成主要有2个步骤，以CenterNet模型集成为例：

1. 增加后处理文件ptq_centernet_post_process_method.cc，以及头文件ptq_centernet_post_process_method.h。

2. 增加模型运行脚本及配置文件。

#### #后处理文件及头文件添加

后处理代码文件可直接复用src/method目录下任意后处理文件，主要修改 `InitFromJsonString` 函数，以及 `PostProcess` 函数即可。

`InitFromJsonString` 函数主要是读取workflow.json中的后处理相关的参数配置，您可自定义设置相应的输入参数。 `PostProcess` 函数主要完成后处理的逻辑。

后处理文件 `ptq_centernet_post_process_method.cc` 放置于 ai_benchmark/code/src/method/ 路径下，头文件 `ptq_centernet_post_process_method.h` 放置于 ai_benchmark/code/include/method/ 路径下：

`|── ai_benchmark | |── code # 示例源码 | | |── include | | | |── method # 在此文件夹中添加头文件 | | | | |── ptq_centernet_post_process_method.h | | | | |── ... | | |── src | | | |── method # 在此文件夹中添加后处理.cc文件 | | | | |── ptq_centernet_post_process_method.cc | | | | |── ...`

#### #模型运行脚本及配置文件添加

模型运行脚本及配置文件完成添加后的目录结构参考如下：

- centerpoint_pointpillar_nuscenes模型：

  `|── ai_benchmark | |── s100/qat/script # 示例脚本文件夹 | | |── detection | | | |── centerpoint_pointpillar_nuscenes | | | | |── accuracy.sh # 精度测试脚本 | | | | |── fps.sh # 性能测试脚本 | | | | |── latency.sh # 单帧延时示例脚本 | | | | |── README.md # DSP部署详细说明 | | | | |── workflow_accuracy # 精度配置文件夹 | | | | |── workflow_fps.json # 性能配置文件 | | | | |── workflow_latency.json # 单帧延时配置文件`

如需在 `DSP` 上部署，需要执行 `dsp_deploy.sh` 脚本部署 `DSP` 环境，详细介绍请参考该示例文件夹下的 `README.md` 中的介绍。

- motr_efficientnetb3_mot17模型：

  `|── ai_benchmark | |── s100/qat/script # 示例脚本文件夹 | | |── tracking | | | |── motr_efficientnetb3_mot17 | | | | |── accuracy.sh # 精度测试脚本 | | | | |── fps.sh # 性能测试脚本 | | | | |── generate_acc_lst.sh # 生成精度lst脚本 | | | | |── latency.sh # 单帧延时示例脚本 | | | | |── workflow_accuracy # 精度配置文件夹 | | | | |── workflow_fps.json # 性能配置文件 | | | | |── workflow_latency.json # 单帧延时配置文件`

- 除centerpoint_pointpillar_nuscenes模型及motr_efficientnetb3_mot17外其他模型：

  `|── ai_benchmark | |── s100/ptq/script # 示例脚本文件夹 | | |── detection | | | |── centernet_resnet101 | | | | |── accuracy.sh # 精度测试脚本 | | | | |── fps.sh # 性能测试脚本 | | | | |── latency.sh # 单帧延时示例脚本 | | | | |── workflow_accuracy.json # 精度配置文件 | | | | |── workflow_fps.json # 性能配置文件 | | | | |── workflow_latency.json # 单帧延时配置文件`

## #辅助工具

### #日志

​日志主要包括 示例日志 和 DNN日志 两部分。 其中示例日志是指交付包示例代码中所应用的日志，DNN日志是指嵌入式runtime库中的日志。 根据不同的需求可以设置不同的日志。

#### #示例日志

1. 日志级别

示例日志主要采用glog中的vlog，主要分为四个自定义级别：

- 0：SYSTEM级别，该级别日志主要用于输出报错信息。
- 1：REPORT级别，该级别日志在示例代码中主要用于输出性能数据。
- 2：DETAIL级别，该级别日志在示例代码中主要用于输出系统当前状态信息。
- 3：DEBUG级别，该级别日志在示例代码中主要用于输出调试信息。

2. 日志级别设置

日志处理机制说明：日志级别等级由高到低默认顺序为DEBUG>DETAIL>REPORT>SYSTEM，级别越高，输出日志越多。 即设置高等级，则会输出自身及低于自身等级的日志。

在运行示例时，日志级别需要通过 `log_level` 参数来进行设置。 例如，指定 `log_level=0`，则会输出SYSTEM级别日志。指定 `log_level=3`，则会输出DEBUG、DETAIL、REPORT及SYSTEM级别日志。

#### #dnn 日志

关于 `dnn` 日志的配置，请阅读模型推理API手册章节中的 配置信息 一节内容。

### #算子耗时

#### #概述

对OP性能的统计是通过设置 `HB_DNN_PROFILER_LOG_PATH` 环境变量实现的。对该变量的类型和取值说明如下：

`HB_DNN_PROFILER_LOG_PATH=${path}`：表示OP节点dump的输出路径，程序正常运行完退出后，产生profiler.log文件。

#### #示例

以mobilenetv1模型为例，开启单线程同时RunModel，设置 `export HB_DNN_PROFILER_LOG_PATH=./`，则profiler.log文件中会输出OP的性能数据。 其中包含 `model_latency` 和 `task_latency`，model_latency中输出了模型每个OP运行所需要的耗时情况，task_latency中输出了模型运行中各个task模块的耗时情况。

### #dump工具

​通过开启 `HB_DNN_DUMP_PATH` 这个环境变量可以dump出模型推理过程中每个节点的输入和输出。 通过dump工具，可以排查模拟器和真机是否存在一致性问题：即相同模型，相同输入，真机和模拟器的输出结果是否完全相同。

页面目录