6.3.4. 模型上板运行应用开发说明
6.3.4.1. 模型推理DNN API使用示例说明
概述
本
示例
模型
推理 dnn API使用 示例。 自定义
算子(custom OP)等 特殊 功能 示例。 非NV12输入
模型 的 杂项 示例。
详细
小
horizon_runtime_sample 示例
示例代码包结构介绍
+---horizon_runtime_sample
|-- code # 示例源码
| |-- 00_quick_start # 快速入门示例,用mobilenetv1读取单张图片进行推理的示例代码
| | |-- CMakeLists.txt
| | |-- CMakeLists_x86.txt
| | `-- src
| |-- 01_api_tutorial # BPU SDK DNN API使用示例代码
| | |-- CMakeLists.txt
| | |-- mem
| | |-- model
| | |-- roi_infer
| | `-- tensor
| |-- 02_advanced_samples # 特殊功能示例
| | |-- CMakeLists.txt
| | |-- custom_identity
| | |-- multi_input
| | |-- multi_model_batch
| | `-- nv12_batch
| |-- 03_misc # 杂项示例
| | |-- CMakeLists.txt
| | |-- lenet_gray
| | `-- resnet_feature
| |-- build_x5.sh # 上板aarch64编译脚本
| |-- build_x86.sh # PC端X86编译脚本
| |-- CMakeLists.txt
| |-- CMakeLists_x86.txt
| `-- deps_gcc11.3 # 编译依赖库
| |-- aarch64
| `-- x86
|-- README.md
`-- x5
|-- data # 预置数据文件
| |-- cls_images
| |-- custom_identity_data
| |-- det_images
| |-- dsl_data
| `-- misc_data
|-- model
| |-- README.md
| `-- runtime -> ../../../model_zoo/runtime/horizon_runtime_sample # 软链接指向OE包中的模型,板端运行环境需要自行指定模型路径
|-- script # aarch64示例运行脚本
| |-- 00_quick_start
| |-- 01_api_tutorial
| |-- 02_advanced_samples
| |-- 03_misc
| `-- README.md
`-- script_x86 # x86示例运行脚本
|-- 00_quick_start
`-- README.md
code:该
目录 内 是 示例 的 源码。 code/00_quick_start:快速
入门 示例,基于 dnn API,用mobilenetv1进行 单张 图片 模型 推理 和 结果 解析。 code/01_api_tutorial:dnn API使用
教学 代码,包括 mem, model , roi_infer 和 tensor 四 部分。 code/02_advanced_samples:特殊
功能 示例,包括 custom_identity, multi_input, multi_model_batch 和 nv12_batch 功能。 ode/03_misc:非NV12输入
模型 的 杂项 示例。 code/build_x5.sh:程序
一键 编译 脚本。 code/build_x86.sh:x86仿真
环境 一键 编译 脚本。 code/deps_gcc11.3:示例
代码 所 需要 的 三方 依赖, 用户 在 开发 自己 代码 程序 的 时候 可以 根据 实际 情况 替换 或者 裁剪。 x5:示例
运行 脚本,预置 了 数据 和 相关 模型
注意:
私有00_quick_start/src/run_mobileNetV1_224x224.cc 示例
环境构建
开发板准备
拿到
开发板 后,请 将 开发 版 镜像 更新 到 最新 版本,升级 方法 请 参考系统 更新 章节内容。 确保
本地 开发 机和 开发板 可以 远程 连接。
编译
编译arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu。 请build_x5.sh 脚本,即可x5/script 目录aarch64 目录
备注:
工程LINARO_GCC_ROOT 来LINARO_GCC_ROOT , 或者build_x5.sh,指定CC 和 CXX。
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++
示例使用
basic_samples 示例
模型
# X5 使用脚本信息
├── data
│ ├── cls_images
│ │ ├── cat_cls.jpg
│ │ └── zebra_cls.jpg
│ ├── custom_identity_data
│ │ ├── input0.bin
│ │ └── input1.bin
│ ├── det_images
│ │ └── kite.jpg
│ ├── dsl_data
│ │ └── zebra_bgr.bin
│ └── misc_data
│ ├── 7.bin
│ └── np_0
├── model
│ ├── README.md
│ └── runtime -> ../../../model_zoo/runtime/horizon_runtime_sample
├── script # 编译产生可执行程序及依赖库
│ ├── 00_quick_start
│ │ ├── README.md
│ │ └── run_mobilenetV1.sh
│ ├── 01_api_tutorial
│ │ ├── README.md
│ │ ├── model.sh
│ │ ├── roi_infer.sh
│ │ ├── sys_mem.sh
│ │ └── tensor.sh
│ ├── 02_advanced_samples
│ │ ├── README.md
│ │ ├── plugin
│ │ │ └── custom_arm_op_custom_identity.sh
│ │ ├── run_multi_input.sh
│ │ ├── run_multi_model_batch.sh
│ │ └── run_nv12_batch.sh
│ ├── 03_misc
│ │ ├── README.md
│ │ ├── run_lenet.sh
│ │ └── run_resnet50_feature.sh
│ ├── README.md
│ └── aarch64
│ ├── bin
│ │ ├── model_example
│ │ ├── roi_infer
│ │ ├── run_custom_op
│ │ ├── run_lenet_gray
│ │ ├── run_mobileNetV1_224x224
│ │ ├── run_multi_model_batch
│ │ ├── run_resnet_feature
│ │ ├── sys_mem_example
│ │ └── tensor_example
│ └── lib
│ ├── libdnn.so
│ ├── libhbrt_bayes_aarch64.so
│ └── libopencv_world.so.3.4
└── script_x86
├── 00_quick_start
│ ├── README.md
│ └── run_mobilenetV1.sh
└── README.md
备注:
model文件夹
下 包含 模型 的 路径,其中 runtime文件夹为 软 链接,链接 路径 为 ../../../model_zoo/runtime/horizon_runtime_sample,可直接 找到 交付 包中 的 模型 路径 板端
运行 环境 需要 将 模型 放至 model文件夹下
quick_start
00_quick_start 目录
00_quick_start/
├── README.md
└── run_mobilenetV1.sh
run_mobilenetV1.sh:该脚本 实现 使用mobilenetv1模型 读取 单张 图片 进行 推理 的 示例 功能。使用 的 时候,进入 00_quick_start 目录, 然后 直接 执行 sh run_mobilenetV1.sh 即可,如下 代码 块 所示:
#!/bin/sh
root@x5dvb:/userdata/app/horizon/basic_samples/x5/script/00_quick_start# sh run_mobilenetV1.sh
../aarch64/bin/run_mobileNetV1_224x224 --model_file=../../model/runtime/mobilenetv1/mobilenetv1_224x224_nv12.bin --image_file=../../data/cls_images/zebra_cls.jpg --top_k=5
I0000 00:00:00.000000 10765 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:51:17.206.804) [HorizonRT] The model builder version = 1.15.0
I0411 17:51:17.244180 10765 run_mobileNetV1_224x224.cc:135] DNN runtime version: 1.17.2_(3.15.18 HBRT)
I0411 17:51:17.244376 10765 run_mobileNetV1_224x224.cc:252] input[0] name is data
I0411 17:51:17.244508 10765 run_mobileNetV1_224x224.cc:268] output[0] name is prob
I0411 17:51:17.260176 10765 run_mobileNetV1_224x224.cc:159] read image to tensor as nv12 success
I0411 17:51:17.262075 10765 run_mobileNetV1_224x224.cc:194] TOP 0 result id: 340
I0411 17:51:17.262118 10765 run_mobileNetV1_224x224.cc:194] TOP 1 result id: 292
I0411 17:51:17.262148 10765 run_mobileNetV1_224x224.cc:194] TOP 2 result id: 282
I0411 17:51:17.262177 10765 run_mobileNetV1_224x224.cc:194] TOP 3 result id: 83
I0411 17:51:17.262205 10765 run_mobileNetV1_224x224.cc:194] TOP 4 result id: 290
api_tutorial
01_api_tutorial 目录
├── model.sh
├── roi_infer.sh
├── sys_mem.sh
└── tensor.sh
model.sh:该脚本 主要 实现 读取 模型 信息 的 功能。 使用 的 时候,直接 进入 01_api_tutorial 目录,然后 直接 执行 sh model.sh即可,如下所示:
#!/bin/sh
root@x5dvb-hynix8G:/userdata/horizon/x5/script/01_api_tutorial# sh model.sh
../aarch64/bin/model_example --model_file_list=../../model/runtime/mobilenetv1/mobilenetv1_224x224_nv12.bin
I0000 00:00:00.000000 10810 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:53:28.970.396) [HorizonRT] The model builder version = 1.15.0
I0411 17:53:29.007853 10810 model_example.cc:104] model count:1, model[0]: mobilenetv1_224x224_nv12
I0411 17:53:29.007939 10810 model_example.cc:112] hbDNNGetModelHandle [mobilenetv1_224x224_nv12] success!
I0411 17:53:29.008011 10810 model_example.cc:186] [mobilenetv1_224x224_nv12] Model Info: input num: 1, input[0] validShape: ( 1, 3, 224, 224 ), alignedShape: ( 1, 3, 224, 224 ), tensorType: 1, output num: 1, output[0] validShape: ( 1, 1000, 1, 1 ), alignedShape: ( 1, 1000, 1, 1 ), tensorType: 13
roi_infer.sh: 该脚本 主要 引导 如何 使用 hbDNNRoiInfer这个API,示例代码 实现 的 功能 是 将 一张 图片resize到 模型 输入 大小,转为nv12数据,并 给定roi框 进行 模型 推理(infer)。 使用 的 时候,直接 进入 01_api_tutorial 目录,然后 直接 执行 sh roi_infer.sh即可。sys_mem.sh:该脚本 主要 引导 如何 使用 hbSysAllocMem、hbSysFlushMem和hbSysFreeMem这几个API。使用 的 时候,直接 进入 01_api_tutorial 目录,执行 sh sys_mem.sh即可。tensor.sh:该脚本 主要 引导 如何 准备 模型 输入 和 输出 的tensor。 使用 的 时候,直接 进入 01_api_tutorial 目录,执行 sh tensor.sh即可,如下所示:
root@x5dvb-hynix8G:/userdata/horizon/x5/script/01_api_tutorial# sh tensor.sh
*****************************test_prepare_free_fn*************************************************
Tensor data type:0, Tensor layout: 2, shape:1x1x721x1836, aligned shape:1x1x721x1840
Tensor data type:1, Tensor layout: 2, shape:1x3x773x329, aligned shape:1x3x773x336
Tensor data type:2, Tensor layout: 2, shape:1x3x108x1297, aligned shape:1x3x108x1312
Tensor data type:5, Tensor layout: 2, shape:1x3x858x477, aligned shape:1x3x858x477
Tensor data type:5, Tensor layout: 0, shape:1x920x102x3, aligned shape:1x920x102x3
Tensor data type:4, Tensor layout: 2, shape:1x3x723x1486, aligned shape:1x3x723x1486
Tensor data type:4, Tensor layout: 0, shape:1x372x366x3, aligned shape:1x372x366x3
Tensor data type:3, Tensor layout: 2, shape:1x3x886x291, aligned shape:1x3x886x291
Tensor data type:3, Tensor layout: 0, shape:1x613x507x3, aligned shape:1x613x507x3
*****************************test_prepare_free_fn************************************************
*****************************test_info_fn********************************************************
Tensor data type:14, shape:1x1x1x3x2, stride:24x24x24x8x4, ndim: 5, data:
[[[[[0, 1], [2, 3], [4, 5]]]]]
Tensor data type:9, shape:3x3x1x2x1, stride:6x2x2x1x1, ndim: 5, data:
[[[[[0], [1]]], [[[2], [3]]], [[[4], [5]]]], [[[[6], [7]]], [[[8], [9]]],
[[[10], [11]]]], [[[[12], [13]]], [[[14], [15]]], [[[16], [17]]]]]
*****************************test_info_fn********************************************************
********************test_dequantize_fn***********************************************************
Tensor data type:8, shape:1x1x2x4, ndim: 4, quantiType: 2, quantizeAxis: 1,
quantizeValue: (0.1,), data: [[[[0, 1, 2, 3], [4, 5, 6, 7]]]],
dequantize data: [[[[0, 0.1, 0.2, 0.3], [0.4, 0.5, 0.6, 0.7]]]]
Tensor data type:8, shape:2x4x1x1, ndim: 4, quantiType: 2, quantizeAxis: 3,
quantizeValue: (0.1,),
data: [[[[0]], [[1]], [[2]], [[3]]], [[[4]], [[5]], [[6]], [[7]]]],
dequantize data: [[[[0]], [[0.1]], [[0.2]], [[0.3]]], [[[0.4]], [[0.5]], [[0.6]], [[0.7]]]]
********************test_dequantize_fn***********************************************************
advanced_samples
02_advanced_samples 目录
├── plugin
│ └── custom_arm_op_custom_identity.sh
├── README.md
├── run_multi_input.sh
├── run_multi_model_batch.sh
└── run_nv12_batch.sh
custom_arm_op_custom_identity.sh:该脚本 主要 实现 自定义 算子 模型 推理 功能, 使用 的 时候,进入 02_advanced_samples 目录, 然后 直接 执行 sh custom_arm_op_custom_identity.sh即可,如下所示:
root@x5dvb-hynix8G:/userdata/horizon/x5/script/02_advanced_samples# sh custom_arm_op_custom_identity.sh
../../aarch64/bin/run_custom_op --model_file=../../../model/runtime/custom_op/custom_op_featuremap.bin --input_file=../../../data/custom_identity_data/input0.bin,../../../data/custom_identity_data/input1.bin
I0000 00:00:00.000000 10841 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
I0411 17:55:59.928918 10841 main.cpp:212] hbDNNRegisterLayerCreator success
I0411 17:55:59.929064 10841 main.cpp:217] hbDNNRegisterLayerCreator success
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:56:00.667.991) [HorizonRT] The model builder version = 1.15.0
I0411 17:56:00.676071 10841 main.cpp:232] hbDNNGetModelNameList success
I0411 17:56:00.676204 10841 main.cpp:239] hbDNNGetModelHandle success
I0411 17:56:00.676276 10841 main.cpp:245] hbDNNGetInputCount success
file length: 602112
file length: 602112
I0411 17:56:00.687402 10841 main.cpp:268] hbDNNGetOutputCount success
I0411 17:56:00.687788 10841 main.cpp:297] hbDNNInfer success
I0411 17:56:00.695663 10841 main.cpp:302] task done
I0411 17:56:03.145243 10841 main.cpp:306] write output tensor
模型
run_multi_input.sh:该脚本 主要 实现 多个 小 模型 批量 推理 功能, 使用 的 时候,进入 02_advanced_samples 目录, 然后 直接 执行 sh run_multi_input.sh即可,如下所示:
root@x5dvb:/userdata/horizon/x5/script/02_advanced_samples# sh run_multi_input.sh
../aarch64/bin/run_multi_input --model_file=../../model/runtime/mobilenetv2/mobilenetv2_multi_224x224_gray.bin --image_file=../../data/cls_images/zebra_cls.jpg --top_k=5
I0000 00:00:00.000000 10893 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:57:03.277.375) [HorizonRT] The model builder version = 1.15.0
I0411 17:57:03.327527 10893 multi_input.cc:148] read image to tensor as bgr success
I0411 17:57:03.329546 10893 multi_input.cc:183] TOP 0 result id: 340
I0411 17:57:03.329598 10893 multi_input.cc:183] TOP 1 result id: 292
I0411 17:57:03.329628 10893 multi_input.cc:183] TOP 2 result id: 352
I0411 17:57:03.329656 10893 multi_input.cc:183] TOP 3 result id: 351
I0411 17:57:03.329684 10893 multi_input.cc:183] TOP 4 result id: 282
run_multi_model_batch.sh:该脚本 主要 实现 多个 小 模型 批量 推理 功能, 使用 的 时候,进入 02_advanced_samples 目录, 然后 直接 执行 sh run_multi_model_batch.sh即可,如下代码 块 所示:
root@x5dvb-hynix8G:/userdata/horizon/x5/script/02_advanced_samples# sh run_multi_model_batch.sh
../aarch64/bin/run_multi_model_batch --model_file=../../model/runtime/googlenet/googlenet_224x224_nv12.bin,../../model/runtime/mobilenetv2/mobilenetv2_224x224_nv12.bin --input_file=../../data/cls_images/zebra_cls.jpg,../../data/cls_images/zebra_cls.jpg
I0000 00:00:00.000000 10916 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:57:43.547.52) [HorizonRT] The model builder version = 1.15.0
[A][DNN][packed_model.cpp:225][Model](2023-04-11,17:57:51.811.477) [HorizonRT] The model builder version = 1.15.0
I0411 17:57:51.844280 10916 main.cpp:117] hbDNNInitializeFromFiles success
I0411 17:57:51.844388 10916 main.cpp:125] hbDNNGetModelNameList success
I0411 17:57:51.844424 10916 main.cpp:139] hbDNNGetModelHandle success
I0411 17:57:51.875140 10916 main.cpp:153] read image to nv12 success
I0411 17:57:51.875686 10916 main.cpp:170] prepare input tensor success
I0411 17:57:51.875875 10916 main.cpp:182] prepare output tensor success
I0411 17:57:51.876082 10916 main.cpp:216] infer success
I0411 17:57:51.878844 10916 main.cpp:221] task done
I0411 17:57:51.878948 10916 main.cpp:226] googlenet class result id: 340
I0411 17:57:51.879084 10916 main.cpp:230] mobilenetv2 class result id: 340
I0411 17:57:51.879177 10916 main.cpp:234] release task success
run_nv12_batch.sh:该脚本 主要 实现batch模型 推理 功能,Infer1是 分开 设置 输入 张量 每个batch的 地址,Infer2是 只 设置 一个 地址,包含 所有 的batch, 使用 的 时候,进入 02_advanced_samples目录, 然后直接 执行 sh run_nv12_batch.sh即可,如下代码 块 所示:
root@x5dvb:/userdata/horizon/x5/script/02_advanced_samples# sh run_nv12_batch.sh
../aarch64/bin/run_nv12_batch --model_file=../../model/runtime/googlenet/googlenet_4x224x224_nv12.bin --image_file=../../data/cls_images/zebra_cls.jpg,../../data/cls_images/cat_cls.jpg,../../data/cls_images/zebra_cls.jpg,../../data/cls_images/cat_cls.jpg --top_k=5
I0000 00:00:00.000000 21511 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
I0705 11:39:43.429180 21511 nv12_batch.cc:151] Infer1 start
I0705 11:39:43.488143 21511 nv12_batch.cc:166] read image to tensor as nv12 success
I0705 11:39:43.491156 21511 nv12_batch.cc:201] Batch[0]:
I0705 11:39:43.491211 21511 nv12_batch.cc:203] TOP 0 result id: 340
I0705 11:39:43.491240 21511 nv12_batch.cc:203] TOP 1 result id: 83
I0705 11:39:43.491266 21511 nv12_batch.cc:203] TOP 2 result id: 41
I0705 11:39:43.491298 21511 nv12_batch.cc:203] TOP 3 result id: 912
I0705 11:39:43.491324 21511 nv12_batch.cc:203] TOP 4 result id: 292
I0705 11:39:43.491348 21511 nv12_batch.cc:201] Batch[1]:
I0705 11:39:43.491374 21511 nv12_batch.cc:203] TOP 0 result id: 282
I0705 11:39:43.491398 21511 nv12_batch.cc:203] TOP 1 result id: 281
I0705 11:39:43.491422 21511 nv12_batch.cc:203] TOP 2 result id: 285
I0705 11:39:43.491447 21511 nv12_batch.cc:203] TOP 3 result id: 287
I0705 11:39:43.491472 21511 nv12_batch.cc:203] TOP 4 result id: 283
I0705 11:39:43.491497 21511 nv12_batch.cc:201] Batch[2]:
I0705 11:39:43.491514 21511 nv12_batch.cc:203] TOP 0 result id: 340
I0705 11:39:43.491539 21511 nv12_batch.cc:203] TOP 1 result id: 83
I0705 11:39:43.491564 21511 nv12_batch.cc:203] TOP 2 result id: 41
I0705 11:39:43.491587 21511 nv12_batch.cc:203] TOP 3 result id: 912
I0705 11:39:43.491612 21511 nv12_batch.cc:203] TOP 4 result id: 292
I0705 11:39:43.491637 21511 nv12_batch.cc:201] Batch[3]:
I0705 11:39:43.491662 21511 nv12_batch.cc:203] TOP 0 result id: 282
I0705 11:39:43.491685 21511 nv12_batch.cc:203] TOP 1 result id: 281
I0705 11:39:43.491710 21511 nv12_batch.cc:203] TOP 2 result id: 285
I0705 11:39:43.491734 21511 nv12_batch.cc:203] TOP 3 result id: 287
I0705 11:39:43.491760 21511 nv12_batch.cc:203] TOP 4 result id: 283
I0705 11:39:43.492235 21511 nv12_batch.cc:223] Infer1 end
I0705 11:39:43.492276 21511 nv12_batch.cc:228] Infer2 start
I0705 11:39:43.549713 21511 nv12_batch.cc:243] read image to tensor as nv12 success
I0705 11:39:43.552248 21511 nv12_batch.cc:278] Batch[0]:
I0705 11:39:43.552292 21511 nv12_batch.cc:280] TOP 0 result id: 340
I0705 11:39:43.552320 21511 nv12_batch.cc:280] TOP 1 result id: 83
I0705 11:39:43.552345 21511 nv12_batch.cc:280] TOP 2 result id: 41
I0705 11:39:43.552371 21511 nv12_batch.cc:280] TOP 3 result id: 912
I0705 11:39:43.552397 21511 nv12_batch.cc:280] TOP 4 result id: 292
I0705 11:39:43.552421 21511 nv12_batch.cc:278] Batch[1]:
I0705 11:39:43.552445 21511 nv12_batch.cc:280] TOP 0 result id: 282
I0705 11:39:43.552469 21511 nv12_batch.cc:280] TOP 1 result id: 281
I0705 11:39:43.552495 21511 nv12_batch.cc:280] TOP 2 result id: 285
I0705 11:39:43.552520 21511 nv12_batch.cc:280] TOP 3 result id: 287
I0705 11:39:43.552567 21511 nv12_batch.cc:280] TOP 4 result id: 283
I0705 11:39:43.552592 21511 nv12_batch.cc:278] Batch[2]:
I0705 11:39:43.552616 21511 nv12_batch.cc:280] TOP 0 result id: 340
I0705 11:39:43.552641 21511 nv12_batch.cc:280] TOP 1 result id: 83
I0705 11:39:43.552665 21511 nv12_batch.cc:280] TOP 2 result id: 41
I0705 11:39:43.552690 21511 nv12_batch.cc:280] TOP 3 result id: 912
I0705 11:39:43.552716 21511 nv12_batch.cc:280] TOP 4 result id: 292
I0705 11:39:43.552739 21511 nv12_batch.cc:278] Batch[3]:
I0705 11:39:43.552763 21511 nv12_batch.cc:280] TOP 0 result id: 282
I0705 11:39:43.552788 21511 nv12_batch.cc:280] TOP 1 result id: 281
I0705 11:39:43.552812 21511 nv12_batch.cc:280] TOP 2 result id: 285
I0705 11:39:43.552837 21511 nv12_batch.cc:280] TOP 3 result id: 287
I0705 11:39:43.552861 21511 nv12_batch.cc:280] TOP 4 result id: 283
I0705 11:39:43.553154 21511 nv12_batch.cc:300] Infer2 end
misc
03_misc 目录
├── run_lenet.sh
└── run_resnet50_feature.sh
run_lenet.sh:该脚本 主要 实现Y数据 输入 的lenet模型 推理 功能, 使用 的 时候,进入 03_misc 目录, 然后 直接 执行 sh run_lenet.sh即可,如下所示:
root@x5dvb-hynix8G:/userdata/horizon/x5/script/03_misc# sh run_lenet.sh
../aarch64/bin/run_lenet_gray --model_file=../../model/runtime/lenet_gray/lenet_28x28_gray.bin --data_file=../../data/misc_data/7.bin --image_height=28 --image_width=28 --top_k=5
I0000 00:00:00.000000 10979 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,18:02:12.605.436) [HorizonRT] The model builder version = 1.15.0
I0411 18:02:12.613317 10979 run_lenet_gray.cc:128] hbDNNInitializeFromFiles success
I0411 18:02:12.613404 10979 run_lenet_gray.cc:136] hbDNNGetModelNameList success
I0411 18:02:12.613440 10979 run_lenet_gray.cc:143] hbDNNGetModelHandle success
I0411 18:02:12.614181 10979 run_lenet_gray.cc:159] prepare y tensor success
I0411 18:02:12.614310 10979 run_lenet_gray.cc:172] prepare tensor success
I0411 18:02:12.614503 10979 run_lenet_gray.cc:182] infer success
I0411 18:02:12.615538 10979 run_lenet_gray.cc:187] task done
[W][DNN][hb_sys.cpp:108][Mem](2023-04-11,18:02:12.615.583) memory is noncachable, ignore flush operation
I0411 18:02:12.615624 10979 run_lenet_gray.cc:192] task post process finished
I0411 18:02:12.615667 10979 run_lenet_gray.cc:198] TOP 0 result id: 7
I0411 18:02:12.615698 10979 run_lenet_gray.cc:198] TOP 1 result id: 9
I0411 18:02:12.615727 10979 run_lenet_gray.cc:198] TOP 2 result id: 3
I0411 18:02:12.615754 10979 run_lenet_gray.cc:198] TOP 3 result id: 4
I0411 18:02:12.615782 10979 run_lenet_gray.cc:198] TOP 4 result id: 2
run_resnet50_feature.sh:该脚本 主要 实现feature数据 输入 的resnet50模型 推理 功能,示例 代码 对feature数据 做 了quantize和padding以 满足 模型 的 输入 条件,然后 输入 到 模型 进行infer。 使用 的 时候,进入 03_misc 目录, 然后 直接 执行 sh run_resnet50_feature.sh即可,如下所示:
root@x5dvb-hynix8G:/userdata/horizon/x5/script/03_misc# sh run_resnet50_feature.sh
../aarch64/bin/run_resnet_feature --model_file=./resnet50_64x56x56_featuremap_modified.bin --data_file=../../data/misc_data/np_0 --top_k=5
I0000 00:00:00.000000 11024 vlog_is_on.cc:197] RAW: Set VLOG level for "*" to 3
[BPU_PLAT]BPU Platform Version(1.3.3)!
[HBRT] set log level as 0. version = 3.15.18.0
[DNN] Runtime version = 1.17.2_(3.15.18 HBRT)
[A][DNN][packed_model.cpp:225][Model](2023-04-11,18:03:30.317.594) [HorizonRT] The model builder version = 1.15.1
I0411 18:03:30.523054 11024 run_resnet_feature.cc:160] hbDNNInitializeFromFiles success
I0411 18:03:30.523152 11024 run_resnet_feature.cc:168] hbDNNGetModelNameList success
I0411 18:03:30.523188 11024 run_resnet_feature.cc:175] hbDNNGetModelHandle success
I0411 18:03:30.529860 11024 run_resnet_feature.cc:346] input data size: 802816; input valid size: 200704; input aligned size: 229376
I0411 18:03:30.536860 11024 run_resnet_feature.cc:357] tensor padding featuremap success
I0411 18:03:30.536912 11024 run_resnet_feature.cc:190] prepare feature tensor success
I0411 18:03:30.537052 11024 run_resnet_feature.cc:200] prepare tensor success
I0411 18:03:30.537197 11024 run_resnet_feature.cc:210] infer success
I0411 18:03:30.541096 11024 run_resnet_feature.cc:215] task done
[W][DNN][hb_sys.cpp:108][Mem](2023-04-11,18:03:30.541.149) memory is noncachable, ignore flush operation
I0411 18:03:30.541409 11024 run_resnet_feature.cc:220] task post process finished
I0411 18:03:30.541453 11024 run_resnet_feature.cc:226] TOP 0 result id: 74
I0411 18:03:30.541483 11024 run_resnet_feature.cc:226] TOP 1 result id: 815
I0411 18:03:30.541512 11024 run_resnet_feature.cc:226] TOP 2 result id: 73
I0411 18:03:30.541538 11024 run_resnet_feature.cc:226] TOP 3 result id: 78
I0411 18:03:30.541565 11024 run_resnet_feature.cc:226] TOP 4 result id: 72
辅助工具和常用操作
日志
本示例日志 和 模型推理 DNN API日志 两
示例日志
示例
模型推理 DNN API日志
关于配置信息 一节
6.3.4.2. 公版模型性能精度测评说明
简介
本
示例
小
公版
发布物说明
示例代码包结构
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 # 软链接指向工具链SDK包中的模型,板端运行环境需要自行指定模型路径
│ ├── 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 # 软链接指向工具链SDK包中的模型,板端运行环境需要自行指定模型路径
├── README.md
├── script # 执行脚本
│ ├── aarch64 # 编译产生可执行文件及依赖库
│ ├── bev # bev模型示例
│ ├── classification # 分类模型示例
│ ├── config # 模型推理配置文件
│ ├── detection # 检测模型示例
│ ├── disparity_pred # 深度估计模型示例
│ ├── multitask # 多任务模型示例
│ ├── opticalflow # 光流模型示例
│ ├── segmentation # 分割模型示例
│ ├── tracking # 追踪模型示例
│ ├── traj_pred # 轨迹预测示例
│ ├── env.sh # 基础环境脚本
│ └── README.md
└── tools # 前处理及精度评测工具
code:该
目录 内 是 评测 程序 的 源码,用来 进行 模型 性能 和 精度 评测。 x5:该
目录 内 提供 了 已经 编译 好 的 应用程序,以及 各种 评测 脚本,用来 测试 多种 模型 在X5 BPU上 运行 的 性能 和 精度 等。 build_ptq_x5.sh:PTQ真机
程序 一键 编译 脚本。 build_qat_x5.sh:QAT真机
程序 一键 编译 脚本。 deps_gcc11.3:示例
代码 所 需要 的 依赖,主要 如下 所示:
appsdk gflags glog nlohmann opencv rapidjson
示例模型
示例
PTQ模型model_zoo请
在 horizon_model_convert_sample/01_common/model_zoo/runtime/ai_benchmark/ptq路径下 进行 获取。 QAT模型model_zoo请
在 horizon_model_convert_sample/01_common/model_zoo/runtime/ai_benchmark/qat路径下 进行 获取。
其中
小horizon_model_convert_sample 模型wget -c ftp://oeftp@sdk.d-robotics.cc/model_convert_sample/horizon_model_convert_sample.tar.xz --ftp-password=Oeftp~123$% 获取。
公共数据集
测评
请
| 数据 |
下载 |
下载 |
|---|---|---|
| ImageNet | https://www.image-net.org/download.php | 下载 |
| COCO | https://cocodataset.org/ | 下载 |
| VOC | http://host.robots.ox.ac.uk/pascal/VOC/ | 需要 |
| Cityscapes | https://github.com/mcordts/cityscapesScripts | 下载 |
| CIFAR-10 | http://www.cs.toronto.edu/~kriz/cifar.html | 下载 |
| FlyingChairs | https://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html | 下载 |
| KITTI3D | https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d | 下载 |
| CULane | https://xingangpan.github.io/projects/CULane.html | 下载 |
| Nuscenes | https://www.nuscenes.org/nuscenes | 下载 |
| Mot17 | https://opendatalab.com/MOT17 | 下载 |
| Carfusion | http://www.cs.cmu.edu/~ILIM/projects/IM/CarFusion/cvpr2018/index.html | 下载 |
| Argoverse 1 | https://www.argoverse.org/av1.html | 下载 |
| SceneFlow | https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html | 下载 |
环境构建
开发板准备
拿到
开发板 后,请 将 开发 版 镜像 更新 到 最新 版本,升级 方法 请 参考安装 系统 章节内容。 确保
本地 开发 机和 开发板 可以 远程 连接。
编译环境准备
编译arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc。请build_ptq_x5.sh 脚本,即可x5/ptq/script 目录aarch64 目录
备注:
需要build_ptq_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++
测评示例使用说明
评测script 和 tools 目录
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_mt_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 目录model_zoo/runtime 拷贝到 ptq/model 或 qat/model目录
scp -r ai_toolchain_package/Ai_Toolchain_Package-release-vX.X.X-OE-vX.X.X/ai_benchmark/x5/ptq root@192.168.1.10:/userdata/ptq/
scp -r model_zoo/runtime root@192.168.1.10:/userdata/ptq/model/
scp -r ai_toolchain_package/Ai_Toolchain_Package-release-vX.X.X-OE-vX.X.X/ai_benchmark/x5/qat root@192.168.1.10:/userdata/ptq/
scp -r model_zoo/runtime root@192.168.1.10:/userdata/qat/model/
json配置文件参数信息
本
注意: 下方
输入配置项(input_config)
| 参数 |
参数 |
涉及json文件 |
|---|---|---|
| input_type | 设置 |
fps.json、latency.json、accuracy.json |
| height | 设置 |
fps.json、latency.json、accuracy.json |
| width | 设置 |
fps.json、latency.json、accuracy.json |
| data_type | 设置 对应 如HB_DNN_IMG_TYPE_Y对应 HB_DNN_IMG_TYPE_NV12对应 HB_DNN_IMG_TYPE_NV12_SEPARATE对应 |
fps.json、latency.json、accuracy.json |
| image_list_file | 设置 |
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 | 设置 |
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 | 可视化 |
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 | 设置 |
fps.json、latency.json、accuracy.json |
| - core:设置 |
||
| - model_file:指定 |
后处理
配置 :项
| 参数 |
参数 |
涉及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 |
性能评测
性能
测评脚本使用说明
进入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表示后处理 耗时。
进入sh fps.sh 即可
I0419 02:35:00.044417 39094 output_plugin.cc:109] Throughput: 1129.39fps # 模型帧率
备注: 该
命令行参数说明
fps.sh 脚本
#!/bin/sh
source ../../base_config.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 ../../base_config.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配置文件
"output_config": {
"output_type": "image",
"enable_view_output": true, # 开启可视化
"view_output_dir": "./output_dir", # 可视化结果输出路径
"image_list_enable": true,
"in_order": false
}
执行latency.sh脚本
sh latency.sh
注意: bev模型
bev模型
"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
}
不同
分类
2d检测

