OE开发包示例介绍

算法工具链覆盖了模型训练(浮点训练和量化训练,可选)、转换、性能/精度验证、部署和推理等关键步骤。为了方便您快速体验和学习,OE开发包中提供了丰富、全面的示例。为了方便了解和使用这些示例,本文将对这些示例进行详细介绍。

首先,在获取OE开发包后,解压后的示例包目录结构如下所示:

samples  # 示例包
├── ai_toolchain 
|   ├── horizon_model_convert_sample  # 浮点模型转定点模型的转换示例
|   ├── horizon_model_train_sample    # 浮点模型训练框架示例
|   └── model_zoo                     # 模型库,用于放置工具链示例模型编译的源模型和runtime模型
├── model_zoo -> ai_toolchain/model_zoo 
└── ucp_tutorial                      # 统一计算平台UCP的示例包,提供UCP必要的依赖以及相关示例 

samples目录中提供了模型训练示例、浮点模型转定点模型示例以及统一计算平台UCP的相关示例。如下为工具链各阶段使用的一般流程和示例的分布:

oe_package_sample

在上图工具链的使用流程中,这些示例对应着不同的使用阶段:

  • 模型转换示例包含了模型PTQ转换阶段的模型检查、校准数据处理、模型量化编译、单张图片推理和精度评估等过程。
  • 模型训练示例包含了浮点模型训练(可选)和QAT量化训练(可选)阶段的数据集打包脚本、模型config文件、训练脚本以及其它工具脚本,当应用模型精度调优手段后仍未达到预期精度时,可以尝试QAT量化训练策略。
  • UCP板端部署示例,包含视觉处理、模型推理、高性能算子库、自定义算子及目标检测全流程等示例,模型推理示例中提供了模型部署阶段的编译脚本、运行脚本和源代码。

模型转换示例(horizon_model_convert_sample)

工具链在samples/ai_toolchain/horizon_model_convert_sample文件夹下提供了模型转换示例,示例包目录结构如下所示:

├── 01_common          # 校准数据、数据加载、预处理代码
├── 03_classification  # 分类模型转换示例
├── 04_detection       # 检测模型转换示例
├── 07_segmentation    # 分割模型转换示例

OE包内不仅提供了PTQ模型转换示例,另外还包含了模型检查、校准数据预处理、转换编译、推理等一键运行脚本。

horizon_model_convert_sample/03_classification目录下的03_resnet50为例,介绍相关脚本的作用:

├── 00_init.sh            # 获取示例对应的校准数据集和原始模型脚本
├── 01_check.sh           # 模型检查脚本
├── 02_preprocess.sh      # 校准数据预处理脚本
├── 03_build.sh           # 模型量化编译脚本
├── 04_inference.sh       # 单张图片推理脚本
├── 05_evaluate.sh        # 精度评测脚本
├── resnet50_config.yaml  # 模型编译yaml配置文件
├── postprocess.py        # 模型后处理代码
├── preprocess.py         # 数据预处理代码
└── README.cn.md

PTQ模型转换示例的使用教程请参考PTQ模型转换示例章节的介绍。

模型训练示例(horizon_model_train_sample)

工具链在samples/ai_toolchain/horizon_model_train_sample目录下提供了模型训练示例,示例包结构如下所示:

├── plugin_basic        # horizon_plugin_pytorch基础示例
└── scripts               
    ├── configs         # 模型配置文件
    │   ├── bev
    │   ├── classification
    │   ├── detection
    │   ├── disparity_pred
    │   ├── keypoint
    │   ├── lane_pred
    │   ├── lidar_bevfusion
    │   ├── lidar_multi_task
    │   ├── map
    │   ├── occ
    │   ├── segmentation
    │   ├── track_pred
    │   └── traj_pred
    ├── examples        # 去除config机制的示例
    └── tools           # 执行脚本
        ├── calops.py
        ├── compile_perf_hbir.py
        ├── create_data.py
        ├── dataset_converters
        ├── datasets
        ├── export_hbir.py
        ├── export_onnx.py
        ├── gen_camera_param_nusc.py
        ├── homography_generator.py
        ├── infer_hbir.py
        ├── model_checker.py
        ├── predict.py
        ├── quant_analysis.py
        ├── reference_points_generator.py
        ├── gen_reference_points_nusc.py
        ├── train.py
        └── validation_hbir.py

