一个算法模型的落地需要经历从算法任务确立,到方法调研、模型选型和优化、数据采集标定、模型训练、部署验证等一整个pipeline,其中对于绝大多数的算法工程师,模型的训练和输出是没有问题的,但是要快速地进行模型在移动设备上的效果验证,则需要移动端开发人员和配合才能完成。另一方面,考虑到团队内CV算法研究方向很多,如果每个模型都单独在移动端开发一套验证APP的话显然费时费力,重复造轮子。
为了解决模型移动端部署验证困难,以及每个模型都单独在移动端开发一套验证APP带来的重复工作的问题,本项目实现了CV算法快速验证框架项目,旨在提供一套通用的CV算法验证框架。框架经过本人一年多的开发和维护,目前已经完成绝大部分API的开发,实现包括实时视频流模块、单帧图像处理模块、3D场景模块、云端推理模块等众多功能。
大家可以看到我做的很多其他项目都用到了这个框架,比如L-ink、火星车等,本仓库将这个框架的非核心部分开源出来,代码里整合了重新编译的OpenCV native和JAVA库,大家可以自己扩展用于实现自己的项目。
构建包含推理的应用程序所涉及的不仅仅是运行深度学习推理模型,开发者还需要做到以下几点:
- 利用各种设备的功能
- 平衡设备资源使用和推理结果的质量
- 通过流水线并行运行多个操作
- 确保时间序列数据同步正确
本框架解决了这些挑战,将上述软件框架解耦为数据流控制层
、nn推理引擎层
,以及UI层
进行框架实现,把数据流处理管道构建为模块化组件,包括推理处理模型和媒体处理功能等。
-
其中数据流控制层包含三个大的模块 -- 视频流模块、图片和编辑模块、3D场景模块,每个模块提供可供配置的数据流参数接口,同时提供了一些常用的工具包如
OpenCV
、QVision
等用于作为模型的数据输入和预处理。 -
nn推理引擎层则集成了一些移动端常用的推理框架比如
SNPE
、TensorFlow Lite
等,并提供统一模板便于后续持续维护扩展其他推理框架。 -
UI层则封装好了图像渲染模块,以及各种调试控件。在API方面,该算法验证框架提供了Native/JAVA/Script三个层次的API,前两者可以在Android工程中进行快速模型集成,Script API则不需要编写任何APP 代码,通过文本脚本解析的形式配置模型推理选项。
通过以上功能使开发者可以专注于算法或模型开发,并使用本框架作为迭代改进其应用程序的环境,其结果可在不同的设备和平台上重现。
下图是本框架的模块划分架构图:
从图中各个模块的名字可以看出个模块的功能,输入是转换好的算法模型,以及图像数据流,其中图像数据流分为摄像头采集的视频数据帧、相册选取的单帧图像,以及应用于3DCNN的3维模型文件。
本框架提供了Native/JAVA/Script三个层次的API,前两者可以在Android工程中进行快速模型集成,其中Native为C/C++接口,提供JNI模板以及封装好的通信组件便于和JAVA进行数据交互;JAVA层则为Android API,使用和C++一样风格的进行封装,此外提供一些UI绘制函数接口;Script API则不需要编写任何APP 代码,通过文本脚本解析的形式配置模型推理选项。
举例在JAVA API下,算法模型在代码中的初始化方式如下,以高通平台的SNPE Runtime为例,只需要几行非常简单的代码即可加载并初始化模型:
如代码所示,模型文件的加载方式比较灵活,可以作为FileInputStream加载,也可以作为APP的Asset进行加载。
而图像数据的预处理和结果回调使用也非常简单,通过提供的OpenCV、QVison等CV库封装接口,可以方便地调取很多图像处理函数:
其中常用的一些操作比如数据的归一化等函数都经过底层优化,保证数据一致