pt转onnx转ncnn模型(yolov8部署安卓)

在部署中遇到了若干问题,在此进行记录。。

首先pt转onnx模型

笔者使用的脚本代码进行转换(比较推荐,否则转换ncnn可能有问题)

from ultralytics import YOLO
model = YOLO("./bestpc.pt")
success = model.export(format ='onnx',simplify=True,opset=12)

转之前要进行对/ultralytics/nn/modules.py中的代码进行修改

找到C2f下的forward函数这样修改

    def forward(self, x):
        # 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))
找到Detect下的forward函数这样修改(yolov8——detect这样修改,分割项目不是)
    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
        pred = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2).permute(0, 2, 1)
        return pred

修改完毕进行转换得到onnx模型

注意:!!我使用的yolov8代码的版本是ultralytics-8.0.50,使用较新的版本会导致模型转换后有很多问题,亲自踩坑

然后就是onnx转ncnn

好多教程都是使用一键转换的网站,但这个网站失效了,因此笔者配置onnx转换ncnn的环境进行转换,问题记录。。
 

# 准备基础环境
sudo apt install build-essential libopencv-dev cmake

# 编译安装protobuf依赖库
git clone https://github.com/protocolbuffers/protobuf.git  # 安装源文件
cd protobuf
git submodule update --init --recursive  # clone子模块的依赖
./autogen.sh  # 执行自动生成的shell脚本
./configure  # 配置文件shell脚本
make  # 编译
make install  # 编译安装
sudo ldconfig  # 刷新

编译有问题多换换版本

1.配置NCNN库必要依赖

sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev


2.编译NCNN
执行下列命令

git clone https://github.com/Tencent/ncnn.git
 
cd ncnn
 
git submodule update --init
 
mkdir build
 
cd build
 
cmake ..
 
make -j8
 
make install

sudo ldconfig  # 刷新


编译完成进入build文件夹在这里可以实现转换模型 (找到onnx2ncnn可执行文件)

./onnx2ncnn  my.onnx my.param my.bin

换入你的安卓项目就大功告成了!

### YOLOv8 部署至 Android 设备并实现图片选择 #### 准备工作 为了能够在安卓设备上运行YOLOv8模型,需先完成一系列准备工作。这包括但不限于下载必要的开发环境以及换所需的模型文件。 - **安装 Android Studio**:按照官方指南[^1],确保已正确配置好Android Studio及其相关组件。 - **获取预训练模型**:从指定资源处获得YOLOv8的`.pt`格式预训练权重,并通过适当工具将其化为ONNX格式以便后续处理[^2]。 #### 换与优化模型 一旦拥有了适用于移动平台的模型版本,则需要进一步调整以适应目标硬件特性: - 使用 `torch.onnx.export()` 方法将PyTorch模型导出为ONNX格式。 - 利用NCNN框架提供的脚本或API接口继续把ONNX模型成专用于该库加载的形式——即`.param`和`.bin`两个部分组成的结构化表示形式[^3]。 #### 创建项目并与 NCNN 整合 创建一个新的Android工程,在此过程中集成来自第三方开源项目的示例代码作为基础模板来加速开发进度。具体操作如下所示: - 参考GitHub仓库中的实例,克隆相应分支并将核心逻辑迁移到个人项目里; - 修改CMakeLists.txt文件引入外部依赖项(如OpenCV),同时设置编译选项使能特定功能模块; - 将之前准备好的参数文件放置于assets目录下方便读取访问。 #### 实现图像选取机制 为了让应用程序能够接收用户输入的照片数据源,可以采用内置Intent服务简化流程设计: ```java // 启动相册界面供挑选照片 Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, REQUEST_CODE_SELECT_IMAGE); @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == RESULT_OK && null != data){ Uri selectedImageUri = data.getData(); try{ InputStream inputStream = getContentResolver().openInputStream(selectedImageUri); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); // 对bitmap对象执行检测算法... } catch(FileNotFoundException e){ Log.e(TAG,"Failed to open image file.",e); } } } ``` 上述代码片段展示了如何利用系统级图库浏览器让用户自行选定待分析的目标影像素材,并返回其URI路径给调用方做下一步解析处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值