运行在树莓派中的scratch3-adapter tensorflow插件

树莓派与Scratch3.0

树莓派目前的浏览器不支持webGL,但scratch3.0需要webGL支持。这篇文章准备让scratch3-adapter运行在树莓派中,而scratch3.0运行在电脑上的chrome浏览器里。

scratch team正在和树莓派社区合作,推出scratch3.0的树莓派版本。所以在未来,你也可以使用树莓派中使用scratch3.0。

当我们允许scratch3.0和scratch3-adapter运行在不同机器上时,我们得到了一些有趣的副产品,诸如支持移动端(ipad/mobile)、分布式运行、远程教育等等。

在树莓派中运行scratch3-adapter

下载scratch3-adapter。建议你重新下载插件,我刚才有更新,修复了一个字节码相关的bug。

下载好之后,给予它运行权限: chmod +x xxx

之后双击运行即可.

建立连接

首先访问: https://raspberrypi.local:12358/

点击高级 > 继续前往raspberrypi.local(不安全)

当你看到hello world就ok了。

打开scratch3.codelab.club, 指定adapter_host参数: https://scratch3.codelab.club/?adapter_host=raspberrypi.local

你将看到,本地的网页已经与树莓派上的scratch3-adapter建立了连接. 之后你就可以在树莓派中构建scratch3-adapter的插件,同时在PC上的scratch3.0中操控它.和本地插件没有区别。

如果你在windows下打开scratch3.0,将raspberrypi.local替代为你的树莓派的IP。

对于mac/linux用户,如果你没有修改树莓的hostname,可以直接使用raspberrypi.local,作为adapter_host.

如果windows用户也不想每次去找树莓派的IP,需要安装Bonjour Print Services (Windows),之后raspberrypi.local就会直接指向树莓派。这部分涉及到mDNS

在树莓派安装依赖(tensorflow及其他)

scratch3-adatper默认启动为图形界面模式,所以你需要在图形界面中操作。我们之后会推出cli版本。

如果你希望一切都在浏览器中操作,可以使用noVNC,在浏览器中操作树莓派的桌面。

安装 tensorflow

tensorflow只是一个普通的Python库,scratch3-adatper允许使用Python构建插件,来拓展scrtach3.0的能力。所以这部分没有任何特殊性。构建AI插件和构建普通插件没有区别。你可以参考目前已有的插件例子:scratch3_adapter_extensions

在树莓派中安装tensorflow已经变得非常简单,tensorflow 1.9之后官方正式支持树莓派, 安装只需运行两行命令:

sudo apt install libatlas-base-dev
pip3 install tensorflow pyzmq --user

使用python3运行以下代码,看是否安装成功:

# python3
import tensorflow as tf
tf.enable_eager_execution()
hello = tf.constant('Hello, TensorFlow!')
print(hello) # tf.Tensor(b'Hello, TensorFlow!', shape=(), dtype=string)

安装opencv

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install qt4-dev-tools
pip3 install opencv-python --user

安装 Protobuf

如果你想使用tensorflow/models,你就需要安装protobuf-compiler。

sudo apt-get install protobuf-compiler

其他

pip3 install matplotlib pyzmq --user

运行物体识别程序

Set up TensorFlow Directory Structure and PYTHONPATH Variable往下做相应配置。

配置好之后你应该就能在树莓派上运行Object_detection_usb_cam.py 而不报错。

程序目前使用usb摄像头,如果你想使用树莓派官方的摄像头,需要做些调整。

以上这些步骤与scratch3-adapter无关,是在树莓派中用tensorflow运行物体识别程序需要的步骤,挺繁琐的。

ps: 我们之后写一篇文章讲解在opencv中跑神经网络,而不用tensorflow,将省去很多繁琐步骤。

完成之后,我们就可以开始在scratch3-adapter中写插件了。

构建scratch3-adapter插件

首先把tensorflow物体识别程序放到用户目录下:

cd ~
wget https://raw.githubusercontent.com/wwj718/TensorFlow-Object-Detection-on-the-Raspberry-Pi/master/Object_detection_for_adapter.py

~/scratch3_adapter/extensions/构建extension_tensorflow.py:

import time
import zmq
from zmq import Context
import subprocess

from scratch3_adapter.core_extension import Extension
from scratch3_adapter import settings


class TensorflowExtension(Extension):
    def __init__(self):
        name = type(self).__name__ # class name
        super().__init__(name)

    def run(self):
        # REP
        port = 38779
        context = Context.instance()
        socket = context.socket(zmq.REP)
        socket.bind("tcp://*:%s" % port)
        # Object_detection_for_adapter.py 依赖于shell中的变量,所以需要在命令行里启动
        cmd = "/usr/bin/python3 /home/pi/Object_detection_for_adapter.py"
        tf = subprocess.Popen(cmd , shell = True)
        while self._running:
            tf_class = socket.recv_json().get("class")
            socket.send_json({"status":"200"})
            # 发往scratch3.0中的eim积木
            self.publish({"topic": "eim", "message": tf_class})
        # release socket
        tf.terminate()
        tf.wait()
        socket.close()
        context.term()

export = TensorflowExtension

搞定。

之后双击启动extension_tensorflow插件就行。

注意: tensorflow的model在在树莓派中加载很慢,所以从运行插件,到你看到摄像头被激活,可能有几秒钟时间。

tips

每次退出scratch3-adapter,记得取消勾选extension_tensorflow,不关闭这个进程,树莓派的很多计算资源仍然会被它占用。

如果你不慎直接退出了scratch3-adapter,可以通过ps aux |grep adapter查杀Object_detection_for_adapter.py

展示

提醒

[scratch3-adapter tensorflow插件](http(s://blog.just4fun.site/adapter-tensorflow.html)除了用于树莓派中,也完全可用在电脑上。需要对资源(model)路径做些调整(使用绝对路径)。

运行在笔记本上,处理速度要快很多。

todo

在未来,我们会直接发布内置scratch3-adapter的树莓派镜像,支持tensorflow/opencv/dlib/gpio。开箱即用,只需要将树莓派接入局域网(将内置wifi-connect来简化wifi连接),你就可以立刻用scratch3.0来为它编程。

参考




Fork me on GitHub