通常只需要使用以下命令就可以实现模型的训练:

python3 tools/${TOOLS} --config configs/${CONFIGS}
  • ${CONFIGS} 需要配置为configs文件夹中模型训练对应的 config 文件路径,它定义了模型结构、数据集加载、以及整套的训练流程,示例中提供了包括分类、检测、分割和光流估计任务等模型。

  • tools文件夹提供了包含数据集处理、模型训练、转换编译、计算量统计等执行脚本,相关脚本的功能如下:

    • calops.py:网络模型计算量统计工具。

    • compile_perf_hbir.py:编译和perf工具。

    • create_data.py:数据集预处理工具,用于预处理Kitti3D雷达数据集。

    • dataset_converters:文件夹下提供了不同数据集格式转换脚本。

    • datasets:文件夹下提供了数据集打包和数据可视化脚本。

    • export_hbir.py:HBIR模型导出工具。

    • export_onnx.py:ONNX模型导出工具,导出的ONNX模型只可用于可视化,不支持推理。

    • gen_camera_param_nusc.py:从nuscenes中获取相机内外参的脚本。

    • homography_generator.py:计算ego到图像的转换矩阵的脚本。

    • reference_points_generator.py:从单应性矩阵计算模型输入参考点的脚本。

    • gen_reference_points_nusc.py:从nuscenes中获取模型输入参考点的脚本。

    • infer_hbir.py:单图预测工具。

    • model_checker.py:模型检查工具。

    • predict.py:预测工具。

    • quant_analysis.py:精度debug工具。

    • train.py:模型训练脚本,支持浮点模型训练、量化训练功能。

    • validation_hbir.py:精度验证工具,提供上板完全对齐的结果。

模型训练示例的使用教程请参考Horizon Torch Samples章节的介绍。

统一计算平台示例(ucp_tutorial)

工具链在samples/ai_toolchain/ucp_tutorial目录下提供了统一计算平台UCP的示例源代码和运行脚本,示例包结构如下所示:

ucp_tutorial
├── all-round                     # 目标检测全流程示例
├── custom_operator               # 自定义算子示例
|   ├── dsp_sample                # DSP示例
|   └── gpu_sample                # 基于OpenCL接口调用板端GPU的开发示例
├── deps_aarch64                  # AArch64 Linux 公共依赖目录   
├── deps_qnx                      # AArch64 QNX 公共依赖目录    
├── deps_x86                      # X86仿真 公共依赖目录   
├── dnn                           # DNN示例
|   ├── ai_benchmark              # AI Benchmark示例
|   └── basic_samples             # 模型推理基础示例
├── hpl                           # HPL示例
|   ├── code                      # 示例源码目录
|   └── hpl_samples               # HPL示例最小可执行环境
├── vp                            # VP示例
|   ├── code                      # 示例源码目录
|   └── vp_samples                # VP示例最小可执行环境
└── tools                         # 工具
  • all-round:目标检测全流程示例,详细介绍及使用教程请参考 目标检测全流程示例 章节的介绍。

  • custom_operator:自定义算子示例,包含DSP示例和基于OpenCL接口调用板端GPU的开发示例,详细介绍及使用教程请参考 UCP-自定义算子 章节的介绍。

  • deps_aarch64:AArch64公共依赖目录,包含UCP依赖库及头文件等内容。

  • deps_x86:X86仿真公共依赖目录。

  • dnn:DNN示例,包括:

    • ai_benchmark,提供了嵌入式应用开发常见模型的性能和精度评测示例,详细介绍及使用教程请参考 AI Benchmark使用说明 章节的介绍。

    • basic_samples,提供了模型推理相关由浅及深的使用示例,旨在帮助您熟悉和学习模型推理相关的接口以及各种进阶功能,详细介绍及使用教程请参考 基础示例包使用说明 章节的介绍。

  • hpl:HPL示例,包括示例源码及最小可执行环境,详细介绍及使用教程请参考 高性能算子库-示例 章节的介绍。

  • vp:VP示例,包括示例源码及最小可执行环境,详细介绍及使用教程请参考 视觉处理开发-示例 章节的介绍。

  • tools:统一计算平台UCP提供的工具。