3d检测

分割

关键点

车道
线

光流

雷达

雷达
多任务


bev








轨迹
预测

深度
估计


注意: 轨迹
精度评测
模型
数据
预处理。 生成lst文件。
数据
挂载。 模型
推理。 精度
计算。
数据预处理
对于PTQ模型:数据hb_eval_preprocess 工具,对hb_eval_preprocess --help 可
小
关于
hb_eval_preprocess工具命令行 参数,可 键入 hb_eval_preprocess -h, 或查看 PTQ量化 原理 及 步骤 说明 的 hb_eval_preprocess工具 一节 内容。
PTQ模型
下面
PTQ模型
VOC数据集:该数据 集 主要 用于ssd_mobilenetv1模型 的 评测, 其 目录 结构 如下,示例 中 主要 用到 Main文件下 的val.txt文件, JPEGImages中的 源 图片 和 Annotations中的 标注 数据:
.
└── VOCdevkit # 根目录
└── VOC2012 # 不同年份的数据集,这里只下载了2012的,还有2007等其它年份的
├── Annotations # 存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等
├── ImageSets # 该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本
│ ├── Action
│ ├── Layout
│ ├── Main
│ └── Segmentation
├── JPEGImages # 存放源图片
├── SegmentationClass # 存放的是图片,语义分割相关
└── SegmentationObject # 存放的是图片,实例分割相关
对
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等 检测 模型 的 评测, 其 目录 如下,示例 中 主要 用到 annotations文件夹下 的instances_val2017.json标注 文件 和 images中的 图片:
.
├── annotations # 存放标注数据
└── images # 存放源图片
对
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等 分类 模型 的 评测, 示例 中 主要 用到 了 标注 文件val.txt 和 val目录中 的 源 图片:
.
├── val.txt
└── val
对
hb_eval_preprocess -m model_name -i imagenet/val -o ./pre_model_name
Cityscapes数据集:该数据 集 用于deeplabv3plus_efficientnetb0、deeplabv3plus_efficientnetm1、deeplabv3plus_efficientnetm2和fastscnn_efficientnetb0等 分割 模型 的 评测。 示例 中 主要 用到 了 ./gtFine/val中的 标注 文件 和 ./leftImg8bit/val中的 源 图片。
.
├── gtFine
│ └── val
│ ├── frankfurt
│ ├── lindau
│ └── munster
└── leftImg8bit
└── val
├── frankfurt
├── lindau
└── munster
对
hb_eval_preprocess -m model_name -i cityscapes/leftImg8bit/val -o ./pre_model_name
QAT模型
QAT模型ai_benchmark/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的 评测。本 数据 集 您 可以 于 FlyingChairs数据集官网下载地址 <https://lmb.informatik.uni-freiburg.de/resources/datasets/FlyingChairs.en.html>_ 下载,示例中 主要 用到 了 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表示 验证 集。
对
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的 评测。本 数据 集 您 可以 于 Kitti3D数据集官网下载地址 <https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d>_ 下载。
.
├── 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
对
python3 pointpillars_process.py --data-path=./kitti3d_origin --save-path=./pre_kitti3d --height=1 --width=150000
Culane:该数据 集 主要 用于QAT检测 模型ganet_mixvargenet_culane的 评测。本 数据 集 您 可以 于 Culane数据集官网下载地址 <https://xingangpan.github.io/projects/CULane.html>_ 下载。
.
├── 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 # 训练,验证,测试列表
对
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的 评测。本 数据 集 您 可以 于 Nuscenes数据集官网下载地址 <https://www.nuscenes.org/nuscenes#download>_ 下载。
.
├── 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多
.
├── Nuscenes
├── can_bus
├── lidarseg
├── maps
├── nuscenes
│ └── meta
│ ├── maps
│ ├── v1.0-mini
│ └── v1.0-trainval
├── samples
├── sweeps
├── v1.0-mini
└── v1.0-trainval
请
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的 评测。本 数据 集 您 可以 于 Mot17数据集官网下载地址 <https://opendatalab.com/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
对
python3 motr_process.py --image-path=./valdata/images/train --save-path=./processed_motr
Carfusion:该数据 集 用于QAT检测 模型keypoint_efficientnetb0_carfusion的 评测。本 数据 集 您 可以 于 Carfusion数据集官网下载地址 <http://www.cs.cmu.edu/~ILIM/projects/IM/CarFusion/cvpr2018/index.html>_ 下载。
.
├── carfusion # 根目录
├── train
└── test
对
# 首先生成评测需要的数据(如您第一次使用本数据集,必须使用下方脚本生成)
python3 gen_carfusion_data.py --src-data-path=carfusion --out-dir=cropped_data --num-workers 2
执行
.
├── cropped_data # 根目录
├── test
└── simple_anno
保证data-root指定
python3 keypoints_preprocess.py --data-root=./ --label-path=cropped_data/simple_anno/keypoints_test.json --save-path=./processed_carfusion
Argoverse1:该数据 集 用于QAT检测 模型densetnt_vectornet_argoverse1的 评测。本 数据 集 您 可以 于 Argoverse1数据集官网下载地址 <https://www.argoverse.org/av1.html>_ 下载。
.
├── carfusion # 根目录
├── train
└── test
对
# 首先生成评测需要的数据(如您第一次使用本数据集,必须使用下方脚本生成)
python3 gen_carfusion_data.py --src-data-path=carfusion --out-dir=cropped_data --num-workers 2
执行
.
├── arogverse-1 # 根目录
├── map_files
└── val
densetnt_process.py除了--src-path 和 --dst-path 两个
python3 densetnt_process.py --src-path=arogverse-1 --dst-path=processed_arogverse1
SceneFlow:该数据 集 用于QAT深度 估计 模型stereonetplus_mixvargenet_sceneflow的 评测。本 数据 集 您 可以 于 SceneFlow数据集官网下载地址 <https://lmb.informatik.uni-freiburg.de/resources/datasets/SceneFlowDatasets.en.html>_ 下载。
.
├── SceneFlow # 根目录
├── FlyingThings3D
│ ├── disparity
│ ├── frames_finalpass
└── SceneFlow_finalpass_test.txt
对
# 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
生成lst文件
示例
1、根据 workflow_accurary.json 中image_list_file 参数值,去lst 文件;
2、根据 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
| | |── ...
与
注意: 除Densetnt_vectornet_argoverse1、Bev、Motr_efficientnetb3_mot17和Stereonetplus_mixvargenet_sceneflow模型外,其余
find ../../../data/coco/pre_centernet_resnet101 -name "*bin*" > ../../../data/coco/pre_centernet_resnet101.lst
注意: -name 后
这样../../../data/ 或 ../../../data/coco/pre_centernet_resnet101/ ,可以workflow_accuracy.json 默认lst 文件workflow_accuracy.json 读取lst 中
argoverse1:
sh generate_acc_lst.sh
这样../../../data/argoverse1/densetnt/ ,可以workflow_accuracy.json 默认
对于Densetnt_vectornet_argoverse1、Bev、Motr_efficientnetb3_mot17和Stereonetplus_mixvargenet_sceneflow模型,lst文件
Densetnt:
sh generate_acc_lst.sh
这样../../../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,除了
# detr3d_efficientnetb3_nuscenes:
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
请reference_points 用于workflow_accuracy.json 配置gen_file_list.sh 用于
sh gen_file_list.sh
这样../../../data/nuscenes_bev/ ,可以workflow_accuracy.json 默认lst 文件workflow_accuracy.json 读取lst 中
Motr:
sh generate_acc_lst.sh
这样../../../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
这样../../../data/mot17/motr/ ,可以workflow_accuracy.json 默认lst 文件workflow_accuracy.json 读取lst 中
数据挂载
由于
开发
编辑 /etc/exports, 增加
一行: /nfs *(insecure,rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)。/nfs表示本 机 挂载 路径,可 替换 为 用户 指定 目录 执行命令
exportfs -a -r,使/etc/exports 生效。
开发板
创建
需要 挂载 的 目录: mkdir -p /mnt。mount -t nfs {PC端IP}:/nfs /mnt -o nolock。
完成
模型推理
挂载centernet_resnet101/ 目录
/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 文件,该
精度计算
注意:
精度开发机 模型
PTQ模型
PTQ模型
cls_eval.py用于
计算 分类 模型 的 精度。 coco_det_eval.py用于
计算 使用COCO数据 集 评测 的 检测 模型 的 精度。 parsing_eval.py用于
计算 使用Cityscapes数据 集 评测 的 分割 模型 的 精度。 voc_det_eval.py用于
计算 使用VOC数据 集 评测 的 检测 模型 的 精度。
以下
分类
模型
使用CIFAR-10数据
#!/bin/sh
python3 cls_eval.py --log_file=eval.log --gt_file=val.txt
备注:
log_file:分类模型 的 预测 结果 文件。 gt_file:CIFAR-10和ImageNet数据集 的 标注 文件。 检测
模型
使用COCO数据
#!/bin/sh
python3 coco_det_eval.py --eval_result_path=eval.log --annotation_path=instances_val2017.json
备注:
eval_result_path:检测模型 的 预测 结果 文件。 annotation_path:COCO数据集 的 标注 文件。
使用VOC数据
#!/bin/sh
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数据
#!/bin/sh
python3 parsing_eval.py --log_file=eval.log --gt_path=cityscapes/gtFine/val
备注:
log_file:分割模型 的 预测 结果 文件。 gt_path:Cityscapes数据集 的 标注 文件。
QAT模型
QAT模型
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的 精度。
以下
Bev模型
使用nuscenes数据
#!/bin/sh
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数据
#!/bin/sh
python3 cls_eval.py --log_file=eval.log --gt_file=val.txt
备注:
log_file:分类模型 的 预测 结果 文件。 gt_file:CIFAR-10和ImageNet数据集 的 标注 文件。 检测
模型 1.使用COCO数据
集 的 检测 模型 精度 计算 方式 示例 如下:
#!/bin/sh
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模型结果 评测。
#!/bin/sh
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原始数据集。
#!/bin/sh
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数据
集 的 检测 模型 精度 计算 方式 示例 如下:
#!/bin/sh
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数据
集 的 检测 模型 精度 计算 方式 如下:
#!/bin/sh
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数据
集 的 检测 模型 精度 计算 方式 如下:
#!/bin/sh
python3 ganet_eval.py --eval_path=eval.log --image_path=./culane
备注:
eval_result_path:检测模型 的 预测 结果 文件。 image_path:culane数据集。 5.使用Nuscenes数据
集 的 检测 模型 精度 计算 方式 如下:
#!/bin/sh
python3 fcos3d_eval.py --eval_result_path=eval.log --image_path=./Nuscenes
备注:
eval_result_path:检测模型 的 预测 结果 文件。 image_path:nuscenes数据集。
#!/bin/sh
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数据
集 的 检测 模型 精度 计算 方式 如下:
#!/bin/sh
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数据
#!/bin/sh
python3 parsing_eval.py --log_file=eval.log --gt_path=cityscapes/gtFine/val
备注:
log_file:分割模型 的 预测 结果 文件。 gt_path:Cityscapes数据集 的 标注 文件。 光流
模型
使用FlyingChairs数据
#!/bin/sh
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数据
#!/bin/sh
python3 motr_eval.py --eval_result_path=eval_log --gt_val_path=valdata/gt_val
备注:
eval_result_path:追踪模型 的 预测 结果 文件夹。 gt_val_path:mot17数据集 的 标注 文件。 多
任务模型
使用nuscenes数据
#!/bin/sh
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数据
#!/bin/sh
python3 densetnt_eval.py --eval_result_path=eval.log --meta_path=argoverse1/meta
备注:
eval_result_path:轨迹预测 的 预测 结果 文件。 meta_path:argoverse1数据集 生成 的 的 标注 文件,使用 预处理 脚本 后,生成 在 原 数据 集 目录meta中。 深度
估计 模型
使用Sceneflow数据
#!/bin/sh
python3 stereonet_eval.py --log_file=eval.log --gt_files=val_gt_infos.pkl
备注:
log_file:深度估计 模型 的 预测 结果 文件。 gt_files:对Sceneflow数据集 进行 预处理 生成 的gt文件。
模型集成
前处理
您CPU 上,以centerpoint_pointpillar_nuscenes为例:
1.增加
2.增加
前处理文件及头文件添加
前qat_centerpoint_preprocess_method.cc 放置qat_centerpoint_preprocess_method.h 放置
|── ai_benchmark
| |── code # 示例源码
| | |── include
| | | |── method # 在此文件夹中添加头文件
| | | | |── qat_centerpoint_preprocess_method.h
| | | | |── ...
| | |── src
| | | |── method # 在此文件夹中添加前处理.cc文件
| | | | |── qat_centerpoint_preprocess_method.cc
| | | | |── ...
模型前处理配置文件添加
|── ai_benchmark
| |── x5/qat/script # 示例脚本文件夹
| | |── config
| | | |── preprocess
| | | | |── centerpoint_preprocess_5dim.json # 前处理配置脚本
前处理单帧延时评测
执行 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表示后处理 耗时。
后处理
后处理
增加
后处理 文件 ptq_centernet_post_process_method.cc,以及头文件 ptq_centernet_post_process_method.h。增加
模型 运行 脚本 及 配置文件。
后处理文件及头文件添加
后处理InitFromJsonString 函数,以及 PostProcess 函数
InitFromJsonString 函数PostProcess 函数
后处理.cc文件ai_benchmark/code/src/method/ 路径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
| |── 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 # 单帧延时配置文件
辅助工具和常用操作
日志系统使用说明
日志示例日志 和 模型推理API DNN日志 两
示例日志
日志
等级。示例 日志 主要 采用glog中 的vlog,主要 分为 四个 自定义 等级:
0(SYSTEM),该等级 主要 用来 输出 报错 信息; 1(REPORT),该等级 在 示例 代码 中 主要 用来 输出 性能 数据; 2(DETAIL),该等级 在 示例 代码 中 主要 用来 输出 系统 当前 状态 信息; 3(DEBUG),该等级 在 示例 代码 中 主要 用来 输出 调试信息。 日志 等级 设置 规则:假设 设置 了 级别 为 P,如果发生 了 一个 级别 Q比P低, 则可以 启动,否则 屏蔽掉;默认DEBUG>DETAIL>REPORT>SYSTEM。
日志
等级 设置。通过 log_level参数来 设置 日志 等级,在 运行 示例 的 时候,指定 log_level参数来 设置 等级, 比如 指定 log_level=0,即输出SYSTEM日志;如果 指定 log_level=3, 则输出DEBUG、DETAIL、REPORT和SYSTEM日志。
模型推理API DNN日志
关于配置信息 一节
算子耗时说明
对模型HB_DNN_PROFILER_LOG_PATH 环境变量
备注:
export HB_DNN_PROFILER_LOG_PATH=${path}:表示OP节点dump的
示例
说明
以下export HB_DNN_PROFILER_LOG_PATH=./,则
{
"perf_result": {
"FPS": 677.6192525182025,
"average_latency": 11.506142616271973
},
"running_condition": {
"core_id": 0,
"frame_count": 200,
"model_name": "mobilenetv1_224x224_nv12",
"run_time": 295.151,
"thread_num": 1
}
}
***
{
"chip_latency": {
"BPU_inference_time_cost": {
"avg_time": 11.09122,
"max_time": 11.54,
"min_time": 3.439
},
"CPU_inference_time_cost": {
"avg_time": 0.18836999999999998,
"max_time": 0.4630000000000001,
"min_time": 0.127
}
},
"model_latency": {
"BPU_MOBILENET_subgraph_0": {
"avg_time": 11.09122,
"max_time": 11.54,
"min_time": 3.439
},
"Dequantize_fc7_1_HzDequantize": {
"avg_time": 0.07884999999999999,
"max_time": 0.158,
"min_time": 0.068
},
"MOBILENET_subgraph_0_output_layout_convert": {
"avg_time": 0.018765,
"max_time": 0.08,
"min_time": 0.01
},
"Preprocess": {
"avg_time": 0.0065,
"max_time": 0.058,
"min_time": 0.003
},
"Softmax_prob": {
"avg_time": 0.084255,
"max_time": 0.167,
"min_time": 0.046
}
},
"task_latency": {
"TaskPendingTime": {
"avg_time": 0.029375,
"max_time": 0.059,
"min_time": 0.009
},
"TaskRunningTime": {
"avg_time": 11.40324,
"max_time": 11.801,
"min_time": 4.008
}
}
}
以上model_latency 和 task_latency。其中model_latency中
备注:
程序
dump工具
本export HB_DNN_DUMP_PATH=${path} 这个
6.3.4.3. 模型上板分析工具说明
概述
本***.bin 模型
hrt_model_exec 工具使用说明
hrt_model_exec 工具,可以
目前
| 编号 | 子 |
说明 |
|---|---|---|
| 1 | model_info |
获取 |
| 2 | infer |
执行 |
| 3 | perf |
执行 |
小
工具-v 或者 --version 命令,查看dnn 预测
例如: hrt_model_exec -v 或 hrt_model_exec –version
输入参数描述
在hrt_model_exec 、 hrt_model_exec -h 或 hrt_model_exec --help 获取

