yolov7 ncnn安卓部署(pt->onnx->ncnn)

本文详细介绍了YoloV7在安卓平台上的部署过程,包括从PyTorch模型转换到ONNX,再进一步转换为NCNN格式的方法,并分享了解决过程中遇到的问题及经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0-前言

网上有很多yolov5在安卓上的部署,yolov7的比较少。因为需要替换自己的模型,把踩过的坑记录一下。

流程:pt->onnx->ncnn。

1-yolov7(pt->onnx)

下载代码和权重,这里用的是tiny。

代码用main分支的,权重手动下载release里的。

(PS:测试时如果出现‘Command ‘git tag’ returned non-zero exit status 128.’报错就手动下载权重,参考资料4)

运行

python export.py yolov7-tiny.pt --simplify

运行时要加simplify,不然onnx转ncnn会有不支持的算子。

2-ncnn(onnx->ncnn)

这部分当然可以编译protobuf和ncnn的代码,自行百度,但是太麻烦。

推荐一个网站,可以直接转换,太良心了。

https://convertmodel.com/

要把三个勾都选上。

在这里插入图片描述

3-安卓部署

下载代码:https://github.com/xiang-wuu/ncnn-android-yolov7

按照readme的要求下载ncnn-YYYYMMDD-android-vulkan.zip和opencv-mobile-XYZ-android.zip。

我用的是ncnn-20210525-android-vulkan和opencv-mobile-4.5.1-android。

打开Android Studio启动项目,sdk路径应该能获取到,但相机的ndk路径可能会找不到,在local.properties文件中修改ndk.dir,你可以在AS中下载,也可以手动下载安装包,r21e对应21.4.7075529,修改下路径即可。

4-编译

编译成功即可运行,打包apk很简单自行百度。

5.使用自己的模型

这份代码使用的yolov7权重输出有点不一样。

这是作者的模型

在这里插入图片描述

这是我的模型

在这里插入图片描述

他的后处理是在卷积层后,而官方的权重在三个输出头后面又接了reshape和permute。

我一开始仿照ncnn官方代码yolov7的例子,取的是permute后的输出,结果闪退且没有框。

他们的后处理generate_proposals有些不同,最简单的办法就是也取卷积的输出。

在ncnn-android-yolov7/app/src/main/jni/yolo.cpp的Yolo::detect修改:
in0->images
out0->259
out1->279
out2->299

其他部分不用改,重新编译就能运行。

(PS:对比了一下他的模型是fp16的,但好像代码里没有设置opt.use_fp16_arithmetic = true,暂时不清楚哦)

参考资料(排名不分先后)

  1. https://github.com/WongKinYiu/yolov7

  2. https://github.com/xiang-wuu/ncnn-android-yolov7

  3. https://convertmodel.com/

  4. https://blog.csdn.net/m0_50837237/article/details/126055947

### 修改YOLOv8模型以适配NCNN框架 在将YOLOv8模型部署NCNN框架之前,需要对模型进行一些修改和优化。首先,在导出YOLOv8模型为ONNX格式之前,需要修改两个关键文件:`export.py` 和 `yolo.py`。 #### 修改 `export.py` 1. **指定输入尺寸**:确保模型的输入尺寸与目标设备上的推理需求一致。 2. **启用优化选项**:在导出过程中启用优化选项,以便生成更高效的ONNX模型。 ```python from ultralytics import YOLO model = YOLO('yolov8n.pt') model.export(format='onnx', optimize=True, imgsz=[640, 640]) # 指定输入尺寸为640x640 ``` #### 修改 `yolo.py` 1. **调整输出层**:根据NCNN的要求,可能需要调整模型的输出层,使其符合NCNN的输入要求。 2. **简化模型结构**:去除不必要的模块,简化模型结构,以便更好地适配NCNN。 ### 导出YOLOv8模型为ONNX格式 完成上述修改后,可以使用以下代码将YOLOv8模型导出为ONNX格式: ```python from ultralytics import YOLO model = YOLO('yolov8n.pt') model.export(format='onnx', optimize=True) # 导出为ONNX格式并启用优化 ``` ### 转换ONNX模型为NCNN模型 接下来,需要将ONNX模型转换为NCNN支持的模型格式。这一步通常涉及以下几个步骤: 1. **安装NCNN工具链**:确保已经安装了NCNN的开发工具链,包括`onnx2ncnn`转换工具。 2. **运行转换工具**:使用`onnx2ncnn`工具将ONNX模型转换为NCNN模型。 ```bash onnx2ncnn yolov8n.onnx model.param model.bin ``` 3. **验证转换结果**:检查生成的`.param`和`.bin`文件是否正确,并可以在NCNN环境中加载和运行。 ### 部署NCNN模型到Android设备 1. **集成NCNN库**:在Android项目中集成NCNN库,确保已经配置好NDK和CMake。 2. **加载模型**:在应用中加载转换后的NCNN模型,并设置相应的输入输出缓冲区。 3. **执行推理**:调用NCNN的API进行推理,并处理返回的结果。 ### 示例代码 以下是一个简单的示例代码,展示如何在Android应用中使用NCNN进行推理: ```cpp #include <ncnn/net.h> // 加载模型 ncnn::Net net; net.load_param("model.param"); net.load_model("model.bin"); // 创建输入图像 ncnn::Mat in = ncnn::Mat::from_pixels_resize(image_data, ncnn::Mat::PIXEL_RGB, image_width, image_height, target_width, target_height); // 设置输入 ncnn::Extractor ex = net.create_extractor(); ex.set_input("input", in); // 执行推理 ncnn::Mat out; ex.extract("output", out); // 处理输出 float* output_data = out.data; ``` 通过以上步骤,您可以成功将YOLOv8模型部署NCNN框架,并在Android设备上运行。[^3]
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值