yolov8seg模型转onnx转ncnn

YOLOv8 模型转换为 ONNX 格式并进行优化与验证 本文介绍了如何将YOLOv8模型从PyTorch格式转换为ONNX格式,并进行优化和验证。 阅读详情
AI摘要

文章讲述了如何将Yolov8模型从PyTorch转换为ONNX格式,然后进一步转化为NCNN以供使用。在转换过程中,遇到了ONNX不支持的chunk操作问题,通过修改block.py和head.py中的forward函数解决了此问题。转换后的NCNN模型在测试时表现出色,尽管精度可能略有下降。,

yolov8是yolo的最新版本,可做图像分类,目标检测,实例分割,姿态估计。
主页地址

这里测试一个分割模型。
模型如下
请添加图片描述
选yolov8n-seg模型,转成onnx,再转ncnn测试。
yolov8s-seg的ncnn版可以直接用这个

如果用python版的onnx,可以直接用notebook转,然后下载。
python版onnx代码参考

但是用notebook版本的onnx转ncnn之后,测试图片时会报错。
可以看一下转出来的yolov8n-seg.param,里面有很多的MemoryData,不够clean.

请添加图片描述

所以需要修改一些地方。(参考资料)

查了一些资料都说是要修改modules.py.
请添加图片描述
然而本地并没有modules.py,而是找到了modules文件夹
在这里插入图片描述
那么只需要在这些文件里面找到3个class并做相同的修改就可以了。
于是需要修改block.py和head.py两个文件。

要修改3个forward函数。

block.py修改:

class C2f(nn.Module):
   ...
    def forward(self, x):
        """Forward pass through C2f layer."""
        #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:, ...]]      #onnx不支持chunk操作?
        x.extend(m(x[-1]) for m in self.m)
        x.pop(1)
        return self.cv2(torch.cat(x, 1))

head.py中修改了Detect和Segment class.

class Detect(nn.Module):
    ...
    def forward(self, x):
        """Concatenates and returns predicted bounding boxes and class probabilities."""
        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)  #精简为这2句
        return pred

class Segment(Detect):
    ...
    def forward(self, x):
        """Return model outputs and mask coefficients if training, otherwise return outputs and mask coefficients."""
        p = self.proto(x[0])  # mask protos
        bs = p.shape[0]  # batch size

        mc = torch.cat([self.cv4[i](x[i]).view(bs, self.nm, -1) for i in range(self.nl)], 2)  # mask coefficients
        x = self.detect(self, x)
        if self.training:
            return x, mc, p
        #return (torch.cat([x, mc], 1), p) if self.export else (torch.cat([x[0], mc], 1), (x[1], mc, p))
       return (torch.cat([x, mc], 1).permute(0, 2, 1), p.view(bs, self.nm, -1)) if self.export else (
            torch.cat([x[0], mc], 1), (x[1], mc, p))

改好了之后用如下代码export onnx文件, onnx文件会导出到和pt文件同一文件夹。

from ultralytics import YOLO

# load model
model = YOLO("pt路径/yolov8n-seg.pt")

# Export model
success = model.export(format="onnx", opset=12, simplify=True)

转好onnx之后,再把onnx转成ncnn,用onnx2ncnn命令(在build ncnn时会有这个命令)
onnx2ncnn一般在ncnn/build/tools/onnx文件夹下。

$ ./onnx2ncnn onnx路径/yolov8n-seg.onnx 想保存的路径/yolov8n-seg.param 想保存的路径/yolov8n-seg.bin

对比一下修改前和修改后导出的参数yolov8n-seg.param。
可以看到clean了很多,修改前有MemoryData, 而修改之后没有了。
请添加图片描述

下面来测试一下ncnn模型,
可以用这个代码,
需要修改几个地方:

    ncnn::Mat out;
    //ex.extract("output", out);
    ex.extract("output0", out);

    ncnn::Mat mask_proto;
    //ex.extract("seg", mask_proto);
    ex.extract("output1", mask_proto);

再改load_param和load_model的路径。

