0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Tengine实现yolov4的cpu推理讲解

电子设计 来源:电子设计 作者:电子设计 2020-12-15 00:19 次阅读

本期讲解便是基于 Tengine 实现 yolov4的 cpu推理

完成动机:

主要是为了熟悉tengine的推理部署流程

一、模型转换

采用下面链接中yolov4的模型权重和配置文件

https://github.com/ultralytics/yolov3github.com

源模型使用的是darknet格式,因为yolov4新增了mish算子,所以需要增加对应算子的序列化代码才能正常转换,下面是我的代码改动,基本按照tanh算子进行相应增加。

https://github.com/zjd1988/Tengine-Convert-Toolsgithub.com

convert tools增加算子的详细流程,参考官方增加自定义算子步骤:

(1)在operator/include/operator目录下增加mish.hpp 和mish/_param.hpp/_文件,/_由于mish算子不需要额外的参数配置,因此mish/_para.hpp并没有添加。mish.hpp内容可以参考其他类似没有参数配置的算子(比如tanh),在operator/operator 目录下增加mish.cpp,增加算子实现代码;

(2)在operator/operator目录下增加mish算子内存分配的代码,因为mish算子不涉及这部分修改,并未做任何修改

(3)在operator/operator/plugin/init.cpp文件中的operator/_plugin/_init函数中增加算子的注册函数调用

(4)增加mish算子序列化和解析代码

(4-1)在serializer/include/tengine/v2/tm2/_format.h中增加mish的类型宏定义和字符串宏定义 ;
(4-2)在serializer/tengine/v2/tm2/_op/_load.cpp文件中增加LoadTmMishOp函数实现,同时在LoadTmOpFunc函数中增加调用LoadTmMishOp的逻辑代码;
(4-3)在serializer/tengine/v2/tm2/_op/_save.cpp文件中增加SaveTmMishOp函数实现,同时在SaveTmReorgOp函数中增加调用SaveTmMishOp的逻辑代码;
(4-4)在serializer/tengine/v2/tm2/_op/_serializer.hpp,增加LoadTmMishOp和 SaveTmMishOp的函数声明

(4-5)本次转换模型针对darknet,所以需要对tools/darknet/darknet/_serializer.cpp文件中增加mish算子解析的相应逻辑。 因为mish没有单独使用,而是作为conv的激活函数调用,所以是在LoadConv2D函数参照leaky增加相应的代码。其他单独算子的实现也可以参考其他类似算子的实现方式

完成代码改动后,按照如下操作进行编译,即可生成转换工具

mkdir build && cd build
cmake ..
make -j4 && make install

最后执行转换动作(提前准备好模型文件)

./install/bin/tm_convert_tool -f darknet -p yolov4.cfg -m yolov4.weights -o yolov4.tmfile

二、推理

官方代码链接下的readme并没有找到介绍如何新增算子,但是可以参考类似算子进行修改添加,下面是我参考tanh算子的实现,进行的修改

(1-1)在inlcude/tengine/_op.h中增加mish的枚举定义,include/tengine/_op/_name.h中增加mish的字符串宏定义
(1-2)在src/op/mish.c中增加mish算子的注册函数
(1-3)在src/serializer/tm/tm2/_format.h 和src/serializer/tm/op/tm2/_mish.c 中增加序列化相关代码,

note:src/serializer/tm/tm2/_format.h中定义算子的类型数值需要跟convert/_tools下的serializer/include/tengine/v2/tm2/_format.h代码保持一致

(1-4)在src/dev/cpu/op/目录下增加mish算子实现代码目录,包括mish/_ref.c(x86)、mish/_hcl/_arm.c(arm),其中contex-a目录下的文件为具体的kernel实现代码

也可以参考下面的链接,查看有哪些代码改动和文件增加:

https://github.com/zjd1988/Tenginegithub.com

测试

测试图片使用的是标题中的图片(512x384)test.jpg
测试代码使用的官方代码

examples/tm_yolov3_tiny.cpp

做了简单修改。

三、后续

(1)合并conv和mish算子
(2)后续抽空新增一个需要配置参数的算子

四、使用感受

(1)模型转换和推理分离,新增算子需要增加两次,官方回复会后续考虑合并,希望会越来越方便
(2)推理引擎编译速度快(本文目的不在于测试性能,只是验证tengine在推理yolov4的正确性)
(3)代码结构清晰,便于阅读和调试

以上便是解答过程以及使用感受。

更多Tengine相关内容请关注Tengine-边缘AI推理框架专栏。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10802

    浏览量

    210767
  • Tengine
    +关注

    关注

    1

    文章

    47

    浏览量

    2831