| 编号 | 参数 | 类型 | 说明 |
|---|---|---|---|
| 1 | model_file |
string | 模型 |
| 2 | model_name |
string | 指定 |
| 3 | core_id |
int | 指定0。 |
| 4 | input_file |
string | 模型bin / JPG / JPEG / jpg / jpeg / png / PNG中bin / txt 中,,如: xxx.jpg,input.txt。当 |
| 5 | roi_infer |
bool | 使能resizer模型true, 并且input_file 和 roi 参数。 |
| 6 | roi |
string | 指定 |
| 7 | frame_count |
int | 执行 |
| 8 | dump_intermediate |
string | dump模型 - dump_intermediate=0 时,默认dump功能- dump_intermediate=1 时,模型bin 方式BPU 节点aligned 数据。- dump_intermediate=2 时,模型bin和 txt 两种BPU 节点aligned 数据。 - dump_intermediate=3 时,模型bin 和 txt 两种BPU 节点valid 数据。 |
| 9 | enable_dump |
bool | 使能dump模型false。 |
| 10 | dump_precision |
int | 控制txt格式9。 |
| 11 | hybrid_dequantize_process |
bool | 对enable_dump=true 时padding 操作。 |
| 12 | dump_format |
string | dump模型 |
| 13 | dump_txt_axis |
int | 控制txt格式 |
| 14 | enable_cls_post_process |
bool | 使能false。子infer 时 |
| 15 | perf_time |
int | 执行 |
| 16 | thread_num |
int | 线程 |
| 17 | profile_path |
string | 统计--profile_path="." 即可,代表 |
| 18 | dump_path |
string | 工具dump输出 |
使用说明
本hrt_model_exec 工具
model_info
概述
该model_file 一起hbDNNTensorProperties 和stage ;模型
小
不model_name ,则model_name ,则
示例
说明
单
模型
hrt_model_exec model_info --model_file=xxx.bin
多
模型(输出 所有 模型 信息)
hrt_model_exec model_info --model_file=xxx.bin,xxx.bin
多
模型–pack模型(输出 指定 模型 信息)
hrt_model_exec model_info --model_file=xxx.bin --model_name=xx