CMakeList.txt

cmake_minimum_required(VERSION 3.23)
project(seg_detect_ncnn)

set(CMAKE_CXX_STANDARD 14)

string(APPEND CMAKE_CXX_FLAGS " -Wall -Wextra")
string(APPEND CMAKE_C_FLAGS " -Wall -Wextra")

# 调用opencv
find_package(OpenCV REQUIRED)
# 调用openmp
FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# 包含ncnn的头文件
include_directories(ncnn/build/install/include/ncnn)
# 包含ncnn的链接文件
link_directories(ncnn/build/install/lib)
# 生成可执行文件
add_executable(yolo_seg_ncnn yolo_seg.cpp)
# 链接ncnn静态链接库
target_link_libraries(yolo_seg_ncnn
        ncnn
        ${OpenCV_LIBS}
        ${ONNXRUNTIME_LIB}
        ncnn/build/install/lib/libncnn.a)

然后就可以用啦(图片来自COCO数据集)

请添加图片描述

下面是直接用yolov8n-seg.pt预测出的结果,
可以看到修改了之后效果是差了一点的(其中一个dog的框没预测出来)。

请添加图片描述

yolov8seg onnx推理 80+40。 阅读详情

相关推荐

YOLOv8-Pose NCNN安卓部署

在做YOLOv8-Pose NCNN安卓部署的时候,在github上发现了https://github.com/eecn/ncnn-android-yolov8-pose已经有大佬实现了这一操,并且也给出了它是如何导出ncnn模型的;

gaoxukkk888的博客 2281

YOLOV8模型转换-ONNX-RKNN

文件中包含内容: 使用平台为RK3588 (1)step1:pt模型转onnx (2)step2: onnx调用做推理 (3)step3: onnx转rknn模型 (4)step4:rknn模型调用

YOLO安卓端部署实战:ONNX+NCNN本地推理全流程

YOLO目标检测模型在移动端的本地化部署,是实现低延迟、高隐私、离线可用智能视觉应用的核心技术。其本质是将PyTorch训练模型通过标准化中间表示(ONNX)转换为轻量级推理格式,并在安卓平台借助NCNN等原生推理引擎完成C++层高效执行。该技术绕过云端依赖,显著提升响应实时性与系统鲁棒性,广泛应用于工业巡检、社区治理、农业识别等边缘场景。本文聚焦YOLOv5/v8/v10系列模型,深入解析ONNX导出避坑要点、NCNN转换关键参数、JNI桥接工程实践及分割头支持细节,覆盖从模型瘦身、动态输入适配到真机性能

590

YOLOv8目标检测实战:ONNX模型转换及TensorRT部署

PyTorch版的YOLOv8是先进的高性能实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。ONNX (Open Neural Network Exchange) 作为一个开放的网络模型中间表示(IR)格式,提供了跨框架兼容性。可以方便不同的框架轻松地交换模型,有助于框架之间的互操作性。本课程讲述如何对YOLOv8目标检测的PyTorch权重文件转成ONNX格式并进行TensorRT加速部署。相比与直接使用TensorRT API构建推理引擎,本方法更具灵活性,可用于YOLOv8网络架构修改后的模型部署。课程内容包括:YOLOv8目标检测的PyTorch权重文件转成ONNX格式,再转成TensorRT 推理引擎支持在GPU上端到端TensorRT加速部署,包括预处理(图像resize, 归一化)、网络推理、后处理(非极大抑制) 均在GPU上执行支持FP16加速提供C++和Python的TensorRT加速命令接口分别在Windows和Ubuntu系统上做YOLOv8的ONNX转换及TensorRT部署演示支持图片、图片文件夹、视频文件的TensorRT的加速推理提供YOLOv8的ONNX转换及TensorRT加速部署代码和代码解析文档实测推理速度提高2倍以上。课程内容包括:原理篇(YOLOv8网络架构与组件、TensorRT基础、ONNX基础、CUDA编程方法)实践篇(Windows和Ubuntu系统上的ONNX模型转换及TensorRT加速部署流程演示)代码解析篇(YOLOv8的ONNX模型转换及TensorRT加速的代码解析) 

