0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

实战MNN之Mobilenet SSD部署

电子设计 来源:电子设计 作者:电子设计 2020-12-10 18:14 次阅读
MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目前,MNN已经在手淘、手猫、优酷、聚划算、UC、飞猪、千牛等 20 多个 App 中使用,覆盖直播、短视频、搜索推荐商品图像搜索、互动营销、权益发放、安全风控等场景,每天稳定运行上亿次。此外,菜鸟自提柜等 IoT 设备中也有应用。在 2018 年双十一购物节中,MNN 在天猫晚会笑脸红包、扫一扫、明星猜拳大战等场景中使用。
作者:张新栋

关于更多MNN的介绍和文档,大家可以看这篇文章或者去MNN的Github主页。本文主要是想跟大家介绍和讨论,如何在嵌入式设备中,利用MNN来进行CNN任务的部署。本文主要想跟大家讨论的CNN任务是Mobilenet SSD,是一个轻量级的anchor-based物体检测器。

嵌入式场景的CNN部署不同于Desktop和server的CNN部署,在嵌入式场景中,没有强劲的CPUGPU硬件资源受限,所以部署的流程和步骤较之于Desktop和server有较大的不同。在我的理解中,我会将嵌入式场景的CNN部署流程分为如下几部:1. 模型设计 2. 离线训练 3.网络裁剪 4. 在线部署。下面我们将会结合这个四个步骤,讨论如何利用MNN进行Mobilenet SSD的部署。

在进行讨论前,我们说明一下,采用的离线训练框架为tensorflow,MobilenetSSD采用的是Google的物体检测全家桶

模型设计

在进行模型设计的时候,唯一需要注意的要点是避免在核心网络层中采用硬件或端上推理框架不支持的Op。比如,tflite android中的NNAPI 1.0中不支持padding、squeeze、reshape等Op。如下图


NNAPI 1.0 不支持的Op

在使用MNN进行在线部署的时候,同样也需要考虑这个问题。在进行模型的设计的时候,需要认真检查核对,核心的CNN网络里有没有采用MNN框架不支持的Op。如果采用了,需要进行替换或者重新设计。

离线训练

离线训练的好坏直接影响该CNN模型实际的推断效果,不过本文的重点不在如何进行训练。后续我们会再详细写一篇文章介绍如何训练,这里我们假定已经完成了该任务。为此,我们提供了训练好的两个模型,一个是300x300-0.5的人体检测器,另一个是224x224-0.5的人脸检测器。我们将在文章末尾附上github的链接。

网络裁剪

如果有些Op或者layer在进行离线训练时不可缺少,但是端上推理框架不支持该怎么办呢?比如Mobilenet SSD中的后处理模块,tensorflow Object detection api的PostProcessing Ops和Caffe SSD中的ObjectDetectionLayer。网络裁剪就是在这个时候派上用场的,以tensorflow的Object detection api为例,我们可以仅导出PostProcessing之前的Node,即concat和concat_1,然后后处理可以从device取出结果后,在cpu端进行postprocessing。可参考如下导出脚本,

bazel run --config=opt tensorflow/lite/toco:toco -- /
--input_file=$OUTPUT_DIR/tflite_graph.pb            /
--output_file=$OUTPUT_DIR/detect.tflite             /
--input_shapes=1,224,224,3                          /
--input_arrays=normalized_input_image_tensor        /
--output_arrays='concat','concat_1'                 /
--inference_type=FLOAT                              /
--change_concat_input_ranges=false               

在线部署

我们前面进行了模型设计(保证核心CNN结构不引入MNN不支持的Op)、离线训练(保证得到一个效果好的CNN网络)、网络裁剪(移除不支持的Op),目前得到的模型(pb或tflite),基本可以确保在MNN中能正常运行。在用MNN进行在线部署的时候,我们还需要完成如下几个步骤:基于目标平台的MNN编译、tflite或tensorflow的MNN模型转化、编写基于MNN的MSSD业务代码。我们将这几个步骤都做了详细的文档,连同数据和代码都上传到了我的github账户中。大家可参考如下链接,工程内提供了基于MNN的tflite-mssd和tensorflow-mssd的部署流程和业务代码,觉得有帮助的,希望大家能点个小星星。

讨论

欢迎大家留言进行讨论,我会第一时间进行回复。如果您对嵌入式的AI部署也感兴趣,可关注专栏或本人账号,相互交流学习。谢谢大家!

参考

本人Github:MNN-MSSD

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3590

    浏览量

    129463
  • SSD
    SSD
    +关注

    关注

    21

    文章

    2862

    浏览量

    117411
  • 深度学习
    +关注

    关注

    73

    文章

    5503

    浏览量

    121153
