地平线 旭日X3 PI (三) 模型转换

文章目录

    • 更新时间
    • 准备工作
    • 转换流程
    • 模型转换结果记录
    • 参考文档

  • 开发机环境配置
  • 去年在x3 sdb上yolov3 darknet 自训练模型转换流程,供参考。
  • 转换后的模型部署到板上推理流程

更新时间

最近更新: 2022-07
开发板:地平线 旭日 X3 PI

准备工作

  • 官方的docker镜像,上篇文章已经介绍了开发机的配置,点击此链接查看。
  • nanodet onnx模型 下载地址(或者其他onnx模型)
  • Netron 模型结构查看软件

转换流程

① 启动官方docker

#在horizon_xj3_open_explorer_v2.2.3_20220617主目录下使用脚本进入docker
sudo sh run_docker.sh ./data
#启动后主目录挂载到docker

② 进入detection目录

  • 目录结构有点复杂,慢慢梳理吧。
  • 这里演示的是detection的转换案例
#首线进入到detection的案例下
cd ddk/samples/ai_toolchain/horizon_model_convert_sample/04_detection/

③ copy案例

  • 本文采样onnx转换,这里copy下yolov5的案例,比较接近;caffe可以选择yolov2案例copy。

    cp -rf ./03_yolov5s ./08_nanodet
    

④ 模型放入指定目录

  • 模型存放目录: /ddk/samples/ai_toolchain/model_zoo
    #进入模型存放目录
    cd ddk/samples/ai_toolchain/model_zoo/mapper/detection/
    
  • 创建文件,放入onnx模型
    # 创建文件夹
    mkdir nanodet
    #放入模型
    cp   XXXX.onnx  ./
    

⑤ 修改转换脚本

  • 修改01_check.sh 中模型的路径,修改成之前放模型的路径。
  • 修改yaml名称,由于是copy过来的,还是修改一下。
  • 修改03_build.sh 中yaml的路径及名称。

⑥ 配置yaml中转换参数(⭐重要参数)

  • 官方文档配置详情:3.4 转换模型章节
  • model_parameters
    • onnx_model (⭐) —— 模型路径需要修改
    • output_model_file_prefix —— 输出模型名称
  • input_parameters
    • input_name(⭐) —— 单输入模型可不填,多输入需要用“,”分隔。
    • input_type_train —— 训练时输入的数据格式,常规是’rgb’或者’bgr’格式。
    • input_shape(⭐) —— 可用Netron查看,例: input_shape:‘1x3x224x224’,可不填。
    • input_layout_train —— 根据input_shape填写,常规:‘NHWC’/‘NCHW’
    • norm_type —— 预处理策略。
    • mean_value —— 预处理方法的图像减去的均值, 如果是通道均值,value之间必须用空格分隔,根据自己的数据计算得出。
    • scale_value —— 预处理方法的图像缩放比例,如果是通道缩放比例,value之间必须用空格分隔,根据自己的数据计算得出。
  • calibration_parameters
    • compile_mode —— 编译策略,一般默认速度优先即可。
    • core_num(⭐) —— 模型指定BPU个数,默认为1;常规开发板为双核,追求速度可填2。
    • optimize_level (⭐)—— 优化等级,默认速度优先 ‘03’。
  • 根据模型修改配置文件
    • 本文采用nanodet模型为单输入,rgb,nchw,单输出,320*320的模型,依据上表只修改了模型路径其他不需要修改;追求速度core_num也可修改为2。

⑦ 执行转换

  • 01_check.sh
  • 图太长中间跳过一些节点,大部分都能在BPU上运行。
    地平线 旭日X3 PI (三) 模型转换_第1张图片
    .
  • 02_preprocess.sh
    • 需要先修改 preprocess.py 下 calibration_transformers()函数中的预处理尺寸

      #这里模型输入为320*320 
      transformers = [
      	        PadResizeTransformer(target_size=(320, 320)),
      	        HWC2CHWTransformer(),
      	        BGR2RGBTransformer(data_format="CHW"), ]
      
    • 执行 02_preprocess.sh
      .

  • 03_build.sh
    • 根据⑥中修改yaml中的配置,build过程需要等待一会。
    • 重要关注Cosine Similarity和原本模型的相似度,本问nanodet所有节点都在0.9以上,尚可。
    • build完成后会在目录下生成model_output文件夹,里面保存了生成的板上运行的模型。
      地平线 旭日X3 PI (三) 模型转换_第2张图片

⑦ 板上开发

  • 得到模型后,需要根据模型编写模型的后处理模块,这个会在后面的文章介绍。
  • 官方案例的自训练模型可直接采用官方代码修改即可。

模型转换结果记录

结果根据官方工具显示:

模型 转换差异 算子支持情况
nanodet-plus 尚可 大部分可在BPU上运行
yolox-nano 差异大 大部分可在BPU上运行
fastestdet 尚可 部分在CPU上运行

参考文档

https://developer.horizon.ai/api/v1/fileData/doc/cn/source_doc/x3_ddk_docs.html
https://developer.horizon.ai/api/v1/fileData/doc/ddk_doc/navigation/ai_toolchain/docs_cn/horizon_ai_toolchain_user_guide/index.html
https://developer.horizon.ai/api/v1/fileData/doc/ddk_doc/navigation/ai_toolchain/docs_cn/hb_mapper_sample_doc/index.html
https://developer.horizon.ai/api/v1/fileData/doc/ddk_doc/navigation/ai_toolchain/docs_cn/hb_mapper_tools_guide/model_conversion_details.html#

你可能感兴趣的:(地平线,旭日,X3,caffe,人工智能,深度学习)