收藏 人收藏

    评论

    相关推荐

    YOLOv6在LabVIEW中的推理部署(含源码)

    相关介绍文章,所以笔者在实现YOLOv6 ONNX 在LabVIEW中的部署推理后,决定和各位读者分享一下如何使用LabVIEW实现YOLOv
    的头像 发表于 11-06 16:07 71次阅读
    <b class='flag-5'>YOLOv</b>6在LabVIEW中的<b class='flag-5'>推理</b>部署(含源码)

    RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测

    随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU
    发表于 10-24 10:13

    手册上新 |迅为RK3568开发板NPU例程测试

    rknn-toolkit-lite2环境搭建和使用 3.1 rknn-toolkit-lite2环境搭建 3.1.1 直接安装 3.1.2 conda虚拟环境安装 3.2 rknn-toolkit-lite2推理测试 第4
    发表于 10-23 14:06

    RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测-迅为电子

    RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测-迅为电子
    的头像 发表于 08-23 14:58 549次阅读
    RK3588 技术分享 | 在Android系统中使用NPU<b class='flag-5'>实现</b><b class='flag-5'>Yolov</b>5分类检测-迅为电子

    RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测

    随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU
    发表于 08-20 11:13

    基于迅为RK3588【RKNPU2项目实战1】:YOLOV5实时目标分类

    [/url] 【RKNPU2 人工智能开发】 【AI深度学习推理加速器】——RKNPU2 从入门到实践(基于RK3588和RK3568) 【RKNPU2项目实战1】:YOLOV5实时目标分类 【RKNPU2项目实战2】:SORT目标追踪 【RKNPU2项目实战3】车牌识别
    发表于 08-15 10:51

    手册上新 |迅为RK3568开发板NPU例程测试

    rknn-toolkit-lite2环境搭建和使用 3.1 rknn-toolkit-lite2环境搭建 3.1.1 直接安装 3.1.2 conda虚拟环境安装 3.2 rknn-toolkit-lite2推理测试 第4
    发表于 08-12 11:03

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1321次阅读
    基于OpenCV DNN<b class='flag-5'>实现</b><b class='flag-5'>YOLOv</b>8的模型部署与<b class='flag-5'>推理</b>演示

    YOLOv8+PyQT5打造细胞计数与识别应用说明

    YOLOv8对象检测模型基于自定义数据集训练红白细胞检测模型,然后通过工具导出模型为ONNX,基于OpenVINO实现模型推理,完成细胞检测识别,根据检测到的细胞类别与数目,统计,在PyQT5打造的界面上显示输出检测结果。
    的头像 发表于 01-15 17:22 1016次阅读
    <b class='flag-5'>YOLOv</b>8+PyQT5打造细胞计数与识别应用说明

    深入浅出Yolov3和Yolov4

    Yolov3是目标检测Yolo系列非常非常经典的算法,不过很多同学拿到Yolov3或者Yolov4的cfg文件时,并不知道如何直观的可视化查看网络结构。
    的头像 发表于 01-11 10:42 717次阅读
    深入浅出<b class='flag-5'>Yolov</b>3和<b class='flag-5'>Yolov4</b>

    基于YOLOv8实现自定义姿态评估模型训练

    Hello大家好,今天给大家分享一下如何基于YOLOv8姿态评估模型,实现在自定义数据集上,完成自定义姿态评估模型的训练与推理
    的头像 发表于 12-25 11:29 2724次阅读
    基于<b class='flag-5'>YOLOv</b>8<b class='flag-5'>实现</b>自定义姿态评估模型训练

    在C++中使用OpenVINO工具包部署YOLOv5-Seg模型

    YOLOv5兼具速度和精度,工程化做的特别好,Git clone到本地即可在自己的数据集上实现目标检测任务的训练和推理,在产业界中应用广泛。开源社区对YOLOv5支持实例分割的呼声高涨
    的头像 发表于 12-21 10:17 2002次阅读
    在C++中使用OpenVINO工具包部署<b class='flag-5'>YOLOv</b>5-Seg模型

    【爱芯派 Pro 开发板试用体验】ax650使用ax-pipeline进行推理

    /runVoHook.sh即可恢复原样 本例子使用读取视频MP4,调用npu推理到hdmi显示 ./sample_demux_ivps_npu_hdmi_vo -p config/yolov5s.json -f test.mp
    发表于 12-19 17:36

    详细解读YOLOV7网络架构设计

    YOLOV7提出了辅助头的一个训练方法,主要目的是通过增加训练成本,提升精度,同时不影响推理的时间,因为辅助头只会出现在训练过程中。
    发表于 11-27 10:45 719次阅读
    详细解读<b class='flag-5'>YOLOV</b>7网络架构设计

    【LuckFox Pico Plus开发板免费试用】RKNN模型推理测试

    为开发者提供一个简单且高效的开发平台。虽然LuckFox Pico作为入门级开发板只有几十块钱,但是它具有人工智能协处理器NPU,也可以实现人工智能的推理工作。瑞芯微 RV1103芯片采用了和RK3568
    发表于 11-11 16:51