前言
上回我们建立了 tensorflow 的开发环境,跑测试模型比较方便,但对于树莓派来说,还是太庞大了。仅有 0.3fps 无法满足实时的生产环境需求,这篇我们部署一下专门为移动端和嵌入式设备而生的 TensorFlow Lite,并跑几个模型,测试一下纯树莓派上的极限帧率。
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
配置树莓派摄像头
1 测试摄像头
先保证摄像头排线已插入树莓派的 CSI 接口,并在 raspi-config 里 Interfacing options -> camera 选项里启用了摄像头。
# 拍摄照片
看一下目录里是否有拍摄的 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
添加: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
菜单里 服务 -> 改变服务 -> 列出了所有的虚拟环境。
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:
速度还是比较快的,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(
180-200ms一帧,5 fps左右,工作量上升了些,所以比分类任务稍慢了一些,这应该已达到树莓派 4代的极限。若要再提升性能,就要用上 intel 神经棒或 google coral 这类 usb 扩展资源了。
安装包和源码下载
本期相关文件资料,可在公众号后台回复:“rpi06”,获取下载链接。
下一篇
我们将在 tersorflow lite 上****,
做一些有趣的应用,
敬请期待...