基于 NCNN, 实现 yolov8

2023-05-16

在这里插入图片描述

记录下 基于 ncnn 实现 yolov8 的全部过程


  1. 修改 ultralytics/nn/modules.py class Detect forwardclass C2f forward
    class Detect(nn.Module):
    ...
        def forward(self, x):
            shape = x[0].shape  # BCHW
            for i in range(self.nl):
                x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)
            if self.training:
                return x
            elif self.dynamic or self.shape != shape:
                self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
                self.shape = shape
    
            # x_cat = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2)
            # if self.export and self.format in ('saved_model', 'pb', 'tflite', 'edgetpu', 'tfjs'):  # avoid TF FlexSplitV ops
            #     box = x_cat[:, :self.reg_max * 4]
            #     cls = x_cat[:, self.reg_max * 4:]
            # else:
            #     box, cls = x_cat.split((self.reg_max * 4, self.nc), 1)
            # dbox = dist2bbox(self.dfl(box), self.anchors.unsqueeze(0), xywh=True, dim=1) * self.strides
            # y = torch.cat((dbox, cls.sigmoid()), 1)
            # return y if self.export else (y, x)
            
            pred = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)
            return pred
    
    
    class C2f(nn.Module):
        export = False  # export mode
        # CSP Bottleneck with 2 convolutions
        def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
            super().__init__()
            self.c = int(c2 * e)  # hidden channels
            self.cv1 = Conv(c1, 2 * self.c, 1, 1)
            self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
            self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))
    
        def forward(self, x):
            if not self.export:
                y = list(self.cv1(x).chunk(2, 1))
                y.extend(m(y[-1]) for m in self.m)
                return self.cv2(torch.cat(y, 1))
            
            x = self.cv1(x)
            x = [x, x[:, self.c:, ...]]
            x.extend(m(x[-1]) for m in self.m)
            x.pop(1)
            return self.cv2(torch.cat(x, 1))
    
        def forward_split(self, x):
            if not self.export:
                print("------------> c2f forward_split:")
                y = list(self.cv1(x).split((self.c, self.c), 1))
                y.extend(m(y[-1]) for m in self.m)
                return self.cv2(torch.cat(y, 1))
            x = self.cv1(x)
            x = [x, x[:, self.c:, ...]]
            x.extend(m(x[-1]) for m in self.m)
            x.pop(1)
            return self.cv2(torch.cat(x, 1))
    
    
  2. 生成 onnx, 创建 export.py
    from ultralytics import YOLO
    # load yolov8 segment model
    model = YOLO("yolov8n.pt")
    # Use the model
    success = model.export(format="onnx", opset=13, simplify=True)
    
  3. 导出 ncnn 模型
    ./onnx2ncnn models/yolov8n.onnx models/yolov8n.param models/yolov8n.bin
    ./ncnnoptimize models/yolov8n.param models/yolov8n.bin models/yolov8n-opt.param models/yolov8n-opt.bin 65536
    
  4. 测试参考 https://github.com/FeiGeChuanShu/ncnn-android-yolov8

在这里插入图片描述


Q&A

  1. Shape not supported yet!
    修改 modules.py class detectclass c2f

  2. ./ncnnoptimize models/yolov8n.param models/yolov8n.bin models/yolov8n-opt.param models/yolov8n-opt.bin 65536 报错
    尝试通过网上在线方式转换 fp16, 成功了。但使用ncnn 加载模型总是报错。在网上一顿找,各位大佬都验证好用,到我这就怎么转都报错,很是苦逼。后来索性换了个yolov8版本,结果好使了,麻蛋的。

    # 其实警告已经表示 该版本不支持 onnx exported.  没注意,以为无伤大雅了。
    Results saved to /home/qh/workspace/train/ultralytics-v8
    Predict:         yolo task=detect mode=predict model=yolov8n.onnx -WARNING ⚠️ not yet supported for YOLOv8 exported models
    Validate:        yolo task=detect mode=val model=yolov8n.onnx -WARNING ⚠️ not yet supported for YOLOv8 exported models
    

参考

  1. https://github.com/ultralytics/ultralytics
  2. https://github.com/Tencent/ncnn
  3. https://github.com/FeiGeChuanShu/ncnn-android-yolov8
  4. https://github.com/Digital2Slave/ncnn-android-yolov8-seg/wiki/Convert-yolov8-model-to-ncnn-model
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 NCNN, 实现 yolov8 的相关文章

