【TDA4板端部署】基于 Pytorch 训练并部署 ONNX 模型在 TDA4

1 将torch模型转onnx模型

Ti转换工具只支持以下格式:
Caffe - 0.17 (caffe-jacinto in gitHub)
Tensorflow - 1.12
ONNX - 1.3.0 (opset 9 and 11)
TFLite - Tensorflow 2.0-Alpha

基于 Tensorflow、Pytorch、Caffe 等训练框架,训练模型:选择一个训练框架,然后定义模型,最后使用训练的数据集训练出满足需求的模型。

2 onnx模型转bin模型

训练好的模型,需要使用 TIDLImporter 工具导入成可在 TIDL 上运行的模型。导入的主要目的是对输入的模型进行量化、优化并保存为TIDL 能够识别的网络模型和网络参数文件。
TIDL Importer 工具处理流程如下:
在这里插入图片描述

2.1 写配置文件

模型的导入需要模型导入配置文件,tidl_import_mobilenetv2.txt ,需要将其放在
${TIDL_INSTALL_PATH}/ti_dl/test/testvecs/config/import/public/onnx/路径下。导入的配置文件里面指定了模型配置参数,如果对参数有不清楚的地方参考链接 TIDL-RT Import Configuration Parameters:

具体包括:
Configuration Parameters for Input Pre-Processing
Configuration Parameters for path of different modules
Configuration Parameters related to TIDL-RT inference for quantization
Configuration Parameters for Graph Compiler
Configuration Parameters for format conversion

以ONNX Squeeze Net为例

modelType          = 2
inputNetFile      = "../../test/testvecs/models/public/onnx/squeezenet1.1.onnx"
outputNetFile      = "../../test/testvecs/config/tidl_models/onnx/tidl_net_squeezenet1.1.bin"
outputParamsFile   = "../../test/testvecs/config/tidl_models/onnx/tidl_io_squeezenet1.1_"
inDataNorm  = 1
inMean = 123.675 116.28 103.53
inScale = 0.017125 0.017507 0.017429
resizeWidth = 256
resizeHeight = 256
inWidth  = 224
inHeight = 224 
inNumChannels = 3
inData = ../../test/testvecs/config/imageNet_sample_val.txt
postProcType = 1

以tfLite为例

modelType          = 3
numParamBits      = 15
quantizationStyle  = 2
inputNetFile      = ../../test/testvecs/models/public/tflite/mobilenet_v1_1.0_224.tflite
outputNetFile      = "../../test/testvecs/config/tidl_models/tflite/tidl_net_tflite_mobilenet_v1_1.0_224.bin"
outputParamsFile   = "../../test/testvecs/config/tidl_models/tflite/tidl_io_tflite_mobilenet_v1_1.0_224_"
inDataNorm  = 1
inMean = 128 128 128
inScale =  0.0078125 0.0078125 0.0078125
resizeWidth = 256
resizeHeight = 256
inWidth  = 224
inHeight = 224 
inNumChannels = 3
inData = ../../test/testvecs/config/imageNet_sample_val_bg.txt
postProcType = 1

2.2 执行模型转换命令

在 Ubuntu 命令行执行下面命令导入模型:

user@ubuntu-pc$ 
cd /home/fredy/startJacinto/sdks/ti-processor-sdk-rtos-j721e-evm-08_
01_00_11/tidl_j7_08_01_00_05/ti_dl/utils/tidlModelImport./out/tidl_model_import.out /home/fredy/startJacinto/sdks/ti-processor-sdk-rtos-j721
e-evm-08_01_00_11/ tidl_j7_08_01_00_05/ti_dl/test/testvecs/config/import/public/onnx/tidl_import_mobilenetv2.txt(配置文件) 

Ubuntu 命令行执行上述命令输出的 log中,结尾输出 ALL MODEL CHECK PASSED 说明模型导入成功。

2.3 查看模型转换结果

模型导入使用 tidl_model_import.out 工具,该工具导入输入的模型(ONNX 模型),输出能够为 TIDL所使用的网络模型和参数文件(TIDL Network FileTIDL IO Info File),输入输出文件如下:

  • TF Model (Proto) File : …/…/test/testvecs/models/public/onnx/mobilenetv2/
    mobilenetv2.onnx
  • TIDL Network File : …/…/test/testvecs/config/tidl_models/onnx/tidl_ne
    t_mobilenetv2.bin
  • TIDL IO Info File : …/…/test/testvecs/config/tidl_models/onnx/tidl_io
    _mobilenetv2

3 模型 PC 推理

这一小节,将使用上一章节生成的模型文件(TIDL Network File 和 TIDL Network File )验证模型的正确性。
TIDL Network File : …/…/test/testvecs/config/tidl_models/onnx/tidl_net_mobilenetv2.bin
TIDL IO Info File : …/…/test/testvecs/config/tidl_models/onnx/tidl_io_mobilenetv2

3.1 PC上验证并部署

