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

    文章

    11370

    浏览量

    226401
  • Tengine
    +关注

    关注

    1

    文章

    47

    浏览量

    3278
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B yolov11-seg训练部署教程

    1.yolov11-seg简介yolov11-seg是YOLO(YouOnlyLookOnce)系列的最新成员,专为实时实例分割任务设计。它在保持YOLO家族高效推理速度的同时,通过创新的网络结构
    的头像 发表于 05-11 14:24 186次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>yolov</b>11-seg训练部署教程

    瑞芯微(EASY EAI)RV1126B yolov8训练部署教程

    1.Yolov8简介YOLOv8是ultralytics公司在2023年1月10号开源的基于YOLOV5进行更新的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于Yolov
    的头像 发表于 05-09 14:44 393次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>yolov</b>8训练部署教程

    瑞芯微(EASY EAI)RV1126B yolov5训练部署教程

    5m、YOLOv5l、YOLOv5x四个模型。YOLOv5相比YOLOv4而言,在检测平均精度降低不多的基础上,具有均值权重文件更小,训练时间和推理
    的头像 发表于 05-09 14:20 375次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>yolov</b>5训练部署教程

    米尔RK3576+Hailo-8突破6 TOPS极限,让高帧率摄像头真正“实时”

    测试发现,当****4YOLOv5模型同时推理时,NPU负载率已超过75%。一旦增加到第5路, 整体延迟急剧飙升 ,系统响应明显劣化。 在单路推理场景下,
    发表于 04-02 18:03

    基于米尔MYC-LR3576开发板的实时视频识别系统设计与实现

    实时性视频识别系统。重点解决了多路视频流处理、NPU加速模型部署、低延迟推理等关键问题,在工业安防、智能零售等场景中实现精准目标检测。 一、硬件平台与系统环境 1. 硬件架构处理器:RK3576
    发表于 12-01 21:23

    【CIE全国RISC-V创新应用大赛】MUSE PI PRO 測評

    for i in range(10**6)]; input(\'按回车释放...\')\"(占用约800MB,无溢出) 4. 实战:YOLOv8n图片推理(8分钟) 装依赖:pip3
    发表于 11-28 19:00

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 1808次阅读
    基于迅为RK3588开发板<b class='flag-5'>实现</b>高性能机器狗主控解决方案- AI能力实战:<b class='flag-5'>YOLOv</b>5目标检测例程

    使用ROCm™优化并部署YOLOv8模型

    作者:AVNET 李鑫杰 一,YOLOv8介绍? YOLOv8 由 Ultralytics 于 2023 年 1 月 10 日发布,在准确性和速度方面提供了前沿的性能。YOLOv8 在之前 YOLO
    的头像 发表于 09-24 18:32 1108次阅读
    使用ROCm™优化并部署<b class='flag-5'>YOLOv</b>8模型

    单板挑战4YOLOv8!米尔瑞芯微RK3576开发板性能实测

    4.YOLOv8s-obb.float 旋转目标检测模型 上面已经看到了单独解析视频时,每一种模型效果,接下来演示MYD-LR3576通过4路摄像头同时推导效果。 实现方式如下:MYD-LR3576
    发表于 09-12 17:52

    基于瑞芯微RK3576的 yolov5训练部署教程

    5s、YOLOv5m、YOLOv5l、YOLOv5x 四个模型。YOLOv5 相比YOLOv4 而言,在检测平均精度降低不多的基础上,具有均
    的头像 发表于 09-11 16:43 3366次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov</b>5训练部署教程

    yolov5训练部署全链路教程

    5m、YOLOv5l、YOLOv5x四个模型。YOLOv5相比YOLOv4而言,在检测平均精度降低不多的基础上,具有均值权重文件更小,训练时间和推理
    的头像 发表于 07-25 15:22 2131次阅读
    <b class='flag-5'>yolov</b>5训练部署全链路教程

    如何提高yolov8模型在k230上运行的帧率?

    我rgb888p_size参数在[1280,720]时只有4~6 FPS,调成[640,640]大概也只有10FPS左右,我是用官方yoolo大作战上的示例代码看的,用的是yolov8s.pt训
    发表于 06-20 06:25

    YOLOv8水果检测示例代码换成640输入图像出现目标框绘制错误的原因 ?

    官网中的YOLOv8 水果检测关于图片推理的示例源代码: from libs.YOLO import YOLOv8 import os,sys,gc import ulab.numpy as np
    发表于 06-18 06:37

    在K230上部署yolov5时 出现the array is too big的原因?

    重现步骤 1将yolov5的kmodel放入k230的data数据 2使用yolo大作战里的视频流推理代码 3运行 期待结果和实际结果 期待的结果 将目标检测的框圈起来 实际看到的结果
    发表于 05-28 07:47

    【幸狐Omni3576边缘计算套件试用体验】幸狐Omni3576开发板移植YOLOV10和推理测试

    功能。 一、RKNN简介 RKNN-Toolkit2工具在 PC 平台上提供 C 或 Python 接口,简化模型的部署和运行。用户可以通过该工具轻松完成以下功能:模型转换、量化、推理、性能和内存评估
    发表于 05-24 12:27