本教程的灵感来源于谷歌云负责维护开发者关系的Kaz Sato制作的一个“猜拳机器”教程[1],见下图。该教程使用弯曲传感器和Tensorflow来识别猜拳手势,然后选择相应的选项:石头、剪刀、布。该项目还上了大名鼎鼎的谷歌大脑负责人Jeff Dean关于谷歌大脑在2017年的进展回顾里[2]。
图1
我想既然已经使用了Tensorflow,为什么不使用摄像头和卷积神经网络来识别手势,以实现同样的功能呢?
说干就干,本教程准备使用Tensorflow+树莓派,通过摄像头获取手势图片,然后通过卷积神经网络来识别手势。这里的主要难点是做到“实时和准确”:为了使人感觉不出有明显的延迟,处理时间必须保持在40ms以内(25fps),而且识别的精度也必须足够高,估计要95%以上。
本教程使用笔记本电脑进行模型的训练,使用树莓派进行模型的部署。这里假定读者对树莓派和Tensorflow有一定的了解。关于树莓派系统的安装和基本知识、摄像头以及舵机的使用,这里就不多做介绍;另外,Tensorflow在电脑端的安装和操作也不多作介绍。
这里先奉上最后的成果:
软硬件配置
本教程的电脑端使用的软硬件配置如下:
笔记本:ThinkPad E430C
操作系统: Windows 7
Python版本: 3.5.3
Tensorflow版本: 1.5.0
树莓派端的软硬件配置如下:
树莓派: 树莓派3 Model B
操作系统: 16g内存卡,2017-11-29-raspbian-stretch
摄像头: CSI接口 500万像素
Python版本: 2.7.0
Tensorflow版本: 1.1.0
舵机: 辉盛SG90
这里的配置都不是必须一样的,也不是最优的,而是因为我的电脑和树莓派现在的版本刚好是现在的样子。组装好的硬件系统如下所示:
图2
第一步: 树莓派安装OpenCV和Tensorflow
OpenCV的安装比较简单,依次输入以下代码即可
sudo apt-get update
sudo apt-get upgrade #更新系统
sudo apt-get install libopencv-dev
sudo apt-get install python-opencv
如果要安装Tensorflow的最新版本,需要从源代码进行编译,比较费时间。这里使用大神sanjabrahams[3]为树莓派预编译的二进制版本进行安装。现在的预编译的最新版本是Tensorflow 1.1.0,但已经够用了。安装步骤如下:
安装pip, python-dev
sudo apt-get install python-pip
sudo apt-get install python-dev
使用Python 2.7安装
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
如果因为网络原因无法下载上述预编译的文件,可以到下面的百度网盘下载
链接:https://pan.baidu.com/s/1pMKyDg3 密码:4nqr
第二步: 收集数据
一般来说,深度学习的数据都是比较贵的。但是,在本教程中,数据比较廉价,打开摄像头,在图2的背景板前做“石头、剪刀、布”手势即可获取足够多的数据。为了识别时精度比较高,确保你的手势出现在背景板前的不同位置。获取的部分数据如下:
图3
接着,将上述数据进行手工分类,分别存放在四个类别的文件夹中,我这里按照“石头、剪刀、布和其他”的