收藏 人收藏

    评论

    相关推荐

    张飞实战电子设计思想核心2

    张飞实战电子设计思想核心2
    发表于 04-23 19:24

    【瑞芯微RK1808计算棒试用体验】+ mobileNet SSD 练个人头检测模型

    `RK1808官方提供了mobileNet SSD的多分类的demo,所以基于这个算法可以较容易开发自己的检测算法,所以用网上公开的人头检测数据集训练一个人头检测模型。caffe
    发表于 10-25 17:28

    轻量化神经网络的相关资料下载

    视觉任务中,并取得了巨大成功。然而,由于存储空间和功耗的限制,神经网络模型在嵌入式设备上的存储与计算仍然是一个巨大的挑战。前面几篇介绍了如何在嵌入式AI芯片上部署神经网络:【嵌入式AI开发】篇五|实战篇一:STM32cubeIDE上部署
    发表于 12-14 07:35

    CoolPi CM5运行ChatGLM-MNN大语言模型

    ChatGLM-MNN project git clone https://github.com/wangzhaode/ChatGLM-MNN.git Compile MNN library
    发表于 04-29 09:39

    Coolpi CM5运行ChatGLM-MNN大语言模型

    Download ChatGLM-MNN project git clone https://github.com/wangzhaode/ChatGLM-MNN.git Compile MNN
    发表于 05-03 11:30

    人工智能大模型、应用场景、应用部署教程超详细资料

    、Prisma 模型、Ssd-mobilenet 模型、Ssd-inception 模型、Tnet 模型、XLSR 模型和 Z-DCE 模型。每个模型都配有介绍和实操的视频教程并搭配相应文档,降低客户在
    发表于 11-13 14:49

    ARM全国产云平台部署容器实战经验分享

    ARM全国产云平台部署容器实战经验分享
    发表于 07-18 16:11 71次下载
    ARM全国产云平台<b class='flag-5'>部署</b>容器<b class='flag-5'>实战</b>经验分享

    阿里MNN支持华为NPU,优化MNN的性能和精度问题

    今天上午据软件绿色联盟消息,阿里MNN已经接入华为 HiAI生态,正式支持华为NPU。
    的头像 发表于 12-23 14:04 3611次阅读

    实战MNN量化部署

    今天MNN更新了新的工具包---CNN网络量化工具(quantization),作者也第一时间进行了测试。提升的效果还是很可观的,量化前的CNN网络大小...
    发表于 02-07 11:45 0次下载
    <b class='flag-5'>实战</b><b class='flag-5'>MNN</b><b class='flag-5'>之</b>量化<b class='flag-5'>部署</b>

    详解MNN的tflite-MobilenetSSD-c++部署流程

    关于MNN以及Mobilenet SSD的介绍,大家可以参考我早些时候写过的一篇文章实战MNN
    发表于 02-07 11:55 0次下载
    详解<b class='flag-5'>MNN</b>的tflite-MobilenetSSD-c++<b class='flag-5'>部署</b>流程

    如何DIY轻型的Mobilenet回归器

    之前我们有跟大家讨论过如何DIY一个轻型的Mobilenet SSD的物体检测器,本专栏的其他文章亦有介绍如何部署该类轻型MSSD的物体检测器于嵌...
    发表于 02-07 11:59 1次下载
    如何DIY轻型的<b class='flag-5'>Mobilenet</b>回归器

    使用TVM在android中进行Mobilenet SSD部署

    所谓TVM,按照正式说法:就是一种将深度学习工作负载部署到硬件的端到端IR(中间表示)堆栈。换一种说法,可以表述为一种把深度学习模型...
    发表于 02-07 12:07 0次下载
    使用TVM在android中进行<b class='flag-5'>Mobilenet</b> <b class='flag-5'>SSD</b><b class='flag-5'>部署</b>

    详解MNN的tf-MobilenetSSD-cpp部署流程

    关于MNN以及Mobilenet SSD的介绍,大家可以参考我早些时候写过的一篇文章实战MNN
    发表于 02-07 12:18 0次下载
    详解<b class='flag-5'>MNN</b>的tf-MobilenetSSD-cpp<b class='flag-5'>部署</b>流程

    PFLD-lite:基于MNN和mxnet的嵌入式部署

    之前的文章跟大家介绍过如何使用mxnet和MNN做产品化部署,选取的案例为MNIST手写数字识别的项目,该项目是一个比较简单的分类问题。今天...
    发表于 02-07 12:19 0次下载
    PFLD-lite:基于<b class='flag-5'>MNN</b>和mxnet的嵌入式<b class='flag-5'>部署</b>

    实战MNNMobilenet SSD部署(含源码)

    MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目...
    发表于 02-07 12:32 0次下载
    <b class='flag-5'>实战</b><b class='flag-5'>MNN</b><b class='flag-5'>之</b><b class='flag-5'>Mobilenet</b> <b class='flag-5'>SSD</b><b class='flag-5'>部署</b>(含源码)