树莓派折腾笔记(一)
Intro
趁双十一打折入手了一个树莓派 4B。硬件配置:
CPU:Broadcom BCM2711,四核 Cortex-A72 1.5GHz
RAM:4GB LPDDR4
IO: 双频 Wi-Fi、蓝牙 5.0、2 个 Micro HDMI 2.0 接口(4K 60FPS)、满血千兆网口、2 个 USB 3.0、2个 USB 2.0、MIPI DSI 接口、MIPI CSI 相机接口、立体声耳机/视频接口、40 针 GPIO。
可以说这一代树莓派是超级强大的配置了。一年前的项目 小米路由器mini 自制NAS 原本由于路由器性能过于低下而最终失败,这次树莓派 4 拥有强大的 CPU,超大内存,还有千兆网口和 USB 3.0,用在这个项目上可以说是完美。不过买一个树莓派光整个 NAS 有点浪费,还是有很多别的可以折腾折腾。
0. 系统
树莓派支持很多操作系统。官方在这儿列出了所有推荐的系统:https://www.raspberrypi.org/downloads/。对于我这个 Ubuntu 吹来说,首选显然是 Ubuntu Server。(也许有机会会去试一试 Win10 IOT)
Ubuntu Server
安装系统很简单,按照 Ubuntu 官方说明 即可。
但是刷完系统,开机亮屏,等要输密码的时候我傻眼了,我发现键盘完全用不了。换键盘换 USB 口都试了,USB 口有电,但是按键没有反应。搜了一圈,找到了官方这篇博客:https://ubuntu.com/blog/roadmap-for-official-support-for-the-raspberry-pi-4。由于内核的 bug,Ubuntu Server 在树莓派 4B 4GB 内存版本上会出现 USB 不可用的状况(1GB 和 2GB 内存版本不会… 被针对了!!!)。解决方法就是在配置文件里加一条,把内存限制在 3GB……. 服了。
好在这个内核问题现在已经被修复,新的镜像大概不会有这个问题了吧。(如果继续有问题,那就先把内存限制到 3GB,登陆用 apt 更新内核就好。或者直接 SSH 上去更新也行。)
Ubuntu 就是 Ubuntu,用着很舒服。但是出了一个问题,我死也没法让 vncserver 运作起来。让我一直插 micro-HDMI 连显示器我是拒绝的,一是显示器切源麻烦,二是这个口太脆弱怕坏。而用 vncserver 可以很方便的在我的电脑上操作树莓派的图形界面。另外,树莓派一个据说很好用的工具 raspi-config
在 Ubuntu Server 上不存在。缺了这个工具,怎么启用摄像头,怎么启用其他一些连接口,貌似就麻烦了很多。
那么,果断,换系统。
Raspbian
亲儿子到底还是亲儿子,查了一圈觉得官方系统 Raspbian 对于充分发挥树莓派能力更适合。官方镜像页面:https://www.raspberrypi.org/downloads/raspbian/。安装和 Ubuntu Server 没有什么区别,也是直接按照官方教程走就好。
Raspbian 本质上是个魔改版的 Debian,也有 apt 做包管理,所以其实用起来和 Ubuntu 没啥区别。官方预先配置了很多东西,各种配置调整也都超级方便。
下面是几个常见问题的参考:
-
中文输入法安装 Chinese input method? [solved]
-
蓝牙鼠标延迟 Mouse slow and lagging after rpi-update [solved](不过这个问题我还是没有解决)
-
查看树莓派硬件信息和引脚定义:
pinout
-
查看 CPU 温度:
1# Method 1 2/opt/vc/bin/vcgencmd measure_temp 3# Method 2 4cat /sys/class/thermal/thermal_zone0/temp
1. 风扇
买树莓派的时候配了个 5V 的小风扇,一开始觉得很安静,结果夜深人静的时候才发现竟然这么吵。第一反应自然是利用 GPIO 去做自适应风扇调速,但是查了一圈,发现最多的方案就是用杜邦线,面包板和三极管去做调速。
查一下 GPIO 的引脚定义,可以看到右上角引脚 4 和引脚 6 正好是相邻的 5V 和 GND,可以用于驱动风扇。而 3.3V 和 GND 并没有相邻,导致风扇没法直接接到 3.3V。那用 GPIO 口和 GND 口可以吗?查了资料,发现 GPIO 口的驱动电流非常小,带不动风扇。最终我选择去别人那儿嫖了两根杜邦线,把风扇接到了 3.3V,好歹是安静了点。
顺便我还做了下温度的对比,可以总结出以下方案:(均默认已贴好散热片)
- 不插风扇。由于树莓派 4 有了一颗更强大的 CPU,在高负载下温度很容易升到 65+°C(没敢跑到更高),再高可能会导致过热关机甚至损坏。(低负载倒是完全没有问题)
- 风扇插 5V。高负载也能基本保持在 50°C 之下,但是夜深人静的时候会让人觉得很吵。
- 使用杜邦线(或者是插口分成两个头的风扇)把风扇接到 3.3V。高负载情况下,温度会比 5V 的时候高 5-10°C,但是基本保持在 60°C 以内。声音显著小于 5V 的时候。
- 使用三极管调速。尚未实施,难度和复杂度显然高于上述几个方案,但是显然能够平衡三个方案的优缺点。
2. 网络摄像头
买树莓派的时候店家送了个摄像头,可以来好好用一用。至于怎么把摄像头安装到主板上就自行查资料吧,反正就是插个排线的事情。
启用摄像头在 Raspbian 里非常方便,直接在 Preferences -> Raspberry Pi Configuration 里就能直接开启,或者用 raspi-config 在命令行里也可以轻松启用。
最简单的使用方法就是在命令行输入 raspistill -o image.jpg
,然后摄像头就会拍一张照片。另外可以用这个摄像头做网络直播,直接运行以下指令:
1raspivid -o - -t 0 -n -w 1920 -h 1080 -fps 30 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
就会在树莓派的 8554 端口以 RTSP 协议直播视频,分辨率为 1080P@30FPS。在同一局域网另一台电脑上使用 vlc 播放器就可以看到了。配置参考:https://raspberry-projects.com/pi/pi-hardware/raspberry-pi-camera/streaming-video-using-vlc-player。
另外也可以用 Python 的 Picamera 模块去调用摄像头,详细参考文档:https://picamera.readthedocs.io/。
3. 视频掉帧
提一嘴视频掉帧。
这次树莓派 4B 配了两个支持 4K@60FPS 的 micro-HDMI 接口,意思可以双 4K 显示器。但是视频播放能力呢?我测试了 Bilibili 和 YouTube 两个平台。结果是不论分辨率多低,都会有至少 5-10% 的掉帧率…..
往好处看,1080P 也依旧只有 10% 左右的掉帧(
总之看网络视频就还是用手机吧。不过插硬盘当个家庭影音中心应该还是能行的,不还专门有个叫 LibreELEC 的系统用来做这个的。
进一步查阅资料,发现这其实是软解的锅。树莓派 4 其实有很强的硬解能力,只不过网页视频并不支持罢了。我用 vlc 测试了下本地视频,由于不支持硬解,软解下视频码流超过 1000 kbps 就开始掉帧。如果想要硬解视频,现成的方法是用一个叫做 OMXPlayer 的播放器播放,不过没有任何 GUI,键盘操控也有些问题。或者可以自行编译支持硬解的 ffmpeg,据说编译可能要长达一个小时所以尚未测试。
4. 深度学习
“它只是个 SBC,千万不要放过它!”
最近在搞目标识别,店家又正好送了个摄像头,那自然而然想在上面跑个网络啊。以性能著称的目标探测网络里,最出名的应该算是 YOLOv3 了。在 YOLOv3 的网站 上,可以看到 Tiny YOLOv3,适用于 “constrained environments”,正适合树莓派了。
Darknet
原版 Darknet 可以直接参考 官网教程 编译。不过据说使用原版跑 YOLOv3 几乎没有任何性能优化,一帧图像得跑上好几百秒。那么还是找个有优化的好了。
darknet-nnpack
darknet-nnpack 是一个用 NNPACK 优化过的 Darknet 版本。NNPACK 能够在 ARM 平台上加速神经网络,达到很好的性能。根据 darknet-nnpack 作者的测试,树莓派 4 能够做到 1.4 秒的预测时间。
安装直接参照 repo 说明 即可。安装完成后调用摄像头实时探测可以采用这篇博客的方法:https://funofdiy.blogspot.com/2018/08/deep-learning-with-raspberry-pi-real.html。作者编写了一个脚本,能够实现自动拍照然后送进网络做探测。需要注意的是这个脚本需要用 Python2 运行(我 Python3 就是跑不起来),以及第 39 行需要改成 predictions.jpg
才能正常运作。
最后我成功在树莓派上跑起了 tiny YOLOv3。准确度肯定不用说,为了性能肯定是牺牲了很多。性能方面,我并没有能达到原作者声称的 1.4 秒,而是需要平均 2.4 秒的预测时间。不知道哪里出了差错。
下一步
能够成功运行 YOLOv3 之后,下一步我想要尝试更快的网络。如何去寻找一些为了 ARM 设备优化的深度学习库呢?很简单,去找手机厂商/互联网厂商做的库。为了在手机端更快运行,他们都会做超级多底层优化,能够实现非常好的性能。如果支持移植到树莓派,那正好就是我们的不二之选。
一番搜索和挑选,我最后选择尝试以下框架:
- Paddle Lite (By Baidu)
- Tensorflow Lite (By Google)
- ncnn (By Tencent)
- MACE (By Xiaomi)
下篇博客继续。
#tech notes
3185 words