移动端模型部署(ncnn,tflite,paddlelite等)

移动端模型部署(ncnn,tflite,paddlelite等)

主要介绍
ncnn 部署
paddle lite 部署



各个框架的介绍

在这里简单介绍一下各个框架:

  • Paddle-Lite由百度飞桨团队推出,支持包括手机移动端在内更多场景的轻量化高效预测,支持更广泛的硬件和平台,是一个高性能、轻量级的深度学习预测引擎。在保持和PaddlePaddle无缝对接外,也兼容支持其他训练框架产出的模型,如果熟悉其他的深度学习终端部署平台,那么可以将Paddle-Lite看作与Tensorflow-Lite、NCNN、TNN等对标的产品,帮助用户在手机、嵌入式等资源受限的平台上进行深度学习高性能部署。

    Github:https://www.paddlepaddle.org.cn/paddle/paddlelite

  • ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。

    Github:https://github.com/Tencent/ncnn

  • tflite 是Google推出的专门面向移动端机器学习的轻量级框架——TensorFlow Lite,TensorFlow Lite是TensorFLow的一个轻量级解决方案,旨在解决Google著名的机器学习框架TensorFlow在移动端的应用。它能够为设备端的机器学习推断带来较低的延迟和较小的二值化尺寸。与此同时,TensorFlow Lite亦能够结合Android Neural Networks API支持硬件加速在TensorFlow Lite中,使用到了多种技术来达到低延迟,例如优化移动App的内核,pre-fused activations和量化核(允许更小和更快(fixed-point math)的模型),这其中绝大多数的文档可以在Github上找到。

    链接:https://tensorflow.google.cn/lite?hl=zh-cn


提示:本文未经作者允许不可擅自引用,后果自负

框架的选择

     对于新手来说,我更推荐paddle lite(这里指的是对模型没有太大的研究的),paddle lite对版本没有
太大的要求,兼容性非常的好,像ncnn了这些还有tflite对版本的要求比较明确,而paddle lite 也非常的方
便转换的时候只需要pip安装paddlelite即可使用,而且在安卓端需要部署的这个demo中不需要太大的改动基本
改改输入输出就可以,而且paddle lite推理速度和ncnn tflite也差不多,而且推理的速度不是看你用的啥框
架,而是取决于你的模型。

三大模型的部署流程(全部本人亲自尝试,有问题联系博主即可)

一 、paddle lite部署安卓

  • 首先为大家介绍一下需要用到的文件
    在这里插入图片描述在这里插入图片描述

  • 大致模型转换流程

    我现在用的是这个paddle Detection去训练的,所以我先将它导出inference模型
    
!python tools/export_model.py -c (you)yml weights=(you)best_model --output_dir ./inference
    模型导出为paddlelite支持的,模型文件已经在inference中生成info、pdparams、yml、json这四个文件
  
    准备PaddleLite
    利用下面的转换代码区转换我们已经转好的inference模型
   --valid_targets中参数(arm)用于传统手机,(npu,arm )用于华为带有npu处理器的手机
   ! paddle_lite_opt 
   --model_file=inference_model/model.pdmodel 
   --param_file=inference_model/model.pdiparams 
   --optimize_out=inference_model/model 
   --optimize_out_type=naive_buffer 
   --valid_targets=arm 
   --valid_targets=npu,arm 

对于这段代码配置的详解,我放在下方

–model_dir 待优化的fluid模型(非combined形式)的路径,其中包括网络结构文件和一个一个单独保存的权重文件。

–model_file 待优化的fluid模型(combined形式)的网络结构路径。

–param_file 待优化的fluid模型(combined形式)的权重文件路径。

–optimize_out_type 输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化实现。若您需要在mobile端执行模型预测,请将此选项设置为naive_buffer。默认为protobuf。

–optimize_out 优化模型的输出路径。

–valid_targets 指定模型可执行的backend,目前可支持x86、arm、opencl,您可以同时指定多个backend(以空格分隔),Model Optimize Tool将会自动选择最佳方式。默认为arm。

–prefer_int8_kernel 是否启用int8量化模型,默认为false。 如果待优化的fluid模型是非combined形式,请设置–model_dir,忽略–model_file和–param_file。

如果待优化的fluid模型是combined形式,请设置–model_file和–param_file,忽略–model_dir。 优化后的模型包括__model__.nb和param.nb文件。

