材料表
Raspberry Pi 4 (4GB)
(182-2096)
SD卡(16G)
(174-7337)
网络摄影机
(125-4274)
Mini HDMI传输线
(176-5748)
.
屏幕、键盘、鼠标

实现影像分类分成几个步骤:

在TM网页中搜集数据,训练模型,在网站中实时影像分类。

导出模型及卷标文件。

至树莓派官网下载最新版本的RPi4映像档。

安装模型框架Tensorflow Lite。

安装OpenCV套件。

实现影像分类于RPi4。

了解以上步骤后,其建置RPi4环境的时间花得最久,但读者们仍可同步进行,例如:

RPi4在刻录SD卡或安装套件时,又同时在TM网站搜集数据及训练模型。

Teachable Machine ​​Teachable Machine​​™介绍

google+teachable_machine+树莓派4B_python


TM网站可供初学者认识AI人工智能的神经网络应用平台,主要是以「监督式学习Supervised learning」建置而成的训练平台。目前网站针对使用者提供三种不同的AI应用,分别是影像分类项目(Image Project)、声音辨识项目(Audio Project) 与身体姿态辨识项目(Pose Project),也提供了Tensorflow、Tensorflow.js与Tensorflow Lite三种训练模型框架,可供使用者汇入如RPi4的装置来实现边缘运算。

每个项目都被设计成三个步骤,分别是搜集(Gather)、训练(Train) 与汇出(Export)。

google+teachable_machine+树莓派4B_python_02


请选择 「Image Project」开始项目

google+teachable_machine+树莓派4B_python_03


Step1. 在TM网页中搜集数据,训练模型,在网站中实时影像分类。

进入页面后会看到几项操作流程,a.设定卷标及搜集数据、b.训练集及c及时预览功能和导出模型。

google+teachable_machine+树莓派4B_tensorflow_04


google+teachable_machine+树莓派4B_sd卡_05


可直接按下「Record 10 Second」,网页便会倒数计时持续拍摄直到10秒结束,如果认为10秒的张数太少,可以按下齿轮,可以更改秒数等相关参数。初始参数有「24FPS」 (理论值为每秒钟拍24张)、「Hold-to-record OFF」(关闭手动拍摄)、「Delay: 2 seconds」(2秒后才开始拍摄)、「Duration: 10 second 」(拍摄10秒钟,理论值约可拍摄240张,但实际上要取决于网页执行效能),本文将秒数调成25秒,可以删掉一些拍摄失败的照片,再者也可以使数据量丰富。

google+teachable_machine+树莓派4B_tensorflow_06


按下「Save Setting」à 「Record 25 seconds」,开始拍摄,拍摄完成可将拍得不好或模糊的图片删除。

google+teachable_machine+树莓派4B_tensorflow_07


本文建立了5种类别,分别是「mouse」、「nothing」、「RaspberryPi」、「PEN」、「Bruce Lee」,但有一个种类必须要建立的是「nothing」,意思是没有照到「mouse」、「RaspberryPi」、「PEN」、「Bruce Lee」时的情形。当初笔者忘了建立「nothing」种类,当没有照到物品时,就会一直认为「mouse」。

google+teachable_machine+树莓派4B_sd卡_08


要分辨的影像张数尽量不要相差太远,本文接近约莫300张左右,在「nothing」类别较多张是为了没有照到的影像都要视为「nothing」,故照了很多「mouse」、「RaspberryPi」、「PEN」、「Bruce Lee」以外的照片。

接下来是训练模型,按下「Train Model」即可。但要修改参数,请按下「Advanced」,预设参数有「Epochs :50」(50个训练回合)、「Batch Size: 16」(批次大小)、「Learning Rate:0.001」(学习率),以下分别说明。

Epochs:

训练的回合设定,训练回合数和时间成正比,若要针对细微变化的差异进行辨识时则要提高回合数,会助于模型辨识效能,但特别要注意的是过高的回合数可能会使模型产生「过适Overfitting」的问题,若是过低的回合数会产生「乏适Underfitting」的问题,但无论是甚么问题都会降低模型辨识效能。

Batch Size:

适当的批次大小设定有助于模型的优化,而且可以提高训练的速度,及减少训练误差。

Learning Rate:

学习率设定影响着训练模型寻找最佳解的过程中是否会收敛或发散。若设定过大,虽会快速收敛,但也可能难以收敛产生震荡甚至发散;相对的,设定过小会导致寻找最佳解时缓慢收敛。读者们若有兴趣,可以搜寻『梯度下降法』。

google+teachable_machine+树莓派4B_sd卡_09


在训练过程中会跑出对话框 ,提醒使用者不要更动到标签类别以免影响训练。

google+teachable_machine+树莓派4B_python_10


训练完成后即可在网页上作及时的影像推论,影像来源除了根据摄影机之外,还可以从计算机端及Google云端汇入照片进行对象辨识。

google+teachable_machine+树莓派4B_python_11


Step2. 导出模型及卷标文件

按下「Export Model」后可导出模型文件及卷标文件

google+teachable_machine+树莓派4B_sd卡_12


请选「Tensorflow Lite」à「Quantized」à「Download my model」。「Floating point」格式建议在个人计算机的环境操作;「Quantized」格式适合在像Raspberry Pi的单板计算机操作则有最佳效能;「Edge TPU」格式则仅限于Google Coral 的系列产品,如: Google Coral USB Accelerator 或 Google Coral Dev Board 的产品上。

google+teachable_machine+树莓派4B_tensorflow_13


Step3. 至树莓派官网下载最新版本的RPi4映像档。

