SteveHawk's Blog

树莓派折腾笔记(二)



派上的深度学习

之前用 darknet-nnpack 实现了在树莓派上运行 tiny YOLOv3 进行“实时”的目标识别。下一步,我想要尝试更快的网络。如何去寻找一些为了 ARM 设备优化的深度学习库呢?很简单,去找手机厂商/互联网厂商做的库。为了在手机端更快运行,他们都会做超级多底层优化,能够实现非常好的性能。如果支持移植到树莓派,那正好就是我们的不二之选。

一番搜索和挑选,我最后选择尝试以下框架:

我们一个一个来尝试。

Paddle Lite

简介

PaddlePaddle 是百度开发的深度学习框架。我个人之前有使用过基于它的 PaddleDetection 框架,由于提供了非常丰富的模型支持,并且配置使用类似 Detectron 一样方便,所以对 PaddlePaddle 有了不错的印象。

Paddle Lite 则是为了移动设备、嵌入式设备优化过的轻量级高性能框架,有专门的 ARM CPU 优化,与 PaddlePaddle 兼容。爽的是,他们直接提供了一个可以运行在树莓派上的 Demo:

Paddle-Lite-Demo

安装

安装配置非常简单,按照 README 里的步骤走就可以。其中在配置依赖环节,文档给出的方法里需要编译 cmake,实际测试下来并不需要,使用 APT 安装的 cmake 就可以满足要求。因此依赖安装只需要以下两条指令:

1sudo apt update
2sudo apt install gcc g++ make wget unzip libopencv-dev pkg-config cmake

随后按照文档编译即可。

不过可能还需要按照这个藏在文件夹里的说明,添加一个 V4L2 驱动使 OpenCV 能够识别摄像头:

https://github.com/PaddlePaddle/Paddle-Lite-Demo/blob/master/PaddleLite-armlinux-demo/enable-camera-on-raspberry-pi.md#5安装v4l2驱动使opencv能够识别摄像头

图像分类

图像分类 Demo 编译完成后,进入 PaddleLite-armlinux-demo/image_classification_demo/build 文件夹,运行以下指令即可使用自带摄像头进行图像分类任务。

1./image_classification_demo ../models/mobilenet_v1_for_cpu ../labels/synset_words.txt

这里的 Demo 提供了 MobileNet-v1 作为分类网络,实测运行性能在 10 fps 左右,可以说是非常快了。不过这个只能对于一整帧图像进行分类,我们肯定是想要更酷的目标识别嘛。

目标识别

目标检测 Demo 编译完成后,进入 /PaddleLite-armlinux-demo/object_detection_demo/build 文件夹,运行以下指令即可使用自带摄像头进行目标识别任务。

1./object_detection_demo ../models/ssd_mobilenet_v1_pascalvoc_for_cpu ../labels/pascalvoc_label_list

这里的 Demo 使用了 SSD-MobileNet-v1 作为目标识别网络,实测性能在 6 fps 左右,可比 YOLOv3 快多了哈哈哈哈哈哈。不过按照惯例,准确度肯定是没法比。tiny YOLOv3 使用 COCO 数据集训练,能做 80 个标签 的分类,而这里的 SSD-MobileNet-v1 使用的是 PascalVOC 数据集训练,只能提供 21 个标签 的分类,而且目测准确率甚至低于 YOLOv3(不过 SSD 比 YOLO 差也几乎算是常识了)。

TensorFlow Lite

简介

TensorFlow 这样大名鼎鼎的框架就不多说了。谷歌同时也为移动设备和 IoT 设备开发了一个轻量级的版本,TensorFlow Lite。同样的,他们也提供了一个可以直接在树莓派上运行的 Demo:

TensorFlow Lite Python object detection example with Pi Camera

安装

按照 Demo 的说明,只需要安装一个 tflite 的运行时(tflite_runtime)即可。按照这篇 Python quickstart 的指示下载安装包安装。

然后按照 Demo 说明 clone 这个 repo,并用自带的脚本下载模型。我选择下载到了当前文件夹中。

运行

用 Demo 说明的指令即可运行。(模型和 label 说明文件位置需要根据实际情况更改)

1python3 detect_picamera.py \
2  --model ./detect.tflite \
3  --labels ./coco_labels.txt

如果你是连接了显示器,那应该会跳出一个实时的摄像头画面了。但是如果你用的是 VNC 或者 TeamViewer 这样的远程桌面,大概率你会看到脚本在运行、CPU 高负载,却没有画面。这是因为脚本用了 picamera 模块做显示,而 picamera 在显示的时候是直接在 HDMI 输出上做了一个叠加层,用了虚拟桌面的 VNC、TeamViewer 这类软件是无法捕获到这个输出的。picamera 的文档在这里做了解释。

解决方法其实也很简单,那就是到树莓派上的 RealVNC 设置项 Options -> Troubleshooting 里勾选 Enable direct capture mode。这样 VNC 就会直接抓取 HDMI 视频流,然后就可以看到 picamera 的预览界面了。参考回答:Sending Raspberry Pi Camera preview to a laptop running VNC Viewer

这里 TensorFlow Lite 提供的 demo 用的依旧是 SSD MobileNet v1,不过预训练使用了 COCO 数据集,因此会比 Paddle Lite 识别出更多的类别。性能在 4-5 fps,奇怪的是竟然没有吃满全部的 CPU,不过幸好这个性能已经够用了。

ncnn & MACE

很明显,上面两个框架已经完全能够满足我们的需求了。不幸的是,ncnnMACE 这两个框架都需要自行编译,并没有提供预编译运行时和 Demo,因此暂时先不折腾,等以后感觉来了再搞好了。


#tech notes
本文总字数 1704
本文阅读量
本站访客量

↪ reply by email