针对无法使用Tensor RT编译加速的嵌入式CPU平台,本文使用NCNN 框架对模型进行算法部署。NCNN为腾讯公司开源(https://github.com/Tencent/ncnn)的一个深度学习推理框架。由于其使用 C++语言开发,并且不依赖任何第三方库,因此可以很方便的进行跨平台的深度学习算法开发部署。同时其针对嵌入式设备做了专门的计算优化,除了上文介绍的GEMM、Winograd加速算法外,NCNN 还集成了 NEON指令集加速、多线程优化等极其细致有效的优化算法,为边缘 CPU 计算设备提供了有效的性能提升。
Qcom865 嵌入式 CPU 端算法部署流程图如上图所示。整体部署流程与嵌入式GPU 大体相同。区别是从中转模型格式ONNX 转换完毕开始。完整的手机端 应用模型加载部署的具体流程如下:
(1)在转换到 ONNX 前的操作与嵌入式 GPU 方法相同,因此可以直接使用部署嵌入式 GPU模型时获得的ONNX模型文件进行NCNN 格式的转换。
(2)转换为NCNN文件后,由于需要部署至安卓设备,安卓设备运行应用是在Java虚拟机中进行的,对应的应用需要使用Java构建。由于NCNN是使用 C++语言编写的推理加速库,因此需要使用 Java的native接口JNI(Java Native Interface,JNI)对C++编译库进行调用。需要使用 CMake 将 模型的数据前处理以及后处理程序、Android端NCNN 的库文件进行打包,编译为库文件供 JNI 调用。
(3)构建 Android 应用界面,本文在安卓端部署需要用到的组件有一个选取图像用的 Button以及一个发送模型推理信号的Button,同时需要一个显示场景语义分割结果的 Image View,最后需要2 个显示推理时间与帧率的 Text View。
(4)编写各组件逻辑,通过图像选取Button将待分割的图像读入网络通过 JNI 传入编写的模型推理库,进行图像预处理后送入模型网络推理,计算推理开始与结束的时间差,利用Exactor提取输出结果,经过后处理后转换为 Android的Bitmap类后在Image View上对分割结果进行显示,在两个 Text View 上对推理时间以及帧率进行显示。
(5)将所有部分编译打包为APK 程序包,在搭载了Qcom865 的安卓手机上进行推理测试。