本文介绍一款TI公司提供的神经网络加速框架TIDL,该工具主要用于算法原型开发后,将得到的模型移植到嵌入式环境做部署。文中通过讲解TIDL工具提供的功能、支持的主流模型、部署的操作流程,让算法开发者进一步熟悉AI算法的落地方法。

什么是TIDL?

TIDL是TI的深度学习解决方案,将深度学习应用程序转移到TI芯片的EVE和DSP上的SDK接口。

深度学习分为两个阶段:

网络训练: 设计神经网络模型,使用服务器或者具有外部图形处理单元或GPU的PC上通过大型数据集离线训练以调整模型参数,通常在PC上使用Caffe 、TensorFlow等框架完成。

模型部署: 采用包含参数的预训练模型,对输入的数据预测输出结果,可以用TIDL转换工具将开源框架得到的网络和参数转换成TIDL支持的bin文件。

所以TIDL支持在C66x DSP和EVE子系统上以低功耗运行深度学习实时推理部分。

TIDL支持哪些功能?

TIDL支持将开源框架下训练的模型文件转换到自己的格式进行推理,开发者可以采用TensorFlow,Caffe,ONNX三种开源框架训练模型,同时TIDL支持以下格式的转换:pb或tflite文件、onnx文件、caffemodel和prototxt文件。如下图所示:

模型导入的流程如下图所示:

  • 将开源框架训练的网络转换成TIDL用于推理的bin文件格式;

  • 将浮点模型进行8位量化的同时提供测评工具度量每个层级上量化带来的损失;

  • 模型转换的过程中支持层级的优化和融合;

图形编译器是用于解析深度神经网络,根据处理器和可用内存系统的功能,为所需网络提供执行信息和内存布局:

  • 在进行图形编译过程中通过内存管理,优化网络操作的执行顺序,从而提高推理性能;

  • 支持网络性能的评估,包括网络所需带宽、计算周期、推理时间等;

环境仿真:

  • 可以在PC上安装TI开发板上的仿真环境,对转换的模型bin文件验证推理效果,运行无误后再移植到开发板上运行,有助于模型和代码的调试。

TIDL支持哪些网络和操作呢?

大多数硬件厂商提供都深度学习SDK都会针对主流网络进行测试验证,并且对不同开源框架的支持力度也有所区别,如下图所示针对四种深度学习开源框架的ops支持情况:

从操作节点可以看出,TIDL中对Caffe的支持相对更好些,但是仍然有许多不支持的操作,所以研发人员在原型开发阶段需要考虑操作层的选择,以免后期进行网络嵌入式移植时无法转换模型。

下图是TIDL支持的现有网络,原型开发时可以参考使用已经支持的模型结构组建自己的模型:

从实际测试角度,建议用Caffe框架搭建神经网络,或者后期将pb等权重转换成caffemodel格式。小编使用Tensorflow的权重进行转换遇到各种不支持的操作。

TI的深度学习SDK不支持自定义层的功能,这点其实严重影响开发者效率,遇到不支持的层基本只能放弃。小编觉得还是Nvidia支持的好,既支持自定义插件的功能又提供CUDA编程加速前后处理。

如何使用TIDL做推理?

TIDL的使用流程主要分为两个阶段:转换阶段和推理阶段,如下图所示:

a.模型导入的具体步骤包括:

  • 读取配置文件;

  • 合并转换图层并统计缓冲区大小;

  • 生成量化配置文件,并统计每层的量化区间;

  • 生成编译配置文件,调用图形编译器优化性能;

  • 可视化网络结构并检查模型;

b. 模型导入后根据记录各层的区间范围做量化:

嵌入式开发板一般没有浮点加速单元或者对浮点运算支持不佳,所以采用8位/16位量化是不可或缺的环节。量化的操作是通过参考当前层参数的最大值、最小值,使用定点数和比例系数来表示浮点数。

TIDL支持对以下几种层的量化:

  • 卷积层

  • 反卷积层

  • 内积层

  • 批归一化层

c. 模型可视化功能:

TIDL提供名为GraphViz的工具进行网络结构的可视化,方便开发者分析和调试。

GraphViz的具体内容包括:

  • 可视化网络各层的卷积核参数;

  • 包含一些TIDL层的调试信息;

类似于Tensorboard的功能,如下图所示:记录了每一层的输入输出维度、卷积核尺寸、步长、空洞大小等等信息。

d. 构建输入和输出的张量缓存,并检验转换输入数据的格式进行前向推理:

模型准备好后就需要加载数据进行推理操作,通常需要先分配好输入和输出的内存占用,在TIDL中定义张量的形式需要设定好宽,高,通道数以及上下左右补齐的大小:

对于数据类型,目标只支持以下四种:

  • TIDL_UnsignedChar

  • TIDL_SignedChar

  • TIDL_UnsignedShort

  • TIDL_SignedShort

e. 网络输出的后处理:

官方文档描述的后处理内容指的可视化或者测评时需要的数据及显示效果。比如在显示时用不同的颜色画出不同类别的外接框等:

工程应用中的后处理往往是对网络输出的结构结合先验信息进行修正和过滤以达到更好的算法性能。

