基于NCNN将YOLOX部署到Android

1 利用已有的yolox_nanoyolox_tiny模型进行部署

1.1 准备Android项目文件

本机为win系统,所以我直接下载压缩文件ncnn-android-yolox.zip,解压后我存放于D:\AndroidStudioProjects\ncnn-android-yolox
在这里插入图片描述

我下载的最新版本,解压后放置在D:\AndroidStudioProjects\ncnn-android-yolox\app\src\main\jni下。
在这里插入图片描述

我随意下了个版本,解压后也放置在D:\AndroidStudioProjects\ncnn-android-yolox\app\src\main\jni下。
在这里插入图片描述

D:\AndroidStudioProjects\ncnn-android-yolox\app\src\main\jni路径下的文件展示如下:
在这里插入图片描述

1.2 安装和使用Android Studio

需要提前安装JDKAndroid SDK

JDK的安装参考:JDK 安装与环境变量配置(Win10详细版)

Android SDK的安装参考:【Windows系统】Android Studio安装过程遇到SDK tools directory is missing问题

Android Studio下载地址:https://developer.android.google.cn/studio/,安装可参考:如何安装Android Studio


Android Studio安装完毕后打开项目文件D:\AndroidStudioProjects\ncnn-android-yolox

  • 设置配置:

File->Settings->Appearance & Behavior ->System Settings->Android SDK

SDK Platform选择你的安卓手机的版本

SDK Tools选中DNKCMake

注意:DNK版本别选太高,否则可能出现No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi问题,我最后选用的是21.3的版本;CMake选用3.10.2版本,否则会出现诸如- CMake '3.22.1' found in SDK did not match requested version '3.10.2'.的问题。
在这里插入图片描述

  • 修改CMakeLists.txt文件,OpencvNCNN的路径改为你自己的
    在这里插入图片描述

1.3 apk部署到手机

手机打开开发者模式,并且开启USB调试和USB安装选项(可自行百度自己手机型号怎么开启)。使用USB连接手机选择传输文件(不要选仅充电),在Android Studio依次进行buildrun(看下图),这时手机会弹出窗口提示是否允许安装apk,选择允许,这样就将apk部署到手机上了。
在这里插入图片描述

2 使用自己训练好的模型进行部署

在打通了链路后,就可以尝试使用自己的模型进行部署了。

2.1 训练得到pth文件

YOLOX训练自己的数据可去网上进行检索,有很多教程。我自己训练了yolox_nano.pth,其中训练的过程中我有遇到一些奇怪的问题,记录如下,yolox_voc_nano.py的代码中:

class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.num_classes = 4 # 自己数据集的类别数量

        self.data_num_workers = 0 # 不然会报错OSError: [WinError 1455] 页面文件太小,无法完成操作

        self.depth = 0.33
        self.width = 0.25
        self.input_size = (416, 416)
        self.random_size = (10, 20)
        self.mosaic_scale = (0.5, 1.5)
        self.test_size = (416, 416)
        self.max_epoch = 100
        # self.mosaic_prob = 0.5 // 这个不注释后就会出现AttributeError: 'int' object has no attribute 'numel'
        self.enable_mixup = False
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
        """
        ......
        """

2.2 pthonnx

使用官方提供的export_onnx.py进行转换

在这里插入图片描述

2.3 onnx转换为NCNN框架的数据

2.3.1 配置ncnn

ncnn的配置网上有很多都是从头开始构建编译,其实官方有编译好一些版本的ncnn,直接下载下来就行。官方链接:https://github.com/Tencent/ncnn

点击releases,我用的vs2019shared是动态链接版本,我下载了shared版本的。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

解压后随便存放在哪个盘都行,记得在环境变量的path中把bin路径添加进去,并且由于我opencv版本使用的x64的关系,所以我添加的路径为:D:\ncnn-20221128-windows-vs2019-shared\x64\bin

2.3.2 onnx转换为.bin.param文件

先把上面得到的yolox_nano.onnx复制到ncnn目录(D:\ncnn-20221128-windows-vs2019-shared\x64\bin)下,现在需要将onnx格式的模型转成ncnn能够加载的.bin.param
【这里注意转换得到的名字yolox-nano.paramyolox-nano.bin,不要写成yolox_nano.paramyolox_nano.bin不然后面会出现软件闪退】

cd D:\ncnn-20221128-windows-vs2019-shared\x64\bin
onnx2ncnn.exe yolox_nano.onnx yolox-nano.param yolox-nano.bin

会出现下面的警告,这是因为ncnn不支持Focus模块,但没关系

Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !

2.3.3 调整.param文件

因为ncnn不支持Focus模块,所以需要对yolox-nano.param进行调整,具体操作为:将.paramInput后到第一层ConvolutionSplit层、Crop层和Concat层总共10层替换为1层YoloV5Focus