经过TIDL tidl_model_import.out 工具导入 tensorflow 模型,我们可以快速利用 Ubuntu 的工具PC_dsp_test_dl_algo.out 进行推理验证结果。PC_dsp_test_dl_algo.out 需要配置文件testvecs/config/infer/public/onnx/tidl_infer_mobilenetv2.txt(相关参数的解释,请参考这里)

Configuration files used for validation of models are provided in the “ti_dl/test/testvecs/config/infer/” folder for reference

Below is one example configuration file for Inference

inFileFormat    = 2
postProcType = 1
numFrames   = 1
netBinFile      = "../testvecs/config/tidl_models/tidl_net_jacintonet11v2_np2quant.bin"
ioConfigFile    = "../testvecs/config/tidl_models/tidl_io_jacintonet11v2_np2quant_1.txt"
inData  =   "../testvecs/config/classification_list.txt"
outData =   "../testvecs/output/airshow_j11.bin"

On Successful execution the output tensor will be generated in as binary raw file in the path specified by “outData”.

3.2 EVM 上验证并部署

模型在 PC 验证后,最终可以部署在 EVM 上进行性能和结果测试。如果觉得 PC 验证会浪费时间,可以省略 PC 验证的步骤,完成模型的导入后,就可以直接在 EVM 上验证。

经过 TIDL tidl_model_import.out 工具导入的 ONNX 模型,在 EVM 上,使用
TI_DEVICE_a72_test_dl_algo_host_rt.out 工具进行推理测试。该工具不仅可以测试使用模型的正确性,还可以测试真实的帧率。 经 TI_DEVICE_a72_test_dl_algo_host_rt.out 处理后,输出图像存储在/opt/tidl_test/testvecs/output,可将数据导入到 PC 确认其结果。

基于 EVM 进行推理确认其正确性后,模型可以部署到应用。

4 FAQ

4.1 SDK 中 TIDL 支持哪些算子?

TIDL 支持的算子请参考使用版本的 UserGuide,参考链接。

4.2 SDK 中 ONNX 支持和验证的模型有哪些?

TIDL 提供了支持的模型库,用户可以参考模型库中的模型快速进行模型进行验证,并参考模型
进行新的模型设计。模型库参考链接。

4.3 如果遇到 performance 问题,如何进行调试?

Performance 的问题请参考链接的建议进行调试。

4.4 TIDL Importer 工具导入 ONNX 模型需要注意哪些方面?

ONNX 模型可以直接导入 TIDL,TIDL Importer 工具输入配置文件路径在:TIDL_PATH
/ti_dl/test/testvecs/config/import/public/tensorflow/tidl_import_xxx.txt。对于 import 配置文件注意检查如下内容:

 1. 导入的 modelType:ONNX 模型配置为 2 (.onnx files). 2. inputNetfile/outputNetFile: 检查输入/输出模型文件的路径。3. inData: 输入数据的配置,通常自己的模型,需要调整输入图片。4. inWidth/inHeight/resizeWidth/resezeHeight :配置图片输入的 size 及调整后的 size。5. inNumChannels : 输入图片通道数。

4.5 TIDL 如何打印 log 信息?

不论是 Import 模型的时候,还是 inference 的时候,难免会遇到问题,当遇到问题的时候,怎么样才
能输出更多的调试信息呢? TIDL 提供了两个标志变量 writeTraceLevel 和 debugTraceLevel 用来获取更多的信息。
debugTraceLevel 可以打印更多的输出信息,便于追踪 import 和 inference 的过程。默认配置是 0,可支持 1、2 配置。数字越大,表明输出的信息越多。
writeTraceLevel 可以输出每一层的信息到文件,便于模型逐层比较。默认配置是 0,没有输出,可支
持 1、2、3 配置:1- Fixed Point , 2- Padded Fixed Point, 3 - Floating point。

5 参考

  1. https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtosjacinto7/08_01_00_11/exports/docs/tidl_j7_08_01_00_05/ti_dl/docs/user_guide_html/usergroup0.html
  2. https://www.ti.com.cn/cn/lit/an/zhcab78/zhcab78.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法(2):顺序表与链表

1.前言 哈喽大家好喔,今天博主继续进行数据结构的分享与学习,今天的主要内容是顺序表与链表,是最简单但又相当重要的数据结构,为以后的学习有重要的铺垫,希望大家一起交流学习,互相进步,让我们…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList,跳表,跳跃表,在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中,跳跃表使用概率均衡技术而不是使用强制性均衡,因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

AQS详解(详细图文)

目录 AQS详解1、AQS简介AbstractQueuedSynchronizer的继承结构和类属性AQS的静态内部类Node总结AQS的实现思想总结AQS的实现原理AQS和锁的关系 2、AQS的核心方法AQS管理共享资源的方式独占方式下,AQS获取资源的流程详解独占方式下,AQS释放资源的流程详解…

如何通过DBC文件看懂CAN通信矩阵

