9.4. AI Benchmark 使用说明

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

9.4.1. 发布物说明

AI Benchmark 示例包位于 horizon_x5_open_explorer 发布物的 samples/ai_benchmark/ 路径下,主要包括以下内容:

编号

名称

内容

1

code

包含示例源代码和编译脚本。

2

x5

示例包上板运行环境。

9.4.1.1. 示例包结构

注解

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

​示例包结构如下所示:

ai_benchmark/code/                    # 示例源码文件夹
├── build_ptq_x5.sh
├── build_qat_x5.sh
├── CMakeLists.txt
├── deps_gcc11.3                       # 第三方依赖库
├── include                           # 源码头文件
├── README.md
└── src                               # 示例源码

ai_benchmark/x5                       # 示例包运行环境
├── ptq                               # PTQ方案模型示例   ├── data                          # 模型精度评测数据集   ├── mini_data                     # 模型性能评测数据集   ├── model                         # PTQ方案nv12模型      ├── 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                     # 模型性能评测数据集
    ├── model                         # QAT方案nv12模型
       ├── README.md
       └── runtime -> ../../../../model_zoo/runtime/ai_benchmark/qat    # 软链接指向OE包中的模型,板端运行环境需要自行指定模型路径
    ├── README.md
    ├── script                        # 执行脚本
       ├── aarch64                   # 编译产生可执行文件及依赖库
       ├── bev                       # bev模型示例
       ├── classification            # 分类模型示例
       ├── config                    # 模型推理配置文件
       ├── detection                 # 检测模型示例
       ├── disparity_pred            # 深度估计模型示例
       ├── multitask                 # 多任务模型示例
       ├── opticalflow               # 光流模型示例
       ├── segmentation              # 分割模型示例
       ├── tracking                  # 追踪模型示例
       ├── traj_pred                 # 轨迹预测示例
       ├── env.sh                    # 基础环境脚本
       └── README.md
    └── tools                         # 前处理及精度评测工具
  • code:该目录内是评测程序的源码,用来进行模型性能和精度评测。

  • x5:该目录内提供了已经编译好的应用程序,以及各种评测脚本,用来测试多种模型在地瓜机器人 BPU 上运行的性能和精度等。

  • build_ptq_x5.sh:PTQ 真机程序一键编译脚本。

  • build_qat_x5.sh:QAT 真机程序一键编译脚本。

  • deps_gcc11.3:示例代码所需要的依赖,主要如下所示:

    appsdk  gflags  glog  nlohmann  opencv  rapidjson
    

9.4.1.2. 示例模型

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}

注解

model_zoo 中的 PTQ 和 QAT 模型通过原始模型编译而得到的,PTQ 原始模型的详细信息可以参考 PTQ 转换示例 章节进行了解, QAT 原始模型的详细信息可以参考 量化感知训练(QAT) 章节进行了解。

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

9.4.1.3. 公共数据集

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

9.4.2. 环境构建

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

  • 开发板准备

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

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

  • 编译环境准备

    编译需要当前环境安装好交叉编译工具 arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc。 然后执行 code 目录下的 build_ptq_x5.sh 和 build_qat_x5.sh 脚本即可一键编译真机环境下的可执行程序, 可执行程序和对应依赖会自动复制到 x5/ptq/scriptx5/qat/script 目录下的 aarch64 目录下。

    注解

    需要注意 build_ptq_x5.shbuild_qat_x5.sh 脚本里指定的交叉编译工具链的位置是 /opt 目录下,用户如果安装在其他位置,需要手动修改下脚本中的如下内容。

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

9.4.3. 示例使用

9.4.3.1. 评测示例

​评测示例脚本主要在 scripttools 目录下。

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

    • fps.sh:实现多线程 fps 统计(多线程调度,用户可以根据需求自由设置线程数)。

    • latency.sh:实现单帧延迟性能统计(一个线程,单帧)。

    • accuracy.sh:用于精度评测。

script:

