如何基于Flutter和Paddle Lite实现实时目标检测

 

 

 

 

 

 

很早以前接触到了飞桨PaddlePaddle)以及PaddleDetection工具,被他们的简单易用吸引,同时,这些工具极大下降了训练模型的门槛并减小了所需时间,很是适合新手入门。在不少实际应用场景也有不俗的表现。html

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

在端侧部署方面,Paddle Lite飞桨产品栈中用于端侧高性能轻量化AI应用部署的推理引擎,给了移动端等场景更多可能。这款引擎容许咱们在不少硬件平台上实现轻量化的高效预测,进行一次预测耗时较短,也不须要太多的计算资源。android

那么若是咱们想开发一款既能在本地进行预测又能在Android和iOS上面有一致体验的App的话,Flutter无疑是一个好选择。其做为开源移动UI框架已然成为跨平台移动开发一大趋势,在开发时能够保留状态进行热重载,内置许多使人眼前一亮的组件和漂亮的动画,同时还能保证性能达到和原生应用同样。也正由于这样,很多公司开始把本身的应用向Flutter迁移,有许多咱们耳熟能详的App其实已是基于Flutter开发。假如你已经对安卓原生开发十分熟悉的话,不妨去试试。git

此次咱们就基于Flutter来开发一个实时目标检测程序,这也得益于Flutter支持访问iOS和Android上的原生系统功能和系统SDK。github

咱们项目的GitHub地址:安全

https://github.com/KernelErr/realtime-object-detectorapp

其中内置了水果识别模型,下载下来就能直接编译体验。约定:框架

  • Flutter端:Flutter项目主目录。函数

  • Android端:项目的Android子目录,原生安卓。工具

开发环境性能

咱们在开发的时候环境以下:

  • Flutter version 1.12.13+hotfix.8

  • Dart version 2.7.0

  • Android Studio (version 3.6)

  • Android toolchain - develop for Android devices (Android SDK version 29.0.3)

Flutter在更新的同时加入了愈来愈多新的特性,网上一些基于老版本的实现方法已经不太实用,咱们须要进行一些修改。

准备模型

Paddle Lite须要经过opt工具生成其支持的轻量化模型,若是你手上已经有PaddleDetection训练出来的模型,那么你须要先在PaddleDetection导出模型,而后经过opt工具进行转换。

若是你有其余框架训练出来的模型,如caffe、tensorflow、onnx等,能够利用X2Paddle来转换。

假设咱们已经获得了两个文件:

  • model.nb - 基于Yolov3 Tiny训练且已经经过opt优化好的模型

  • label - 模型预测一一对应的标签

如何在Flutter中支持Paddle Lite

咱们只须要经过Android Studio建立一个新的Flutter项目,这里咱们假设名字是realtime_od。

准备Paddle Lite的预测库和模型文件

因为咱们使用的是安卓原生代码,因此咱们须要在Android端进行开发,而不是Flutter端。咱们在Paddle Lite提供的预编译预测库里面下载须要的预编译库,放到Android端的相应文件夹内,和原生安卓的目录相似。以后咱们继续在android文件夹内放置模型文件,在realtime_od/android/app/src/main/下面新建assets文件夹,并分别把模型和标签放到models和labels子文件夹内。这时候你的目录结果应该是这样:

咱们使用口罩模型做为样例,模型位置是:models/mask/model.nb,标签位置是:labels/mask_label_list。所以你须要在MainActivity里面赋值:

禁用压缩

在生成APK的时候,咱们的模型会被压缩,因此咱们须要修改build.gradle配置文件来禁用assets文件夹的压缩。

提供原生安卓支持

若是为了Flutter的支持,给Paddle Lite专门写一套Dart调用代码是工做巨大的,因此咱们不妨直接基于官方的Demo进行修改。在Android端,咱们直接使用了官方Demo中的代码,并在MainActivity内注册了Channel。