输入参数补充说明
重复
输入
若yyy.bin:
hrt_model_exec model_info --model_file=xxx.bin --model_file=yyy.bin
若yyy.bin,参数值xxx.bin:
hrt_model_exec model_info --model_file=xxx.bin yyy.bin
infer
概述
该input_file 一起
小
程序
示例
说明
单
模型
hrt_model_exec infer --model_file=xxx.bin --input_file=xxx.jpg
多
模型
hrt_model_exec infer --model_file=xxx.bin,xxx.bin --model_name=xx --input_file=xxx.jpg
resizer模型
模型ddr, resizer, resizer]。
推理
hrt_model_exec infer --roi_infer=true --model_file=xxx.bin --input_file="xx0.bin,xx1.jpg,xx2.jpg,xx3.bin,xx4.jpg,xx5.jpg" --roi="2,4,123,125;6,8,111,113;27,46,143,195;16,28,131,183"
注意: 多

可
选 参数
| 参数 | 说明 |
|---|---|
core_id |
指定0,X5上0 或 1。 |
roi_infer |
使能resizer模型true,默认false。 |
roi |
roi_infer 为 true 时roi 区域 |
frame_count |
设置 infer 运行enable_dump 并用,验证1。 |
dump_intermediate |
dump模型0,不dump数据。 1:输出bin;2:输出bin 和 txt,其中BPU节点3:输出bin 和 txt,其中BPU节点 |
enable_dump |
dump模型false。 |
dump_precision |
控制txt格式9。 |
hybrid_dequantize_process |
控制txt格式 |
dump_format |
dump模型bin 或 txt,默认bin。 |
dump_txt_axis |
dump模型txt格式-1,一行 |
enable_cls_post_process |
使能false。 |
dump_path |
指定dump输出 |
多输入模型说明
工具 infer 推理model_info 进行
示例
说明
hrt_model_exec infer --model_file=xxx.bin --input_file=xxx.jpg,input.txt
输入参数补充说明
input_file
图片bin / JPG / JPEG / jpg / jpeg / png 中bin / txt 中,,例如: xxx.jpg,input.txt。
enable_cls_post_process
使能infer 时true 时