避坑指南:YOLOv8实例分割模型在Android端部署全流程(从训练到App集成)

本文详细介绍了YOLOv8实例分割模型在Android端部署的全流程,包括模型优化、框架选型、工程集成和性能调优等关键步骤。针对移动端特有的内存限制和计算资源紧张问题,提供了量化训练、剪枝、多线程推理等实用解决方案,帮助开发者高效实现实时实例分割应用。

weixin_30654419的博客 627

Android 集成 ncnn-YOLOv8-seg 实战:从零构建移动端智能人像抠图应用

本文详细介绍了如何在Android平台上集成ncnn-YOLOv8-seg模型,构建高效的移动端智能人像抠图应用。通过ncnn框架的深度优化和YOLOv8-seg的实例分割能力,实现了在千元机上15FPS以上的实时性能。文章涵盖了环境配置、模型转换、核心代码优化及性能调优等实战经验,特别适合需要开发移动端AI应用的工程师参考。

weixin_42525289的博客 350

YOLOV8物体检测实战精讲

《YOLOV8物体检测实战》课程能够让学员用最短的时间,零起步完成自己的物体检测项目!先从零开始搭建运行环境;然后演示各种检测效果;最后标注自己的数据,训练自己的项目!全流程一气呵成,短平快即学即用!

57、Yolov8-seg实例分割部署NCNN、MNN、ONNX、OpenVINO、OAK,RK3588平台上

基本思想:部署yolov8-seg到mnn、openvino、oak平台上,仅仅做记录。一、是用官方模型转onnx首先,然后进行sim一下,是用模型日期2023-04-22。

sxj731533730 6069

从0开始的视觉研究生涯(6)YOLOv8-seg实战应用NCNN加速详解(进阶,多线程、Int8量化)

非常麻烦,做一个经验总结,以后希望不会再碰了,都是好的工具,但是在商业化过程中,通常不愿意升级芯片会加大设备成本,此外数据也会有很多问题,这导致再怎么加速效果都不满足,当然做demo还是够用了,哎,资本家。

fisherisfish的博客 4038

安卓端YOLOv8模型NCNN部署实战:从PyTorch到移动端实时检测

目标检测是计算机视觉的核心任务之一,旨在识别图像中的物体并定位其位置。其主流实现依赖于深度学习模型,通过卷积神经网络提取特征并进行分类与回归。在移动端或嵌入式设备上部署这类模型,面临算力、内存和功耗的严格限制,因此需要高效的推理框架进行优化。NCNN作为一款专为移动端优化的高性能神经网络前向计算框架,通过极致的手写汇编优化和精简的设计,显著提升了模型在ARM架构设备上的运行效率。结合当前主流且平衡度优秀的YOLOv8检测模型,能够为智能巡检、移动安防等需要离线、实时识别的应用场景提供可靠的端侧解决方案。本文

weixin_29168153的博客 318

YOLOv8安卓端NCNN部署实战:从模型转换到实时目标检测应用

目标检测是计算机视觉的核心任务之一,旨在识别图像中的物体并定位其位置。其原理通常基于深度卷积神经网络,通过特征提取与回归预测,实现端到端的识别。这项技术的价值在于将AI能力从云端下沉到边缘,赋能移动与嵌入式设备,实现低延迟、高隐私的实时感知。应用场景广泛,涵盖智能安防、移动AR、工业质检及智能相册等。本文聚焦于将前沿的YOLOv8检测模型,通过NCNN这一为移动端极致优化的推理引擎,部署到安卓平台,并深入探讨了模型转换、性能优化等工程实践,为移动端AI应用开发提供了一套完整的解决方案。

weixin_29191669的博客 277

Using Yolov8 segment ncnn model on Ubuntu18.04

convert yolov8 segment model to ncnn model and using c++ build test program.

Ant for life. 1290

yolov5-seg C++部署实战:基于ncnn的实例分割与模型转换全流程