随机推荐

  • 手把手教你用Python分析微信聊天内容

    在开始之前 先简单说下我为何会写这篇文章 为了开发新客户 领导安排公司的客服们加入了很多的微信群 在群内收集目标客户的联系方式 然而她们收集客户信息的方式非常的原始 在微信群内翻看群聊记录 gt 寻找客户发出的电话号码 gt 复制 gt 打
  • ubuntu 环境变量

    一 设置环境变量三种方法 a 临时变量 直接在终端命令框输入 xff1a export PATH 61 PATH usr local arm gcc linaro 4 9 4 2017 01 x86 64 arm linux gnueabi
  • iOS 高德地图路线规划

    最近做了高德地图路线规划 xff0c 把自己不熟的点记录一下 xff1a 1 地图不显示当前位置精准圈 xff1a 设置mapview的 customizeUserLocationAccuracyCircleRepresentation 属
  • 1.点亮1个led程序分析(汇编)

    最终目标 点亮led灯 1 xff1a 通过原理图 xff0c 确定nLED 1的引脚关系 GPF4 2 xff1a 查看S3C2440手册 xff0c 找到控制GPF4引脚的方法 GPFCON 配置寄存器 GPFDAT 数据寄存器 3 x
  • 高效求List差集

    List求差集问题 xff0c 解决思路使用了List的结构特性 先上代码 xff0c 再分析 List list1 61 new LinkedList List list2 61 new LinkedList List list3 61
  • UIImageView 和 UIView的基础使用

    1 UIView 的基本属性 设置位置 UIView view 61 UIView alloc initWithFrame CGRectMake 100 100 100 100 self window addSubview view 设置背
  • MAMP PHP5.6、PHP7.4.20 …… 安装redis、mongodb等扩展

    一 下载php对应版本源码 xff1a https www php net releases 解压后放入 对应版本 下面 Application MAMP bin php php5 6 10 include php 二 下载扩展包 http
  • B-Code For 1 Codeforces 768【递归】 好题!

    题意 xff1a 起初 xff0c 序列中仅有数n if n 61 0 amp amp n 61 1 在原来的位置补充3个元素n 2 n 2 n 2 直至该序列用仅有0和1 现在问区间 l r 有多少个1 思路 xff1a 一开始想用vec
  • AtCoder褐名记

    今年四月份开始参加AtCoder比赛 xff0c 至今参加了9次 在第9次结束后 xff0c 涨了一级 xff0c 从最低级的灰名涨到倒数第二级的褐名 相对于我这样的新手而言 xff0c AtCoder比TopCoder和Codeforce
  • 基于FFmpeg H264 + G711A 音视频裸流合并 MP4文件 ( G711A 转 AAC)

    由于 FFmpeg 只支持H264 43 AAC的mp4封装格式的 xff0c 并不支持H264 43 G711的mp4封装格式 所以需要将G711a转码成AAC格式的 然后封装成mp4文件 xff0c 但网上有说 通过修改movenc c
  • YOLOV3 网络结构学习笔记

    注 xff1a 本文非原创 xff0c 文章内容都是引用以下文章中 xff0c 本文只是记录学习笔记 yolo系列之yolo v3 深度解析 木盏的博客 CSDN博客 yolo3 YOLO v3算法详解 Atlas 的博客 CSDN博客 y
  • 基于人脸特征点实现疲劳检测

    为了有效监测驾驶员是否疲劳驾驶 避免交通事故的发生 提出了一种利用人脸特征点进行实时疲劳驾驶检测的新方法 对驾驶员驾驶时的面部图像进行实时监控 首先检测人脸 并利用ERT算法定位人脸特征点 然后根据人脸眼睛区域的特征点坐标信息计算眼睛纵横比
  • 基于 HPSocket , 实现 socket 通讯

    HPSocket HP Socket 是一套通用的高性能 TCP UDP HTTP 通信框架 xff0c 包含服务端组件 客户端组件和 Agent 组件 xff0c 广泛适用于各种不同应用场景的 TCP UDP HTTP 通信系统 xff0
  • windows 基于 MediaPipe 实现 PoseTracking

    MediaPipe是用于构建跨平台多模态应用ML管道的框架 xff0c 其包括快速ML推理 xff0c 经典计算机视觉和媒体内容处理 xff08 如视频解码 xff09 在2019年6月举行的CVPR大会 xff0c MeidaPipe正式
  • windows 基于 MediaPipe 实现 HandTracking

    OverView 感知手的形状和运动的能力可能是改善跨各种技术领域和平台的用户体验的重要组成部分 例如 xff0c 它可以构成手语理解和手势控制的基础 xff0c 还可以在增强现实中将数字内容和信息叠加在物理世界之上 虽然对人们来说很自然
  • DeepStream 部署 RTSP + scaled-yolov4 (tensorrtx)

    DeepStream应用程序将深度神经网络和其他复杂的处理任务引入到流处理管道中 xff0c 以实现对视频和其他传感器数据的近实时分析 从这些传感器中提取有意义的见解为提高运营效率和安全性创造了机会 例如 xff0c 摄像头是当前使用最多的
  • DeepStream 多路拉取RTSP视频流

    上一篇介绍DeepStream 如何集成Yolov4模型 xff0c 那么本篇介绍下如何实现读取多路RTSP 代码 主要代码参考 https github com belarbi2733 deepstream rtspsrc yolo详细代
  • 编码格式(关于utf-8,gb2312,gbk,big5等)

    计算机数据是以二进制的方式来存储 xff0c 符号代表文字 那么二进制数据表示的模式就是编码 xff0c 跟电报的加密解密是一个道理 xff0c 那么如何将这些数据转化成有效字符 xff0c 这就涉及到了编码格式 xff0c 一般常见的编码
  • Ubuntu配置桥接网络

    第一步 xff1a 点击虚拟机 xff0c 点击设置 第二步 xff1a 点击网络适配器 xff0c 选中桥接模式并确定 第三步 xff1a 点击编辑 xff0c 打开虚拟网络编辑器 xff0c 选中桥接模式 点击 网络属性 找到描述 xf
  • 基于 NCNN, 实现 yolov8

    记录下 基于 ncnn 实现 yolov8 的全部过程 修改 ultralytics nn modules py class Detect forward 和 class C2f forward span class token keywo