实现汽车CAN通信开发,必不可少要用到DBC文件和CAN通信矩阵。 CAN通信矩阵是指用于描述 CAN 网络中各个节点之间通信关系的表格或矩阵。它通常记录了每个节点能够发送和接收的消息标识符(ID)以及与其他节点之间的通信权限。 通信矩阵在 CAN 网…

利用Msfvenom获取WindowsShell

一、在kali主机上利用msfvenom生成windows端的安装程序(exe文件),程序名最好取一个大家经常安装的程序,如腾讯视频、爱奇艺等。 (1)由于生成的程序可能会被杀毒软件识别,我们比较一下使用单个编码器生成的程序与用两个编码器生成的程序,哪个更容易被识别。 利用单个编码…

SSE(Server Sent Event)实战(2)- Spring MVC 实现

一、服务端实现 使用 RestController 注解创建一个控制器类(Controller) 创建一个方法来创建一个客户端连接,它返回一个 SseEmitter,处理 GET 请求并产生(produces)文本/事件流 (text/event-stream) 创建…

如何使用Milvus Cloud进行稀疏向量搜索

如何使用Milvus Cloud进行向量搜索Milvus Cloud 是一款高度可扩展、性能出色的开源向量数据库。在最新的 2.4 版本中,Milvus Cloud 支持了稀疏和稠密向量(公测中)。本文将利用 Milvus Cloud 2.4 来存储数据集并执行向量搜索。 接下来,我们将演示如何利用 Milvus Cloud 在 M…

[GXYCTF2019]Ping Ping Ping1

打开靶机 结合题目名称,考虑是命令注入,试试ls 结果应该就在flag.php。尝试构造命令注入载荷。 cat flag.php 可以看到过滤了空格,用 $IFS$1替换空格 还过滤了flag,我们用字符拼接的方式看能否绕过,ag;cat$IFS$1fla$a.php。注意这里用分号间隔…

睡前故事—绿色科技的未来:可持续发展的梦幻故事

欢迎来到《Bedtime Stories Time》。这是一个我们倾听、放松、并逐渐入睡的播客。感谢你收听并支持我们,希望你能将这个播客作为你睡前例行活动的一部分。今晚我们将讲述绿色科技的未来:可持续发展的梦幻故事的故事。一个宁静的夜晚,希望你现…

0602STM32定时器输出比较

STM32定时器输出比较 PWM简介 主要用来输出PWM波形,PWM波形又是驱动电机的必要条件,所以如果想用STM32做一些有电机的项目,比如智能车,机器人等。那输出比较功能就要认真掌握 1.PWM驱动LED呼吸灯 2.PWM驱动舵机 3.PWM驱动直流电机…

搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界

触觉技术在过去几年中发展迅猛,大大提高了反馈的精确度和真实度。其应用产生了真正的影响,数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面,但触觉技术可能会彻底改变我们的生活,尤其是通…

视频共享融合赋能平台LntonCVS视频监控业务平台技术方案详细介绍

LntonCVS国标视频综合管理平台是一款智慧物联应用平台,核心技术基于视频流媒体,采用分布式和负载均衡技术开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台功能丰富,包括视频直播、录像、回放、检索、云存储、告警上…

【数据结构】详解堆

一、堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵 完全二叉树的 数组对象。 堆是非线性数据结构,相当于一维数组,有两个直接后继。 如果有一个关键码的集合K { k₀,k₁,k₂ &#xff0…

数据结构(双向链表)

链表的分类 链表的结构⾮常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构: 虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构:单链表和双向带头循环链表 1.⽆头单向⾮循环链表&#xff1a…

第十课:telnet(远程登入)

如何远程管理网络设备? 只要保证PC和路由器的ip是互通的,那么PC就可以远程管理路由器(用telnet技术管理)。 我们搭建一个下面这样的简单的拓扑图进行介绍 首先我们点击云,把云打开,点击增加 我们绑定vmn…

【面试题】Redo log和Undo log

Redo log 介绍Redo log之前我们需要了解一下,mysql数据操作的流程: 上述就是数据操作的流程图,可以发现sql语句并不是直接操作的磁盘而是通过操作内存,然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域: 缓…

华为HCIP Datacom H12-821 卷42

42.填空题 如图所示,MSTP网络中SW1为总根,请将以下交换机与IST域根和主桥配对。 参考答案:主桥1468 既是IST域根又是主桥468 既不是又不是就是25 解析: 主桥1468 既是IST域根又是主桥468 既不是又不是就是25 43.填空题 网络有…

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言: 今天跟大家唠唠如何用小money生 大money的方法,首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying,它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内,与AI进行几轮对话就能开发出一个可以解决实际…

WEB前端06-BOM对象

BOM浏览器对象模型 浏览器对象模型:将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型,提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window:浏览器窗口对象 Navigator&…

区块链资料

Quantstamp - Public Security Assessments smart-contract-sanctuary-bsc/contracts/mainnet at master tintinweb/smart-contract-sanctuary-bsc GitHub https://github.com/slowmist/Cryptocurrency-Security-Audit-Guide/blob/main/README_CN.md sFuzz: 高效自适应的智…