最后将不同算法环节拆分开来分别部署到合适的计算单元上最大化推理效率,比如将图像颜色空间的转换,尺度缩放归一化等前处理操作放在C66上计算,将网络的推理放在C7x上进行,对输出的外接框删选和修正放在C66上计算从而达到分工合作的目的。

小白学视觉知识星球

开始面向外开放啦👇👇👇

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
原文链接: https://mp.weixin.qq.com/s?__biz=MzU0NjgzMDIxMQ==&mid=2247605985&idx=2&sn=f1e705a23f187898628d63ea9f0a5313&chksm=fb54bc0dcc23351bc94095983ae64e46ebe3b542bfb60ab45ab72846aaa9ee167f639c79e14a&scene=126&sessionid=0 由于 嵌入式 设备固有的资源限制,在 嵌入式 GPU平台上设计和 部署 深度学习 和计算机视觉应用程序具有挑战性,该演示演示了如何创建和训练用于图像分类的深度神经网络,以及如何使用GPU Coder 部署 经过训练的网络。这些是“将深度神经网络 部署 嵌入式 GPU和CPU”日本网络研讨会的文件,该网络研讨会于2018年4月首次亮相。此演示中使用的图像来自CDC DPDx寄生图像库。 < https>该文件已在2018年4月举行的网络研讨会“ 深度学习 嵌入式 设备实现解决方案-GPU / CPU版本-”中使用。介绍实现流程的流程,该流程使用基于AlexNet的转移学习方法通​​过使用血液涂片测试图像对寄生病原体的类型进行分类,并使用GPU Coder将学习到的网络分布到MATLAB外部的环境中。此外,此演示使用在美国CDC DPDx寄生图像库中发布的图像数 下面来探讨一下 深度学习 嵌入式 设备上的应用,具体如下: 1、 深度学习 的概念源于人工神经网络的研究,包含多个隐层的多层感知器(MLP) 是一种原始的 深度学习 结构。 深度学习 通过组合低层特征形成更加抽象的高层表示( 属性类别或特征) ,以发现数据的分布式特征表示。BP 算法 是训练多层网络的典型 算法 ,但实际上对于仅含几层的网络,该训练方法就已很不理想。深度结构( 涉及多个非线性处理单元层) 非凸目标代价函... 需求一:简单的demo演示,只要看看效果的,像是学校里面的demo展示这种 caffe 、tf、pytorch等框架随便选一个,切到test模式,拿python跑一跑就好,顺手写个简单的GUI展示结果 高级一点,可以用CPython包一层接口,然后用C++工程去调用 需求二:要放到服务器上去跑,但一不要求吞吐二不要求时延的那种,说白了还是有点玩玩的意思 caffe 、tf、pytorch等框架随便选一个,按照官方的 部署 教程,老老实实用C++ 部署 ,例如pytorch模型用 大家都知道现在 深度学习 很火,不管是线上还是线下,大家都对 深度学习 充满了期待。一般来说, 深度学习 会包括这样几个过程,即数据准备、数据标记、训练、 部署 。如果说数据的准备和标记还是可控的话,那么训练和 部署 这个里面需要花费的时间就非常可观了。首先,选择什么样的模型,才能匹配业务的需要。另外一个,就是训练好的模型,怎样才能在设备上运行起来,这个就非常可观了。目前,关于 部署 这块主要有这么集中方法, 国内最牛的无人驾驶厂家的运算平台是这样的: 一个英特尔至强 E5 的 CPU,拥有 12 内核,30MB 的二级缓存,运算能力为 400GOPS/s,功率消耗为 400 瓦(应该是第一代至强 E5,目前 E5 最高功率消耗都不超过 180 瓦),八个英... 转自: 算法 嵌入式 移植 (一)C代码优化 – Deep Studio 一般C/C++的 算法 代码不适合直接 移植 嵌入式 设备,需要 一些优化和处理。一方面是出于速度考虑,另一方面是针对 嵌入式 设备支持的语言特性差异进行修改,还有就是硬件上的考虑,比如就定点DSP而言,就需要将原来的浮点运算进行转化。 近期博主在整理以往笔记,就将 算法 嵌入式 移植 这部分差分成两个章节,一是C代码优化部分,二是DSP代码 移植 部分,第一章节是语言层面的一般而言是适合所有 嵌入式 设备的,第二章节是和DSP开发环境相关方面的。特此整理,谨.. yolov5+Deepsort 算法 部署 于rk3588和rk3399pro开发板C++完整源码(车辆行人检测跟踪)+rknn模型+操作说明文档.zip 【资源介绍】 改善了边界框漂移, 完善了当图中没有目标等其他情形出现的bug, 增加了对cost matrix出现nan时的处理 加入了隔帧检测的功能. 设置方法: 在./yolov5/include/detect.h中 将 const int det_interval = 1;改成期望的数值, 例如3, 表示每隔3帧检测一次, 这样可以显著提升速度. 同时, 也需要更改./deepsort/include/deepsort.h中line 39的const int track_interval = 1; , 数值要和检测的保持一致. 加入Re-ID多线程的功能 如果您不希望使用多线程, 则在./deepsort/src/deepsort.cpp中line 144的if (numOfDetections < 2) 改成if (true) 更多详细介绍请查看资源内的项目说明。按照步骤操作使用