• Stars
    star
    1,863
  • Rank 23,973 (Top 0.5 %)
  • Language
    Java
  • License
    GNU General Publi...
  • Created almost 4 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

在我很多项目中用到的CV算法推理框架应用。

前言

一个算法模型的落地需要经历从算法任务确立,到方法调研、模型选型和优化、数据采集标定、模型训练、部署验证等一整个pipeline,其中对于绝大多数的算法工程师,模型的训练和输出是没有问题的,但是要快速地进行模型在移动设备上的效果验证,则需要移动端开发人员和配合才能完成。另一方面,考虑到团队内CV算法研究方向很多,如果每个模型都单独在移动端开发一套验证APP的话显然费时费力,重复造轮子。

为了解决模型移动端部署验证困难,以及每个模型都单独在移动端开发一套验证APP带来的重复工作的问题,本项目实现了CV算法快速验证框架项目,旨在提供一套通用的CV算法验证框架。框架经过本人一年多的开发和维护,目前已经完成绝大部分API的开发,实现包括实时视频流模块、单帧图像处理模块、3D场景模块、云端推理模块等众多功能。

大家可以看到我做的很多其他项目都用到了这个框架,比如L-ink、火星车等,本仓库将这个框架的非核心部分开源出来,代码里整合了重新编译的OpenCV native和JAVA库,大家可以自己扩展用于实现自己的项目。

CV算法验证框架设计

构建包含推理的应用程序所涉及的不仅仅是运行深度学习推理模型,开发者还需要做到以下几点:

  • 利用各种设备的功能
  • 平衡设备资源使用和推理结果的质量
  • 通过流水线并行运行多个操作
  • 确保时间序列数据同步正确

本框架解决了这些挑战,将上述软件框架解耦为数据流控制层nn推理引擎层,以及UI层进行框架实现,把数据流处理管道构建为模块化组件,包括推理处理模型和媒体处理功能等。

  • 其中数据流控制层包含三个大的模块 -- 视频流模块、图片和编辑模块、3D场景模块,每个模块提供可供配置的数据流参数接口,同时提供了一些常用的工具包如OpenCVQVision等用于作为模型的数据输入和预处理。

  • nn推理引擎层则集成了一些移动端常用的推理框架比如SNPETensorFlow Lite等,并提供统一模板便于后续持续维护扩展其他推理框架。

  • UI层则封装好了图像渲染模块,以及各种调试控件。在API方面,该算法验证框架提供了Native/JAVA/Script三个层次的API,前两者可以在Android工程中进行快速模型集成,Script API则不需要编写任何APP 代码,通过文本脚本解析的形式配置模型推理选项。

通过以上功能使开发者可以专注于算法或模型开发,并使用本框架作为迭代改进其应用程序的环境,其结果可在不同的设备和平台上重现。

下图是本框架的模块划分架构图:

API接口说明

从图中各个模块的名字可以看出个模块的功能,输入是转换好的算法模型,以及图像数据流,其中图像数据流分为摄像头采集的视频数据帧、相册选取的单帧图像,以及应用于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库封装接口,可以方便地调取很多图像处理函数:

其中常用的一些操作比如数据的归一化等函数都经过底层优化,保证数据一致性和高效性,比如数据类型的转换使用了zero-copy:

同时OpenCV的编译开启了NEON指令、OpenMP多核等加速选项,对于图像的归一化等操作可以做到并行化加速。

具体的接口reference说明请参考工程代码。

模型优化算法实现和工具封装

除了APP侧的接口外,本CV算法验证框架提供了一套配套的模型优化工具,包括:

  • 模型8bit量化工具
  • 模型结构化剪枝工具
  • 模型转换工具

使用TensorFlow或者PyTorch等Training框架训练好的pb、pth、onnx等模型文件并不能直接在移动端进行部署运行,而是需要做一些模型转换工作,本框架将各种转换工具打包,提供了一套方便的模型转换工具。

其中的模型量化工具基于TensorFlow的TOCO、Pytorch的QNNPACK等实现。

剪枝工具则是根据论文**Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017)**提到的模型剪枝方法进行复现实现的。

模型转换工具和具体的Inference Runtime有关,比如SNPE则是使用DLC转换脚本、TensorFlow使用的是TF Lite转换工具等等。

如上图所示,除了模型优化工具,框架的工具包中还提供了一些预训练和部署好的Model Zoo,用于做同平台性能对比测试的Baseline,目前以及实现部署好的有YOLO、MTCNN、Openpose等模型。

框架在移动端的实际效果

  • Camera视频流、单帧图像,以及3D场景模块选择

  • 同一框架下可以同时验证多个算法模型

  • 模型实际运行效果

More Repositories

1

Dummy-Robot

我的超迷你机械臂机器人项目。
C
11,042
star
2

ElectronBot

C
7,355
star
3

L-ink_Card

Smart NFC & ink-Display Card
C
7,176
star
4

PocketLCD

带充电宝功能的便携显示器
5,967
star
5

HoloCubic

带网络功能的伪全息透明显示桌面站
C
5,791
star
6

HelloWord-Keyboard

C
5,712
star
7

HDMI-PI

我设计的一个HDMI转MIPI模块,可以用于驱动各种手机屏幕当显示器用。
C
5,591
star
8

XUAN

5,330
star
9

Project-Quantum

超迷你模块化卡片电脑计划
3,061
star
10

Peak

Tiny Mobile Terminal Device Kit.
C
1,611
star
11

Planck-Pi

Super TINY & Low-cost Linux Develop-Kit Based On F1C200s.
HTML
1,210
star
12

A-Eye

a spuer mini AI-camera project
C
1,164
star
13

ESP32-PicoDK

C
1,150
star
14

Ctrl-FOC-Lite

C
954
star
15

OpenHeat

C
912
star
16

ST-Link-Nano

自制超迷你的ST-Link模块。
805
star
17

ONE-Robot

2015年做的一个基于IMU和STM32的独轮自平衡机器人
C
685
star
18

SerialChart

一个很好用的串口示波器。
Makefile
575
star
19

MiniRover-Hardware

自制火星车的开源资料。
C
568
star
20

BluetoothTouch

一个Android端的蓝牙遥控APP,提供Arduino库,方便用于机器人、小车等调试用途。
Java
465
star
21

CycloidAcuratorNano

426
star
22

BilibiliLottery

ZHIHUI抽奖算法
HTML
205
star
23

imGUI-Template

A imGUI template project for CLion.
C++
180
star
24

GRBL_for_STM32

A code transportation from origin grbl_v1.1f to STM32F103VET6, mainly prepare for my MegaCNC project.
C
175
star
25

GitHubLottery

我发布的一些开源项目福利环节的GitHub抽奖程序
Python
170
star
26

GrblHost

Grbl雕刻机配套上位机
C++
164
star
27

GE-Switch

141
star
28

Roboard-Pro

无敌增强版Arduino开发板
C
129
star
29

RPi-Base

116
star
30

STM32MP1-SOM

108
star
31

Cheese-UESTC

UESTC图书馆微信小程序
JavaScript
104
star
32

OpenGaze

ToDo.
83
star
33

TraceAPP-Arduino

配合“迹”这款APP的Arduino库,可以实时颜色跟踪目标位置
C++
81
star
34

FaceAPP-Arduino

配合“颜艺Boy!”这款APP的Arduino库,可以实时获取人脸信息
C++
80
star
35

CtrlAPP-Arduino

配合可控Ctrl APP的Arduino库
C++
70
star