MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目前,MNN已经在手淘、手猫、优酷、聚划算、UC、飞猪、千牛等 20 多个 App 中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景,每天稳定运行上亿次。此外,菜鸟自提柜等 IoT 设备中也有应用。在 2018 年双十一购物节中,MNN 在天猫晚会笑脸红包、扫一扫、明星猜拳大战等场景中使用。
首发:https://zhuanlan.zhihu.com/p/70323042
作者:张新栋
关于更多MNN的介绍和文档,大家可以看这篇文章或者去MNN的Github主页。本文主要是想跟大家介绍和讨论,如何在嵌入式设备中,利用MNN来进行CNN任务的部署。本文主要想跟大家讨论的CNN任务是Mobilenet SSD,是一个轻量级的anchor-based物体检测器。
嵌入式场景的CNN部署不同于Desktop和server的CNN部署,在嵌入式场景中,没有强劲的CPU和GPU,硬件资源受限,所以部署的流程和步骤较之于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
MNN:链接
Object detection api:链接
Mobilenet SSD: paper
专注嵌入式端的AI算法实现,欢迎关注作者微信公众号和知乎嵌入式AI算法实现专栏。
更多嵌入式AI相关的技术文章请关注极术嵌入式AI专栏。