roi_infer
若infer 和 perf 功能roi_infer 为true,并且input_file 和 roi 参数。
如:模型ddr, resizer, resizer],则
// infer
hrt_model_exec infer --model_file=xxx.bin --input_file="xx0.bin,xx1.jpg,xx2.jpg,xx3.bin,xx4.jpg,xx5.jpg" --roi="2,4,123,125;6,8,111,113;27,46,143,195;16,28,131,183"
// perf
hrt_model_exec perf --model_file=xxx.bin --input_file="xx0.bin,xx1.jpg,xx2.jpg,xx3.bin,xx4.jpg,xx5.jpg" --roi="2,4,123,125;6,8,111,113;27,46,143,195;16,28,131,183"
每个 roi 输入
dump_intermediate
dump模型dump_intermediate=0 时,默认dump功能dump_intermediate=1 时,模型bin 方式BPU 节点aligned 数据;
dump_intermediate=2 时,模型bin 和 txt 两种BPU 节点aligned 数据;
dump_intermediate=3 时,模型bin 和 txt 两种BPU 节点valid 数据。
如: 模型pyramid, ddr],将bin 文件,其中 BPU 节点aligned 类型
hrt_model_exec infer --model_file=xxx.bin --input_file="xx0.jpg,xx1.bin" --dump_intermediate=1
dump_intermediate 参数infer 和 perf 两种
hybrid_dequantize_process
控制txt格式hybrid_dequantize_process 参数enable_dump=true 时enable_dump=true 时,若hybrid_dequantize_process=true ,反txt 文件,其中valid 数据,支持dump_txt_axis 和 dump_precision;
若hybrid_dequantize_process=false ,直接aligned 数据,不valid 数据, 则
// 输出float类型数据
hrt_model_exec infer --model_file=xxx.bin --input_file="xx.bin" --enable_dump=true --hybrid_dequantize_process=true
hybrid_dequantize_process 参数
perf
概述
该
小
程序
示例
说明
单
模型
hrt_model_exec perf --model_file=xxx.bin
多
模型
hrt_model_exec perf --model_file=xxx.bin,xxx.bin --model_name=xx
resizer模型
模型ddr, resizer, resizer]。
推理
hrt_model_exec perf --roi_infer=true --model_file=xxx.bin --input_file="xx0.bin,xx1.jpg,xx2.jpg,xx3.bin,xx4.jpg,xx5.jpg" --roi="2,4,123,125;6,8,111,113;27,46,143,195;16,28,131,183"
注意: 多