在边缘计算与嵌入式视觉应用中,深度学习模型的推理部署一直是工程落地的关键挑战。PyTorch训练出的模型如何高效运行在C++环境?这需要借助高性能推理框架完成模型转换与加速。ncnn作为腾讯开源的轻量级神经网络前向计算框架,凭借其跨平台、低依赖的特性,成为移动端与物联网设备上部署目标检测与实例分割模型的优选方案。实例分割不同于语义分割,它同时定位目标并区分个体,在工业质检、机器人抓取等场景中具有重要价值。本文从模型部署的基本概念出发,系统讲解yolov5-seg从PyTorch权重导出ONNX,再通过onn

weixin_32349093的博客 251

AIGlasses_for_navigation轻量化演进:YOLOv8n-seg模型在移动端部署尝试

本文介绍了如何在星图GPU平台上自动化部署AIGlasses_for_navigation镜像,实现轻量化YOLOv8n-seg模型在移动端的快速部署。该镜像的核心应用场景是为视障人士提供实时导航辅助,通过AI模型精准识别盲道、斑马线等关键道路信息,并转化为语音或触觉反馈。

weixin_35761094的博客 1050

YOLOv8安卓端NCNN部署实战:从模型转换到性能调优全解析

目标检测是计算机视觉的核心任务之一,旨在识别图像中的物体并定位其位置。其原理通常基于深度卷积神经网络,通过骨干网络提取特征,再经检测头输出边界框与类别。这项技术的价值在于为机器赋予“视觉理解”能力,是实现智能化应用的关键。在移动端部署目标检测模型,能直接赋能智能手机、嵌入式设备等,催生出如实时翻译、AR互动、智能安防等丰富应用场景。本文聚焦于将先进的YOLOv8模型,通过专为移动端优化的NCNN推理框架部署到安卓平台,并深入探讨了模型转换、工程集成等关键技术环节,特别是针对Vulkan GPU加速与后处理优

weixin_32770423的博客 230

YOLOv5实例分割ncnn C++部署实战指南

深度学习模型从训练到生产环境,往往面临性能、依赖和集成等多重挑战。轻量级推理框架ncnn凭借对移动端和嵌入式平台的优秀优化,成为端侧C++部署的主流选择。YOLOv5实例分割在检测框基础上新增掩膜分支,通过原型掩膜与系数加权合成,实现像素级目标轮廓输出,为工业检测、遥感分析等场景提供更精细的量化依据。将Python推理迁移至C++,不仅可消除跨语言调用的拷贝开销,还能与现有业务系统无缝整合。本文围绕YOLOv5实例分割的ncnn部署,系统梳理了ONNX模型转换、固定尺寸导出、C++推理代码编写以及NMS与掩

weixin_29178069的博客 219

腾讯神经网络推理框架NCNN试玩儿

ncnn 是腾讯开源的神经网络推理框架,官方仓库有详细介绍: https://github.com/Tencent/ncnn.git 下面在普通PC的ubuntu18.04环境上搭建环境,运行一把。 1.下载代码: git clone https://github.com/Tencent/ncnn.git 2.配置环境: cd ncnn mkdir build cd build cmake -DCMAKE_BUILD_TYPE=relwithdebinfo -DNCNN_OPENMP=

tugouxp的专栏 3178

C++实战:使用ncnn部署YOLOv5实例分割模型全流程解析

实例分割是计算机视觉中的核心任务,在移动端和嵌入式设备上高效部署成为工程难点。YOLOv5-seg结合目标检测与像素级掩码生成,ncnn作为轻量级推理框架,针对ARM平台深度优化,为C++环境下的实时推理提供方案。本文从模型转换链路出发,讲解将.pt转换为.param/.bin的步骤,并深入解析letterbox预处理、输出结构解析、NMS与mask后处理等关键技术细节,帮助开发者在资源受限场景下实现高效部署。

weixin_29053577的博客 233
上一篇: leetcode 1035. Uncrossed Lines(不交叉的线)
下一篇: yolov8 pycharm运行(predict,不用command line)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值