├── aarch64                                    # 编译产生的可执行文件及依赖库   ├── bin
│   └── lib
├── env.sh                                     # 基础配置
├── config
│   ├── model
│      ├── data_name_list                     # image_name配置文件      └── input_init                         # 模型输入配置文件   ├── 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
      ├── cityscapes_metric.py
      ├── cls_eval.py
      ├── coco_metric.py
      ├── config.py
      ├── coco_det_eval.py
      ├── parsing_eval.py
      ├── voc_det_eval.py
      └── voc_metric.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/ai_benchmark/x5/ptq root@192.168.1.1:/userdata/ptq/
scp -r samples/ai_benchmark/x5/qat root@192.168.1.1:/userdata/qat/

9.4.3.2. json 配置文件参数信息

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

注解

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

9.4.3.2.1. 输入配置项(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_IMG_TYPE_Y 对应数字 0,

HB_DNN_IMG_TYPE_NV12 对应数字 1,

HB_DNN_IMG_TYPE_NV12_SEPARATE 对应数字 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

9.4.3.2.2. 输出配置项(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

9.4.3.2.3. workflow 配置项

模型推理配置项

参数名称

参数说明

涉及 json 文件

method_type

设置模型推理方法,此处需配置为 InferMethod

fps.json、latency.json、accuracy.json

method_config

设置模型推理参数。

  • core:设置推理 core id。

  • model_file:指定模型文件。

fps.json、latency.json、accuracy.json

注解

core x5 只有一个 bpu 核,这里只能设置为 0(core any)或者 1(core 0)。

后处理配置项

参数名称

参数说明

涉及 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

9.4.3.3. 性能评测

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

9.4.3.3.1. 使用说明

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      # 模型帧率

9.4.3.3.2. 命令行参数说明

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

9.4.3.3.3. 结果可视化

如果您希望可以看到模型单次推理出来效果,可以修改 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
}

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

模型类别

可视化效果

分类

../../../_images/classification.JPEG

2d 检测

../../../_images/detection2d.jpg

3d 检测

../../../_images/detection3d.png

分割

../../../_images/seg.png

关键点

../../../_images/keypoint.jpg

车道线

../../../_images/land_pred.png

光流

../../../_images/opticalflow.png

雷达

../../../_images/lidar.png

雷达多任务

../../../_images/lidar_det.png ../../../_images/lidar_seg.png

bev

../../../_images/bev_cam_front_left.png ../../../_images/bev_cam_front.png ../../../_images/bev_cam_front_right.png ../../../_images/bev_cam_back_left.png ../../../_images/bev_cam_back.png ../../../_images/bev_cam_back_right.png ../../../_images/bev_ego.png ../../../_images/bev_seg.png

轨迹预测

../../../_images/1_6191.png

深度估计

../../../_images/stereonet_disparity.png ../../../_images/stereonet_depth.png

注意

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

9.4.3.4. 精度评测

​模型评测分为五步:

1.数据预处理。

2.数据挂载。

3.生成 lst 文件。

4.模型推理。

5.精度计算。

9.4.3.4.1. 数据预处理

下文将分别对 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

数据集

用于 ssd_mobilenetv1 检测模型的评测。

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

数据集

用于 centernet_resnet101、detr_efficientnetb3_mscoco、detr_resnet50_mscoco、yolov2_darknet19、yolov3_darknet53、yolov3_vargdarknet、yolov5x、 preq_qat_fcos_efficientnetb0、preq_qat_fcos_efficientnetb2 和 preq_qat_fcos_efficientnetb3 检测模型的评测。

1.下载及参考下载结构可参考 如何准备数据集 章节。 示例中主要用到 annotations 文件夹下的 instances_val2017.json 标注文件和 images 中的图片。

2.数据集预处理方式:

hb_eval_preprocess -m model_name -i coco/coco_val2017/images -o ./pre_model_name

ImageNet

数据集

用于 efficientnasnet_m、efficientnasnet_s、efficientnet_lite0、efficientnet_lite1、efficientnet_lite2、efficientnet_lite3、 efficientnet_lite4、googlenet、mobilenetv1、mobilenetv2、resnet18 和 vargconvnet 分类模型的评测。

1.下载及参考下载结构可参考 如何准备数据集 章节。示例中主要用到标注文件 val.txt 和 val 目录中的源图片。

2.数据集预处理方式:

hb_eval_preprocess -m model_name -i imagenet/val -o ./pre_model_name

Cityscapes

数据集

用于 deeplabv3plus_efficientnetb0、deeplabv3plus_efficientnetm1、deeplabv3plus_efficientnetm2 和 fastscnn_efficientnetb0 模型的评测。

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_x5/x5/qat/tools/eval_preprocess 中对应模型的前处理脚本。 下面将详细介绍示例包中模型对应的数据集,以及其预处理操作。

小技巧

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

数据集

说明

ImageNet

数据集

用于 QAT 分类模型 mixvargenet_imagenet、mobilenetv1_imagenet、mobilenetv2_imagenet、resnet50_imagenet、horizon_swin_transformer_imagenet 和 vargnetv2_imagenet 的评测。

数据集预处理方式:

python3 imagenet.py --image-path=./standard_imagenet/val/ --save-path=./pre_model_name

VOC

数据集

用于检测模型 yolo_mobilenetv1_voc 的评测。

数据集预处理方式:

python3 voc.py --image-path=./VOCdevkit/VOC2012/JPEGImages/ --save-path=./pre_yolov3_mobilenetv1

COCO

数据集

用于 QAT 检测模型 fcos_efficientnetb0_mscoco 和 retinanet_vargnetv2_fpn_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
    
  • retinanet_vargnetv2_fpn_mscoco

    python3 retinanet_process.py --image-path=./mscoco/images/val2017/ \
    
                                 --label-path=./mscoco/images/annotations/instances_val2017.json \
    
                                 --save-path=./pre_retinanet
    

Cityscapes

数据集

用于 QAT 分割模型 unet_mobilenetv1_cityscapes 的评测,不需要前处理直接使用验证集数据即可。

FlyingChairs

数据集

用于 QAT 光流模型 pwcnet_pwcnetneck_flyingchairs 的评测。

1.本数据集您可以于 FlyingChairs 数据集官网下载地址 下载, 示例中主要用到了 FlyingChairs_release/data 中的数据和 ./FlyingChairs_train_val.txt 标注文件。 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地瓜机器人。

.
├── FlyingChairs_release
│   └── data
│       ├── 00001_img1.ppm
│       ├── 00001_img2.ppm
│       └── 00001_flow.ppm
├── FlyingChairs_train_val.txt

其中:

  • {id}_img1.ppm 和{id}_img2.ppm 是一个图像对,图像宽度大小是 512,高度大小是 38,id 是从 00001 至 22872 的序号,每一图像对的标签是{id}_flow.flo。

  • FlyingChairs_train_val 文件是用于划分训练集和验证集,标签值为 2 表示验证集。

2.数据集预处理方式:

python3 pwcnet_process.py --input-path=./flyingchairs/FlyingChairs_release/data/ \

                          --val-file=./flyingchairs/FlyingChairs_train_val.txt \

                          --output-path=./pre_pwcnet_opticalflow

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,detr3d_efficientnetb3_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

2.数据集预处理方式:

请注意

  • fcos3d_process.py 除了生成预处理图片外,还会对待使用的相机内参进行处理,生成相应的相机内参配置文件。

  • centerpoint_preprocess.py,bev_preprocess.py 和 lidar_preprocess.py 除了生成预处理数据外, 还会在预处理数据路径下生成一个 val_gt_infos.pkl 文件用于精度计算。

  • bev_preprocess.py 需要通过 --model 指定模型的名称,可选项有 bev_gkt_mixvargenet_multitask_nuscenes, bev_ipm_4d_efficientnetb0_multitask_nuscenes,bev_ipm_efficientnetb0_multitask_nuscenes,bev_lss_efficientnetb0_multitask_nuscenes, detr3d_efficientnetb3_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
    

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

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

9.4.3.4.2. 数据挂载

由于数据集相对较大,不适合直接放在开发板上,可以采用挂载的方式供开发板读取,需要在服务器 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 同级目录。

9.4.3.4.3. 生成 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 文件,参考生成方式如下:

除 Densetnt_vectornet_argoverse1、Bev、Motr_efficientnetb3_mot17 和 Stereonetplus_mixvargenet_sceneflow 模型外,其余模型的 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 中的路径信息,能读取到对应的前处理文件。

argoverse1:

sh generate_acc_lst.sh

这样生成的 lst 文件中存储的路径为一个相对路径: ../../../data/argoverse1/densetnt/ , 可以与 workflow_accuracy.json 默认的配置路径吻合。

对于 Densetnt_vectornet_argoverse1、Bev、Motr_efficientnetb3_mot17 和 Stereonetplus_mixvargenet_sceneflow 模型,lst 文件参考生成方式:

模型名

lst 文件参考生成方式及说明

Densetnt

参考生成方式:

sh generate_acc_lst.sh

这样生成的 lst 文件中存储的路径为一个相对路径: ../../../data/argoverse1/densetnt/ ,可以与 workflow_accuracy.json 默认的配置路径吻合。

Bev

以 bev_ipm_efficientnetb0_multitask 模型为例,该模型有图像和参考点两种输入,同一帧输入的图片和参考点名称相同。 为了保证输入相对应,在执行 find 命令时需要添加 sort 按名称进行排序。参考生成方式:

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

detr3d_efficientnetb3_nuscenes 除了图像和参考点还有 coords,masks 和 position embedding 输入,生成 lst 方式如下:

find ../../../data/nuscenes_bev/coords0 -name "*bin*" | sort > ../../../data/nuscenes_bev/coords0.lst

find ../../../data/nuscenes_bev/coords1 -name "*bin*" | sort > ../../../data/nuscenes_bev/coords1.lst

find ../../../data/nuscenes_bev/coords2 -name "*bin*" | sort > ../../../data/nuscenes_bev/coords2.lst

find ../../../data/nuscenes_bev/coords3 -name "*bin*" | sort > ../../../data/nuscenes_bev/coords3.lst

find ../../../data/nuscenes_bev/masks -name "*bin*" | sort > ../../../data/nuscenes_bev/masks.lst

请注意

bev 模型中,detr3d_efficientnetb3_nuscenes 的 reference_points 用于模型后处理, 需要在 workflow_accuracy.json 配置正确的路径,确保程序能够读到对应的参考点文件。

此外,bev_ipm_4d_efficientnetb0_multitask 是时序模型,该模型对输入顺序有要求。因此,我们提供了专门的脚本 gen_file_list.sh 用于生成 lst 文件,使用方式如下:

sh gen_file_list.sh

这样生成的 lst 文件中存储的路径为一个相对路径: ../../../data/nuscenes_bev/ ,可以与 workflow_accuracy.json 默认的配置路径吻合。 如果需要更改前处理数据集的存放位置,则需要确保对应的 lst 文件可以被 workflow_accuracy.json 读取到。 其次需要确保程序根据 lst 中的路径信息,能读取到对应的前处理文件。

Motr

参考生成方式:

sh generate_acc_lst.sh

这样生成的 lst 文件中存储的路径为一个相对路径: ../../../data/mot17/motr/ ,可以与 workflow_accuracy.json 默认的配置路径吻合。 如果需要更改前处理数据集的存放位置,则需要确保对应的 lst 文件可以被 workflow_accuracy.json 读取到。 其次需要确保程序根据 lst 中的路径信息,能读取到对应的前处理文件。

Stereonetplus

以 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

9.4.3.4.4. 模型推理

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@x5dvb-hynix8G:/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,"class_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,"class_name":"
...

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

9.4.3.4.5. 精度计算

注意

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

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

PTQ 模型精度计算

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

  • cls_eval.py 用于计算分类模型的精度。

  • coco_det_eval.py 用于计算使用 COCO 数据集评测的检测模型的精度。

  • parsing_eval.py 用于计算使用 Cityscapes 数据集评测的分割模型的精度。

  • voc_det_eval.py 用于计算使用 VOC 数据集评测的检测模型的精度。

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

模型类型

精度计算方式说明

分类模型

使用 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 coco_det_eval.py --eval_result_path=eval.log --annotation_path=instances_val2017.json

其中:

  • eval_result_path:检测模型的预测结果文件。

  • annotation_path:COCO 数据集的标注文件。

2.使用 VOC 数据集的检测模型精度计算方式如下:

python3 voc_det_eval.py --eval_result_path=eval.log --annotation_path=../Annotations --val_txt_path=../val.txt

其中:

  • eval_result_path:检测模型的预测结果文件。

  • annotation_path:VOC 数据集的标注文件。

  • val_txt_path:VOC 数据集中 ImageSets/Main 文件夹下的 val.txt 文件。

分割模型

使用 Cityscapes 数据集的分割模型精度计算方式如下:

python3 parsing_eval.py --log_file=eval.log --gt_path=cityscapes/gtFine/val

其中:

  • log_file:分割模型的预测结果文件。

  • gt_path:Cityscapes 数据集的标注文件。

QAT 模型精度计算

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

  • bev_eval.py 用于计算 bev 模型的精度。

  • centerpoint_eval.py 用于计算雷达 3D 模型 centerpoint_pointpillar_nuscenes 的精度。

  • cls_eval.py 用于计算分类模型的精度。

  • densetnt_eval.py 用于计算 densetnt 轨迹预测模型 densetnt_vectornet_argoverse1 的精度。

  • detr_eval.py 用于计算 detr 检测模型的精度。

  • fcos3d_eval.py 用于计算检测模型 fcos3d_efficientnetb0_nuscenes 的精度。

  • fcos_eval.py 用于计算 fcos 检测模型的精度。

  • ganet_eval.py 用于计算检测模型 ganet_mixvargenet_culane 的精度。

  • keypoints_eval.py 用于计算检测模型 keypoint_efficientnetb0_carfusion 的精度。

  • lidar_multitask_eval.py 用于计算 lidar 多任务模型 centerpoint_mixvargnet_multitask_nuscenes 的精度。

  • motr_eval.py 用于计算 motr 检测模型 motr_efficientnetb3_mot17 的精度。

  • parsing_eval.py 用于计算使用 Cityscapes 数据集评测的分割模型的精度。

  • pointpillars_eval.py 用于计算检测模型 pointpillars_kitti_car 的精度。

  • pwcnet_eval.py 用于计算使用 FlyingChairs 数据集评测的光流模型 pwcnet_pwcnetneck_flyingchairs 的精度。

  • retinanet_eval.py 用于计算检测模型 retinanet_vargnetv2_fpn_mscoco 的精度。

  • yolov3_eval.py 用于计算 yolov3 检测模型的精度。

  • stereonet_eval.py 用于计算深度估计模型 stereonetplus_mixvargenet_sceneflow 的精度。

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

模型类型

精度计算方式说明

Bev 模型

使用 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/

# detr3d_efficientnetb3_nuscenes 为 bev 检测模型,不需要指定 --seg_eval_path

python3 bev_eval.py --det_eval_path=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 信息路径。

分类模型

使用 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 retinanet_eval.py --eval_result_path=eval.log --annotation_path=instances_val2017.json \

                          --image_path=./mscoco/images/val2017/

其中:

  • eval_result_path:retinanet 检测模型的预测结果文件。

  • annotation_path:COCO 数据集的标注文件。

  • image_path:COCO 原始数据集。

python3 detr_eval.py --eval_result_path=eval.log --annotation_path=instances_val2017.json \

                          --image_path=./mscoco/images/val2017/

其中:

  • eval_result_path:retinanet 检测模型的预测结果文件。

  • annotation_path:COCO 数据集的标注文件。

  • image_path:COCO 原始数据集。

2.使用 VOC 数据集的检测模型精度计算方式示例如下:

python3 yolov3_eval.py --eval_result_path=eval.log --annotation_path=../Annotations --val_txt_path=../val.txt \

                       --image_height=416  --image_width=416

其中:

  • eval_result_path:检测模型的预测结果文件。

  • annotation_path:VOC 数据集的标注文件。

  • val_txt_path:VOC 数据集中 ImageSets/Main 文件夹下的 val.txt 文件。

  • image_height: 图像的高度。

  • image_width: 图像的宽度。

3.使用 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。

4.使用 Culane 数据集的检测模型精度计算方式如下:

python3 ganet_eval.py --eval_path=eval.log --image_path=./culane

其中:

  • eval_result_path:检测模型的预测结果文件。

  • image_path:culane 数据集。

5.使用 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 信息路径。

6.使用 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 数据集的标注文件。

光流模型

使用 FlyingChairs 数据集的光流模型精度计算方式如下:

python3 pwcnet_eval.py --log_file=eval.log --gt_path=./flyingchairs/FlyingChairs_release/data/ \

                       --val_file=./flyingchairs/FlyingChairs_train_val.txt

其中:

  • log_file:光流模型的预测结果文件。

  • val_file:FlyingChairs 数据集标签文件。

  • gt_path:FlyingChairs 数据集原始文件。

追踪模型

使用 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 数据集路径。

轨迹预测模型

使用 argoverse1 数据集的追踪模型计算方式如下:

python3 densetnt_eval.py --eval_result_path=eval.log --meta_path=argoverse1/meta

其中:

  • eval_result_path:轨迹预测的预测结果文件。

  • meta_path:argoverse1 数据集生成的的标注文件,使用预处理脚本后,生成在原数据集目录 meta 中。

深度估计模型

使用 Sceneflow 数据集的深度估计模型精度计算方式如下:

python3 stereonet_eval.py --log_file=eval.log --gt_file=val_gt_infos.pkl

其中:

  • log_file:深度估计模型的预测结果文件。

  • gt_file:对 Sceneflow 数据集进行预处理生成的 gt 文件。

9.4.4. 模型集成

9.4.4.1. 前处理

您可根据需要自行添加模型前处理,将其部署到 CPU 上,以 centerpoint_pointpillar_nuscenes 为例:

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

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

9.4.4.1.1. 前处理文件及头文件添加

前处理文件 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
|  |  |  |  |── ...

9.4.4.1.2. 模型前处理配置文件添加

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

9.4.4.1.3. 前处理单帧延时评测

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

I0615 13:30:40.772293  3670 output_plugin.cc:91]  Pre process latency: [avg:  20.295ms,  max:  28.690ms,  min:  18.512ms], Infer latency:  [avg:  25.053ms,  max:  31.943ms,  min:  24.702ms], Post process latency: [avg:  52.760ms,  max:  54.099ms,  min:  51.992ms].