至此模型就已经转换结束了。接下来到部署

  • 模型部署
    大家首先先去官方下载安卓demo
    Github:https://github.com/PaddlePaddle/Paddle-Lite-Demo
    下载好后自行配置好ndk
    确认环境没有问题后,打开strings.xml
    在这里插入图片描述
    注意标注红框的需要大家根据自己的模型去修改,那怎么去看自己的模型呢,这里给大家推荐一款软件 netron 深度学习模型可视化库 ,接下来我用这个软件把自己训练好的模型打开给大家看一下。
    在这里插入图片描述
    这是我自己的模型再打开官方demo自带的模型给大家看一下
    在这里插入图片描述
    我们对比两个模型发现这个模型输入维度不一样,还有官方的输入有2个,而我的模型输入有3个。那我们应该怎么把这个自己的模型应用到demo中呢,接下来上图:
    在这里插入图片描述
    我们打开这个地方然后找到,在这个cpp里面输入和输出的部分,这里我还是怕你们找不到上图
    在这里插入图片描述
    找到这个函数,这个就是关于你自己模型的输入的部分,这里面对应的就是2输入1输出的,再看输出部分
    在这里插入图片描述
    这个就是输出部分的代码1输出。那么我们知道在哪里了,应该怎么去改呢,很简单,大家看着自己的模型结构图,用c++写出相对应的接收代码就可以了,输出的话根据自己需求,我认为一个就够用了,没必要把第二个也写出来,上图

    改好的输入
    在这里插入图片描述
    改好的输出

在这里插入图片描述

这样基本就部署完成了,接下来让我们看看这个的实测效果我认为还是非常不错的
在这里插入图片描述
再给大家上个实时视频

实时预测非常不错,paddle lite 部署移动端到此结束,如果有任何问题都可联系我。

提示:本文未经作者允许不可擅自引用,后果自负

还请大家多多点赞,制作不易

二、ncnn模型部署安卓

  • 首先我这里采用的是yolov5训练的目标检测
    流程是PT–>ONNX–>NCNN

    想必大家都已经得到了自己训练好的模型,我的训练好 的模型在./runs/train/exp4/weights下名为best.pt的文件
    在这里插入图片描述

PT转ONNX

在yolov5-master根目录下有export.py文件,可以直接采用转换命令:

python export.py --data ./data/myeye.yaml --weights ./runs/train/exp4/weights/best.pt --img 640 --batch 1

YOLOv5 6.0 去掉了focus,不需要手工修改任何文件,在ncnn使用时兼容性更好。

运行成功,会在与best.pt同目录下产生两个文件best.onnx和best.torchscript(也是一种模型转换格式),我们这里只讨论onnx。

此时可以通过可视化工具Netron查看网络的总体架构,如果不想安装到本地,可以直接点击Open Model,选择刚才转换出来的best.onnx文件即可。

在这里插入图片描述
简化ONNX
转为onnx格式后,还需要再进行模型简化,不然会在转换的时候报错:

安装简化工具:
pip install onnx-simplifier
简化命令如下:
python -m onnxsim best.onnx best-sim.onnx

此时就已经基本完成了。

ONNX转param、bin
其实不用按照网上的有些教程下载ncnn源码编译配置

一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine (convertmodel.com)
在这里插入图片描述
网址:https://convertmodel.com/

最后一步
修改param
打开刚才生成的.param文件,拉到最后,将红框内的三个数据全部修改为:-1,这样做是为了防止移植到Android端,检测时出现密密麻麻的检测框覆盖图片。
在这里插入图片描述
至此,模型转换完毕。

  • 模型部署
    下载ncnn-android-yolov5案例
    NCNN官方提供的example:
    GitHub: - nihui/ncnn-android-yolov5: The YOLOv5 object detection android example

修改example以适应自己的数据模型
anchors的值在训练开始时是默认根据数据集重新计算,所以我们首先要拿到数据模型的anchors值,代码内容如下:

import torch
from models.experimental import attempt_load
 
model = attempt_load('./weights/best.pt', map_location=torch.device('cpu'))
m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]
print(m.anchor_grid)

输出如下:

tensor([[[[[[ 6.75781, 2.00000]]],
[[[ 8.60938, 2.83594]]],
[[[ 11.01562, 4.14844]]]]],
[[[[[ 20.28125, 5.57812]]],
[[[ 26.29688, 9.30469]]],
[[[ 37.43750, 8.21875]]]]],
[[[[[39.31250, 12.95312]]],
[[[54.50000, 16.57812]]],
[[[68.62500, 25.54688]]]]]])

同时输出层ID在Permute层里面,找到对应的参数:
在这里插入图片描述

最后,将模型对应的anchors值、及Permute层的参数改写到ncnn-android-yolov5-master/app/src/main/jni/yolov5ncnn_jni.cpp文件中,如下图所示:
在这里插入图片描述

至此,可以在Android上测试自己的模型了!

实测图片
在这里插入图片描述
另外yolo版本不同都可能导致转化失败,如遇困难可联系博主

提示:本文未经作者允许不可擅自引用,后果自负

还请大家多多点赞,制作不易。

总结

谨记:推理的速度不是看你用的啥框架,而是取决于你的模型。

大家只要能看懂这些模型,感觉啥框架部署都是大同小异。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>