因为Flutter中加入了进程安全机制,咱们使用了一个MethodResultWrapper保证在主进程里面返回result。新版Flutter中你须要使用configureFlutterEngine而不是onCreate来注册组件。

使用实时影像

让咱们来给Flutter提供来自摄像头的实时影像!添加一下Flutter的camera插件,Dart 已经有不少现成的包给咱们使用:

同时须要确保项目的最低Android SDK版本在21以上。在官方提供的Demo中,图片输入使用的是Bitmap图片,可是咱们从插件获得的格式是android.graphics.ImageFormat.YUV_420_888,在Predictor类的最下面咱们进行了相应的转换,转换代码的使用已经联系原做者得到受权。咱们在其中使用了RenderScript进行高效计算,避免延迟太高。

显示实时图像并标注

大量的工做都花在了Android端上面,下面让咱们来Flutter端作些工做。

在main.dart和object_detector.dart里面你能够发现咱们调用Android端提供的方法,即loadModel以及detectObject。同时在DrawObjects类里面提供了标注目标的功能,代码相对比较简单,利用获得的预测结果进行画图。

Let’s run it!

这里使用的是群友提供的口罩模型,label文件里面只有两行,分别是戴口罩和未带口罩。咱们在Android 9设备上面用PaddlePaddle官方示例图片测试一下。

从日志上面能够看出Paddle Lite预测的时间是接近700 ms。

更改模型和优化方案

如何使用其余模型

咱们是参考群友的解决方案(参考连接里面给出)适配的YOLO v3,主要的修改在Predictor内的模型输入以及MainActivity的初始化。由于官方使用的是其余模型,输入的Shape和咱们不同,咱们的是320。

若是你须要使用其余模型,请同步修改输入处的:

以及输出处的:

标注函数处也须要作相应修改,修改main.dart:

怎么更快

实际上咱们的模型还不够快,选择合适的模型,能够把预测时间缩短到更短。具体仍是看本身的须要,Paddle Lite支持许多主流的模型,你们能够进行选用。

Trouble Shooting

记录的问题包括Flutter开发过程当中遇到的和Paddle Lite使用中遇到的:

1. Methods marked with @UiThread must be executed on the main thread.

这是由于Flutter引入了进程安全,不能直接在子进程里面返回result,须要在主进程里面返回,网上如今有不少解决办法,咱们的也是来自GitHub。

2. 错误: 不兼容的类型: MainActivity没法转换为FlutterEngine

极可能你看的教程是旧版本,请直接参考官方文档写原生安卓。咱们在原生安卓开发的时候指定了v2。

3. Paddle Lite出现库错误

一开始觉得是官方的问题,可是本身手动编译一次库就能解决。我已经内置了arm64的无问题的库。

4. 其余问题

官方文档 -> GitHub -> 搜索引擎 -> Paddle Lite官方QQ群(696965088),通常都能解决。:)

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

参考连接

Paddle Lite Github地址:

https://github.com/PaddlePaddle/Paddle-Lite

Paddle Lite中文文档:

https://paddle-lite.readthedocs.io/zh/latest/index.html

Paddle Lite 安卓端部署:

https://www.ralphlu.top/article/2020/3/4/7.html

Real-Time Object Detection with Flutter, TensorFlow Lite and Yolo -Part 1:

https://blog.francium.tech/real-time-object-detection-on-mobile-with-flutter-tensorflow-lite-and-yolo-android-part-a0042c9b62c6

Writing custom platform-specific code:

https://flutter.dev/docs/development/platform-integration/platform-channels

PaddleDetection地址:

https://github.com/PaddlePaddle/PaddleDetection

飞桨官网地址:

https://www.paddlepaddle.org.cn

飞桨开源框架项目地址:

GitHub: https://github.com/PaddlePaddle/Paddle

Gitee: https://gitee.com/paddlepaddle/Paddle

END

本文同步分享在 博客“飞桨PaddlePaddle”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索