可
选 参数
| 参数 | 说明 |
|---|---|
core_id |
指定0,X5上0 或 1。 |
input_file |
模型 |
roi_infer |
使能resizer模型true,默认false。 |
roi |
roi_infer 为 true 时roi 区域 |
frame_count |
设置 perf 运行200。 |
perf_time |
设置 perf 运行0。 |
thread_num |
设置1, 设置 |
profile_path |
统计 |
多线程Latency数据说明
多线程frame_count 帧perf 过程
hrut_somstatus -n 10000 –d 1
X3 输出
=====================1=====================
temperature-->
CPU : 37.5 (C)
cpu frequency-->
min cur max
cpu0: 240000 1200000 1200000
cpu1: 240000 1200000 1200000
cpu2: 240000 1200000 1200000
cpu3: 240000 1200000 1200000
bpu status information---->
min cur max ratio
bpu0: 400000000 1000000000 1000000000 0
bpu1: 400000000 1000000000 1000000000 0
X5 输出
=====================1=====================
temperature-->
DDR : 57.0 (C)
cat: /sys/class/hwmon/hwmon0/temp2_input: Connection timed out
BPU : 0.0 (C)
CPU : 56.6 (C)
cpu frequency-->
min(M) cur(M) max(M)
cpu0: 300 1500 1500
cpu1: 300 1500 1500
cpu2: 300 1500 1500
cpu3: 300 1500 1500
cpu4: 300 1500 1500
cpu5: 300 1500 1500
cpu6: 300 1500 1500
cpu7: 300 1500 1500
bpu status information---->
min(M) cur(M) max(M) ratio
bpu0: 500 1000 1000 0
ddr frequency information---->
min(M) cur(M) max(M)
ddr: 266 3200 3200
备注:
在 perf 模式
输入参数补充说明
profile_path
profile日志export HB_DNN_PROFILER_LOG_PATH=${path} 查看--profile_path="." 即可,代表
thread_num
线程X5只有一个BPU核,core_id 只能设置为 0 或 1
// 多线程FPS
hrt_model_exec perf --model_file xxx.bin --thread_num 8 --core_id 0
// Latency
hrt_model_exec perf --model_file xxx.bin --thread_num 1 --core_id 1
常见问题
Latency、FPS数据是如何统计的?
Latency是
// Load model and prepare input and output tensor
...
// Loop run inference and get latency
{
int32_t const loop_num{1000};
start = std::chrono::steady_clock::now();
for(int32_t i = 0; i < loop_num; i++){
hbDNNInferCtrlParam infer_ctrl_param;
HB_DNN_INITIALIZE_INFER_CTRL_PARAM(&infer_ctrl_param);
hbDNNInfer(&task_handle,
&output,
input_tensors.data(),
dnn_handle,
&infer_ctrl_param);
// wait task done
hbDNNWaitTaskDone(task_handle, 0);
// release task handle
hbDNNReleaseTask(task_handle);
task_handle = nullptr;
}
end = std::chrono::steady_clock::now();
latency = (end - start) / loop_num;
}
// release tensor and model
FPS是
通过Latency推算FPS与工具测出的FPS为什么不一致?
Latency与FPS的1 ,则
工具如何评测自定义算子模型?
参考horizon_runtime_sample/code/02_advanced_samples/custom_identity示例
export HB_DNN_PLUGIN_PATH=/userdata/plugins/
hrt_bin_dump 工具使用说明
hrt_bin_dump 是
输入参数描述
| 编号 | 参数 | 类型 | 描述 | 说明 |
|---|---|---|---|---|
| 1 | model_file |
string | 模型 |
指定 |
| 2 | input_file |
string | 输入 |
模型hbDNNDataType 所有height * width * 3; TENSOR类型--input_file=kite.bin,input.txt。 |
| 3 | dump_path |
string | 工具 |
工具 |
使用说明
工具hrt_bin_dump 获取

小-v 或者 --version 命令,查看dnn 预测
例如: hrt_bin_dump -v 或 hrt_bin_dump –version
示例说明
以mobilenetv1的
./hrt_bin_dump --model_file=./mobilenetv1.bin --dump_path=./outputs --input_file=./input.bin
运行日志

在
