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

    文章

    11218

    浏览量

    222953
  • Tengine
    +关注

    关注

    1

    文章

    47

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    单板挑战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 2405次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov</b>5训练部署教程

    yolov5训练部署全链路教程

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

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

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

    RK3576 yolov11-seg训练部署教程

    yolov11-seg 是YOLO(You Only Look Once)系列的最新成员,专为实时实例分割任务设计。它在保持YOLO家族高效推理速度的同时,通过创新的网络结构和分割头设计,实现了像素
    的头像 发表于 04-16 09:43 1886次阅读
    RK3576 <b class='flag-5'>yolov</b>11-seg训练部署教程

    【米尔-全志T536开发板试用体验】开发资源关键要点

    空间转换2。 AI推理优化 模型部署:YOLOv5n量化版(输入尺寸416x416),采用双缓冲机制分离采集与推理内存空间。 多核负载均衡:CPU0负责视频采集,
    发表于 04-14 23:06

    labview调用yolo目标检测、分割、分类、obb

    labview调用yolo目标检测、分割、分类、obb、pose深度学习,支持CPU和GPU推理,32/64位labview均可使用。 (yolov5~yolov12)
    发表于 03-31 16:28

    【幸狐Omni3576边缘计算套件试用体验】RKNN 推理测试与图像识别

    【幸狐 Omni3576 边缘计算套件测评】RKNN 推理测试与图像识别 本文介绍了幸狐 Omni3576 边缘计算套件实现 RKNN 推理和图像物体识别的测试流程,包括 RKNN 介绍、环境搭建
    发表于 03-20 16:14

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸一致吗?一致会达到更好的效果?

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸一致吗,一致会达到更好的效果
    发表于 03-11 08:12

    模型无法获得mAP值等于1.00的原因是什么?

    量化了大小为 416 x 416 的 YOLOv4 模型,并获得了正确的 mAP 值。 使用以下命令量化大小为 320 x 544 的 YOLOv4 模型:pot -c
    发表于 03-07 07:21

    YOLOv4模型转换为IR的说明,无法将模型转换为TensorFlow2格式怎么解决?

    遵照 将 YOLOv4 模型转换为 IR 的 说明,但无法将模型转换为 TensorFlow2* 格式。 将 YOLOv4 darknet 转换为 Keras 模型时,收到 TypeError: buffer is too small for requested arr
    发表于 03-07 07:14

    为什么深度学习中的Frame per Second高于OpenVINO™演示推理脚本?

    在 DL Workbench 上使用 Microsoft 通用对象上下文 (MS COCO) 数据集运行 YOLOv4 对象检测模型,并获得 50 - 60 FPS。 OpenVINO™演示推理脚本运行,并获得更高的 FPS。
    发表于 03-06 07:27

    无法在Windows Subsystem for Linux 2上使用对象检测Python演示运行YoloV4模型?

    在 WSL2 上运行对象检测 python 演示。 使用 CPU 运行 object_detection_demo.py 时遇到错误: OpenCV: FFMPEG: tag
    发表于 03-05 08:43

    为什么在Ubuntu20.04上使用YOLOv3比Yocto操作系统上的推理快?

    使用 2021.4 OpenVINO™中的 GPU 插件运行带有 YOLOv3 模型的 对象检测 C++ 演示 。 使用 英特尔® 酷睿™ i5-1145G7E、英特尔® 酷睿
    发表于 03-05 06:48