用树莓派4b构建深度学习应用(六)TensorFlow Lite篇

​前言

上回我们建立了 tensorflow 的开发环境,跑测试模型比较方便,但对于树莓派来说,还是太庞大了。仅有 0.3fps 无法满足实时的生产环境需求,这篇我们部署一下专门为移动端和嵌入式设备而生的 TensorFlow Lite,并跑几个模型,测试一下纯树莓派上的极限帧率。

image
image

TensorFlow Lite 是一组工具,可帮助开发者在移动设备、嵌入式设备和 IoT 设备上运行 TensorFlow 模型。它支持设备端机器学习推断,延迟较低,并且二进制文件很小。

TensorFlow Lite 包括两个主要组件:

  • TensorFlow Lite 解释器,它可在手机、嵌入式 Linux 设备和微控制器等很多不同类型的硬件上运行经过专门优化的模型。

  • TensorFlow Lite 转换器,它可将 TensorFlow 模型转换为高效形式以供解释器使用,并可引入优化以减小二进制文件的大小和提高性能。

转换器一般在主电脑上完成,主要是为了静态化计算图,转换权重类型后,生成 .tflite 文件。而解释器主要在嵌入式设备上运行,我们这里先在树莓派上安装一下 tensorflow lite。

安装 TensorFlow Lite

1 建立虚拟环境

python3 -m venv --system-site-packages ~/my_envs/tf_lite

2 安装 2.1.0 版本

# 可以在官网里下载各个版本

3 启用 opencv

cd ~/my_envs/tf_lite/lib/python3.7/site-packages

4 安装完成

import tflite_runtime.interpreter as tflite
image

配置树莓派摄像头

1 测试摄像头

先保证摄像头排线已插入树莓派的 CSI 接口,并在 raspi-config 里 Interfacing options -> camera 选项里启用了摄像头。

image
# 拍摄照片

看一下目录里是否有拍摄的 demo.jpg 照片和 vid.h264 视频文件,保证硬件没有问题。

2 使用 picamera 控制摄像头

pip install picamera

拍摄一张照片

import picamera

✎ Tip

一定要记得用完摄像头后用 camera.close() 关闭,或是用 With 子句自动释放资源。否则会收到 picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources 的错误信息,只能 Kill python 进程强制释放了。

录制一段视频

with picamera.PiCamera() as camera:

3 使用 opencv 控制摄像头

import cv2

✎ Tip

如果在OpenCV中调用CSI摄像头会出现无数据的现象,这是因为树莓派中的camera module是放在/boot/目录中以固件形式加载的,不是一个标准的V4L2的摄像头驱动,所以加载起来之后会找不到/dev/video0的设备节点。我们在/etc/modules里面添加一行bcm2835-v4l2 就能解决问题。

$sudo nano /etc/modules
image

添加:bcm2835-v4l2,保存关闭即可。

4 查询其他 usb 视频设备

ls -ltrh /dev/video*

使用 jupyter notebook

Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码、方程式、可视化和文本的文档。广泛的用于各种云平台上,为了后续代码的可移植性,我们这里先安装一下。

1 安装 jupyter

sudo apt install jupyter

2 创建配置文件

创建Jupyter notebook的配置文件jupyter_notebook_config.py,在终端中输入:

jupyter notebook --generate-config

编辑配置文件 jupyter_notebook_config.py

c.NotebookApp.ip = '127.0.0.1'

c.NotebookApp.open_browser = True

这两个去除注释,监听本机端口地址 127.0.0.1 即可。

3 配置虚拟环境到 jupyter 内

pip install ipykernel

用 python -m ipykernel install --user --name 虚拟环境名 --display-name Jupyter中要显示的名字,来绑定已有的虚拟环境。

# 配置 pytorch 环境

4 启动 notebook,切换不同的环境

jupyter notebook

菜单里 服务 -> 改变服务 -> 列出了所有的虚拟环境。

image

Tensorflow Lite 应用

1 克隆官方示例

git clone https://github.com/tensorflow/examples --depth 1

2 图像分类应用

首先安装依赖包,再下载一个 MobileNet 模型文件和分类标签文件到 tmp 目录中。

cd examples/lite/examples/image_classification/raspberry_pi

3 在 notebook 中运行一下推理

jupyter notebook

我们新建一个 classify_picamera.ipynb 文件,读入tflite模型,

labels = load_labels('/tmp/labels_mobilenet_quant_v1_224.txt')

调用 interpreter.invoke() 来推理,

def classify_image(interpreter, image, top_k=1):

最后在 opencv 的窗口来展示一下分类结果。

with picamera.PiCamera(resolution=(640, 480), framerate=30) as camera:
image

速度还是比较快的,130ms一帧,能达到大约是7-8fps,准确率也很高,可见提升还是很明显的。这既得益于 MobileNet 的小巧,也得益于 tflite 的精简模型的加速,可达到准实时的效果。

4 目标检测应用

cd examples/lite/examples/object_detection/raspberry_pi

下载一个 MobileNet ssd v2 模型文件和 coco 标签文件到 tmp 目录中。

5 在 notebook 中运行一下推理

jupyter notebook

我们新建一个 detect_picamera.ipynb 文件,读入tflite模型,

labels = load_labels('/tmp/coco_labels.txt')

调用 interpreter.invoke() 来推理,

def detect_objects(interpreter, image, threshold):

获得标注目标,转换标注框和类别标签

def annotate_objects(annotator, results, labels):

最后用 opencv 合并一下视频流和标注层,在 cv2 窗口展示。

with picamera.PiCamera(
image

180-200ms一帧,5 fps左右,工作量上升了些,所以比分类任务稍慢了一些,这应该已达到树莓派 4代的极限。若要再提升性能,就要用上 intel 神经棒或 google coral 这类 usb 扩展资源了。

安装包和源码下载

image

本期相关文件资料,可在公众号后台回复:“rpi06”,获取下载链接。

下一篇

我们将在 tersorflow lite 上****,
做一些有趣的应用,
敬请期待...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351