其中:

  • Pre process 表示前处理耗时。

  • Infer 表示模型推理耗时。

  • Post process 表示后处理耗时。

9.4.4.2. 后处理

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

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

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

9.4.4.2.1. 后处理文件及头文件添加

后处理代码文件可直接复用 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
|  |  |  |  |── ...

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

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

  • centerpoint_pointpillar_nuscenes 模型:

    |── ai_benchmark
    |  |── x5/qat/script                                       # 示例脚本文件夹
    |  |  |── detection
    |  |  |  |── centerpoint_pointpillar_nuscenes
    |  |  |  |  |── accuracy.sh                                # 精度测试脚本
    |  |  |  |  |── fps.sh                                     # 性能测试脚本
    |  |  |  |  |── latency.sh                                 # 单帧延时示例脚本
    |  |  |  |  |── workflow_accuracy                          # 精度配置文件夹
    |  |  |  |  |── workflow_fps.json                          # 性能配置文件
    |  |  |  |  |── workflow_latency.json                      # 单帧延时配置文件
    
  • motr_efficientnetb3_mot17 模型:

    |── ai_benchmark
    |  |── x5/qat/script                                       # 示例脚本文件夹
    |  |  |── tracking
    |  |  |  |── motr
    |  |  |  |  |── 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
    |  |── x5/ptq/script                                       # 示例脚本文件夹
    |  |  |── detection
    |  |  |  |── centernet_resnet101
    |  |  |  |  |── accuracy.sh                                # 精度测试脚本
    |  |  |  |  |── fps.sh                                     # 性能测试脚本
    |  |  |  |  |── latency.sh                                 # 单帧延时示例脚本
    |  |  |  |  |── workflow_accuracy.json                     # 精度配置文件
    |  |  |  |  |── workflow_fps.json                          # 性能配置文件
    |  |  |  |  |── workflow_latency.json                      # 单帧延时配置文件
    

9.4.5. 辅助工具

9.4.5.1. 日志

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

9.4.5.1.1. 示例日志

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 级别日志。

9.4.5.1.2. dnn 日志

关于 dnn 日志的配置,请阅读 BPU SDK API 手册中的 配置信息 一节内容。

9.4.5.2. 算子耗时

9.4.5.2.1. 概述

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

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

9.4.5.2.2. 示例

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

9.4.5.3. dump 工具

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