7767517
295 328
Input            images                   0 1 images
Split            splitncnn_input0         1 4 images images_splitncnn_0 images_splitncnn_1 images_splitncnn_2 images_splitncnn_3
Crop             Slice_4                  1 1 images_splitncnn_3 647 -23309=1,0 -23310=1,2147483647 -23311=1,1
Crop             Slice_9                  1 1 647 652 -23309=1,0 -23310=1,2147483647 -23311=1,2
Crop             Slice_14                 1 1 images_splitncnn_2 657 -23309=1,0 -23310=1,2147483647 -23311=1,1
Crop             Slice_19                 1 1 657 662 -23309=1,1 -23310=1,2147483647 -23311=1,2
Crop             Slice_24                 1 1 images_splitncnn_1 667 -23309=1,1 -23310=1,2147483647 -23311=1,1
Crop             Slice_29                 1 1 667 672 -23309=1,0 -23310=1,2147483647 -23311=1,2
Crop             Slice_34                 1 1 images_splitncnn_0 677 -23309=1,1 -23310=1,2147483647 -23311=1,1
Crop             Slice_39                 1 1 677 682 -23309=1,1 -23310=1,2147483647 -23311=1,2
Concat           Concat_40                4 1 652 672 662 682 683 0=0
Convolution      Conv_41                  1 1 683 1177 0=16 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1728
Swish            Mul_43                   1 1 1177 687
ConvolutionDepthWise Conv_44                  1 1 687 1180 0=16 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=144 7=16
Swish            Mul_46                   1 1 1180 691
Convolution      Conv_47                  1 1 691 1183 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=512
......

在这里插入图片描述

  • 修改后的.param
7767517
286 328
Input                    images                   0 1 images
YoloV5Focus              focus                    1 1 images 683
Convolution              Conv_41                  1 1 683 1177 0=16 1=3 4=1 5=1 6=1728
Swish                    Mul_43                   1 1 1177 687
ConvolutionDepthWise     Conv_44                  1 1 687 1180 0=16 1=3 3=2 4=1 5=1 6=144 7=16
Swish                    Mul_46                   1 1 1180 691
Convolution              Conv_47                  1 1 691 1183 0=32 1=1 5=1 6=512
......

在这里插入图片描述
使用netron查看结构图:
在这里插入图片描述

2.3.4 对算子量化

使用ncnnoptimize.exe进行模型的量化。基于修改后的.param.bin文件,在终端输入:

ncnnoptimize.exe yolox-nano.param yolox-nano.bin yolox-nano.param yolox-nano.bin 65536

量化后的.param文件第2行的数字会自动调整为:
在这里插入图片描述

2.4 使用自己的模型数据进行部署

  • 将量化后得到的.param.bin文件复制到D:\AndroidStudioProjects\ncnn-android-yolox\app\src\main\assets路径下,替代掉原有的文件
  • 修改yolox.cpp中的class_names为自己的类别名
  • 然后再进行上方的1.3步骤(apk部署到手机)就可将自己的模型部署到手机上了

😱如果出现手机有图像但是并没有检测框的情况,请进行下面操作再重新进行1.3步骤

// yolox.cpp
	// so for 0-255 input image, rgb_mean should multiply 255 and norm should div by std.
    // new release of yolox has deleted this preprocess,if you are using new release please don't use this preprocess.
    //in_pad.substract_mean_normalize(mean_vals, norm_vals); // 将这句话注释掉

3 参考

YOLOX模型部署Android端-NCNN方法

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于MobileUNet在NCNN端的部署,你可以按照以下步骤进行操作: 1. 首先,你需要获取MobileUNet的模型文件和权重参数。这些文件通常是在训练过程中生成的,你可以从相关资源库或者官方文档中获取。 2. 下载并配置NCNN库。NCNN是一个轻量级的神经网络计算库,适用于移动设备和嵌入式系统。你可以从NCNN的官方GitHub仓库下载源代码,并按照其文档进行配置和编译。 3. 在你的项目中使用NCNN库。将NCNN库导入到你的项目中,并确保你的项目能够正确地链接和使用NCNN库的功能。 4. 加载MobileUNet模型。使用NCNN提供的接口,你可以加载MobileUNet模型文件和权重参数。具体的加载代码可能会有所不同,具体取决于你选择的编程语言和平台。 5. 对输入图像进行预处理。在将图像输入到MobileUNet模型之前,你可能需要对图像进行一些预处理,例如调整大小、归一化或裁剪等操作。确保预处理过程与MobileUNet模型训练时使用的预处理过程一致。 6. 运行推理。使用NCNN提供的接口,将预处理后的图像输入MobileUNet模型,然后运行推理过程。推理过程将产生预测结果,即MobileUNet对输入图像的分割结果。 7. 后处理和可视化。根据你的需求,你可以对模型的输出进行后处理,例如阈值化、后处理滤波或对象边界框绘制等操作。最后,你可以将结果可视化或保存到文件中。 以上是MobileUNet在NCNN端的部署步骤的一个大致指导,具体细节可能因为你的应用场景和需求而有所不同。在实际操作中,你可能需要参考NCNN的文档和示例代码来更好地理解和应用该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值