请到 https://www.raspberrypi.org/downloads/raspbian/ 下载 「Raspbian Buster with desktop」,此版本为桌面简易版,没有多余的软件,且较不占SD卡空间。下载至计算机后,须将档案解压缩,再准备一张16G的SD卡,利用Win32 Disk Imager 软件(下载点: https://sourceforge.net/projects/win32diskimager/)刻录至SD卡中。

google+teachable_machine+树莓派4B_python_14


a部分先选择RPi4 的映像档;b部分选择刻录SD卡的磁盘位置(要小心不要选错,以免烧错扇区);c部分则选择数据到「装置」,将映像档刻录至SD卡内。刻录完成后可将SD卡插至RPi4 卡槽后,但先别急着开机,而是先将RPi4链接到屏幕再开机,否则开机后再接屏幕是没有画面的,最后在接上键盘、鼠标即可,这样较好设定网络。将网络和地区都设定好之后,请开启RPi4图示à「Preferences」à「Raspberry Pi configuration」à「Interfaces」,将所有功能开启后重新启动,以便可用远程软件控制RPi4。

google+teachable_machine+树莓派4B_python_15


本文所使用的远程联机软件为MobaXterm (下载处: https://mobaxterm.mobatek.net/download.html) ,此软件优点除了可以远程联机RPi4,也可以对RPi4传输档案,但RPi4必须要和MobaXterm同个网域,开启后请按「Session」à「SSH」à在「Remote host*」输入RPi4 IP(本文IP为192.168.12.56),联机成功会出现「login as:」,请输入预设帐号pi ,再来是默认输入密码raspberry(密码不会显示在画面上),按下Enter即可登入成功。之后的安装套件步骤可直接将指令复制并贴至MobaXterm中。

google+teachable_machine+树莓派4B_tensorflow_16


google+teachable_machine+树莓派4B_sd卡_17


登入RPi4成功画面。

google+teachable_machine+树莓派4B_tensorflow_18


google+teachable_machine+树莓派4B_python_19


Step4. 安装模型框架Tensorflow Lite。

请到https://www.tensorflow.org/lite/guide/python 官方网站下载套件,新下载的RPi4 映像档的版本预设为Raspbian Buster ,Python 版本为3.7版 ,所以在MobaXterm请输入:

$ pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl

(P.S. $指令不需要复制)

google+teachable_machine+树莓派4B_python_20


Step5. 安装OpenCV套件。

扩展文件系统到整张SD卡

首先在MobaXterm输入$ sudo raspi-config

选择"7 Advanced Options" à "A1 Expand filesystem ",重开机。

google+teachable_machine+树莓派4B_python_21


google+teachable_machine+树莓派4B_sd卡_22


删除不必要的软件Wolfram Engine和LibreOffice,非必要做,但可以省下约1G的SD卡容量。$ sudo

apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice *
$ sudo apt-get clean
$ sudo apt-get autoremove

更新及升级所有套件包

$ sudo apt-get update && sudo apt-get upgrade

安装开发者套件CMake 需要用来编译

$ sudo apt-get install build-essential cmake pkg-config

安装有关OpenCV的相依套件

$ sudo apt-get install libjpeg-dev libpng-dev libtiff-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 libgtk-3-dev
$ sudo apt-get install libcanberra-gtk*
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install python3-dev

下载0版至RPi4 。

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.0.zip

并解压缩文件案

$ unzip opencv.zip
$ unzip opencv_contrib.zip

建立opencv 和 opencv_contrib文件夹及将档案投递文件夹内

$ mv opencv-4.0.0 opencv
$ mv opencv_contrib-4.0.0

先在opencv文件夹内建立名为build的文件夹

$ cd ~/opencv
$ mkdir build
$ cd build

使用CMake来设置OpenCV 4环境(从这步骤开始是最花时间)

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF

调整RPi4的SWAP交换空间,来解决编译OpenCV内存不足的问题。

$ sudo nano /etc/dphys-swapfile

google+teachable_machine+树莓派4B_sd卡_23


请把 CONF_SWAPSIZE=100改成 2048重新开启SWAP服务

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

开启四核心编译OpenCV

$ make -j4

安装OpenCV

$ sudo make install
$ sudo ldconfig

重新调整RPi4的SWAP 交换空间

$ sudo nano /etc/dphys-swapfile

将CONF_SWAPSIZE=2048改成 100

重新开启SWAP服务

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

Step6. 实现影像分类于RPi4

将Step2 下载模型及卷标文件解压缩后透过MobaXterm传入RPi4中

google+teachable_machine+树莓派4B_tensorflow_24


汇入OpenCV 档于专案文件夹内

$ cd converted_tflite_quantized/
$ ln -s /usr/local/python/cv2/python-3.7/cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so

google+teachable_machine+树莓派4B_sd卡_25


在RPi4实现影像分类推论!

在执行程序之前需要下载分类器的档案,连结: https://reurl.cc/4R3dVL

连接上Webcam 至RPi4 USB中,本文范例是将下列指令写入RPi4的Terminal里执行,读者们亦可输入至MobaXterm。

$ python3 TM2_tflite.py --model model.tflite --labels labels.txt

则可成功开启画面。如果执行不成功则需要多尝试几次,检查摄像头是否使能,摄像头最好插在蓝色的USB口的第一个,如果仍然不成功

​可去这个网址查看​

执行

wget https://github.com/TMRH20/RF24/archive/master.zip 
sudo apt-get install libboost-python-dev
cd RF24-master
. /configure --driver=RPi
make
sudo make install
cd pyRF24
sudo python setup.py install
sudo python3 setup.py install

再重复以上步骤

cd gcs

gcs为.py文件夹

python3 TM2_tflite.py --model model.tflite --labels labels.txt

google+teachable_machine+树莓派4B_sd卡_26


google+teachable_machine+树莓派4B_python_27


​参考地址​

不能开启摄像头时
sudo raspi-config
配置好finish
然后将命令多运行几遍