对象检测是机器视觉领域最常用的功能之一,即对探测的目标分辨出是何物,本教程使用当前最常用的单片机树莓派3B+,设置安装tensorflow并实现利用较小的神经网络SSDLite-MobileNet进行识物。
本教程参考了国外一个大神的GitHub,并对其中的相关错误进行纠正以及补充,主要工作有利用虚拟环境实现更好的python环境管理,纠正相关错误。这篇教程适合深度学习初学者,通过这篇教程,你将实现tensorflow的安装、opencv的安装、虚拟环境的使用、深度网络的调用与使用,最终实现让你的树莓派实现辨物的智慧。
树莓派安装Tensorflow并利用SSDLite-MobileNet实现object detection效果
情按照一下教程步骤实现,如不意外时间约为半天。update(2020.5.12)
首先,Raspberry Pi需要完全更新。打开终端并发出:
sudo apt-get update
sudo apt-get upgrade
在您的主目录,创建一个名为“ tensorflow”的目录,并将其cd进入。
mkdir tensorflow
cd tensorflow1
通过git clone命令从GitHub下载tensorflow存储库:
git clone --depth 1 https://github.com/tensorflow/models.git
本指南的其余部分将在此/ home / pi / tensorflow目录中工作。下一步是创建一个称为“ tf-env”的虚拟环境。
在本指南中使用的是虚拟环境,因为它可以防止您的Pi上已经安装的软件包库版本之间发生任何冲突。将其安装在自己的环境中可以避免此问题。
通过发出以下命令安装virtualenv:
sudo pip3 install virtualenv
然后,通过发出以下命令来创建“ tf-env”虚拟环境:
python3 -m venv tf-env
这将在tensorflow目录中创建一个名为tf-env的文件夹。tf-env文件夹将包含此环境的所有软件包库。接下来,通过发出以下命令激活环境:
source tf-env/bin/activate
每次打开新的终端或者重启工作时需要重新激活环境,需要在/ home / pi / tensorflow目录中发出上述命令。
按照原教程走下来会有几个bug,经过多次实践已经一一排除,为了简化操作,我仿照EdjeElectronics的GitHub编写了一个Shell脚本,该脚本将自动下载并安装所有软件包和依赖项。
首先需要下载bash文件
git clone https://github.com/xxlbigbrother/TensorFlow-Object-Detection-on-Raspberry-Pi-Embedded-Visual-Hardware.git
打开文件夹复制tf_get_pi_requirements.sh以及Object_detection_picamera.py到/home/pi/tensorflow/models/research/object_detection目录下。
通过发出以下命令运行bash文件自动安装tensorflow以及opencv:
bash tf_get_pi_requirements.sh
或者逐行运行下列命令行
#!/bin/bash
# 安装tensorflow(1.下载tensorflow 2.安装LibAtlas软件包3~7.安装依赖项)
pip3 install tensorflow
sudo apt-get install libatlas-base-dev
sudo pip3 install pillow
sudo pip3 install lxml
sudo pip3 install jupyter
sudo pip3 install matplotlib
sudo pip3 install cython
#相比于原教程需分开安装,防止漏掉安装pillow以及matplotlib
# 安装opencv(先安装依赖项,这里需要安装老版本3.4.6.27,因为版本4有错误不兼容,import cv2报错)
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 libatlas-base-dev
pip3 install opencv-python==3.4.6.27
将下载超过200M的文件,需要一段时间,如果运行bash tf_get_pi_requirements.sh命令时遇到错误,则可能是由于Internet连接超时或下载的软件包数据已损坏。如果出现错误,请尝试重新运行该命令几次。
这里温馨提示:深夜或者大清晨下载速度较快,达到20~30k/s.
TensorFlow对象检测API使用Protobuf,这是一个实现Google协议缓冲区数据格式的软件包。您以前需要从源代码进行编译,但是现在安装很简单!
sudo apt-get install protobuf-compiler
完成后通过下述命令验证其是否安装成功。您应该得到libprotoc 3.6.1或类似的答复。
protoc --version
接下来,我们需要修改PYTHONPATH环境变量以指向刚下载的TensorFlow信息库内的某些目录。我们希望每次打开终端时都设置PYTHONPATH,因此我们必须修改的.bashrc文件。通过发出以下命令打开它:
sudo nano ~/.bashrc
移至文件末尾,并在最后一行添加:
export PYTHONPATH=$PYTHONPATH:/home/pi/tensorflow1/models/research:/home/pi/tensorflow1/models/research/slim
然后,保存并退出文件。这样一来,每次您打开新终端时都会调用“ export PYTHONPATH”命令,因此将始终正确设置PYTHONPATH变量。关闭,然后重新打开终端。
现在,我们需要使用Protoc来编译对象检测API使用的协议协议(.proto)文件。.proto文件放在/ research / object_detection / protos中,但是我们需要从/ research目录执行命令。执行以下命令:
cd /home/pi/tensorflow1/models/research
protoc object_detection/protos/*.proto --python_out=.
此命令将所有“名称” .proto文件转换为“ name_pb2” .py文件。接下来,进入object_detection目录:
cd /home/pi/tensorflow1/models/research/object_detection
现在,我们将从TensorFlow检测模型库中下载SSD_Lite模型。模型动物园是谷歌的预训练对象检测模型的集合,这些模型具有不同水平的速度和准确性。树莓派的处理器较弱,因此我们需要使用处理能力较小的模型。尽管该模型将运行得更快,但要以降低精度为代价。在本教程中,我们将使用SSDLite-MobileNet,这是最快的模型。
Google不断发布具有改进速度和性能的模型,经常回访模型库,看看是否有更好的模型。
下载SSDLite-MobileNet模型并通过发出以下命令解压缩:
wget http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
tar -xzvf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz
现在,该模型位于object_detection目录中,可以使用了。
好的,现在一切就绪,可以在Pi上执行对象检测!此存储库中的Python脚本Object_detection_picamera.py用于检测来自Picamera或USB网络摄像头的实时供稿中的对象。基本上,脚本会设置模型和标签映射的路径,将模型加载到内存中,初始化Picamera,然后开始对Picamera中的每个视频帧执行对象检测。
python Object_detection_picamera.py
python3 Object_detection_picamera.py --usbcam
脚本初始化后(最多可能需要30秒),您将看到一个窗口,显示相机实时取景。视图内的公共对象将被识别并在其周围绘制一个矩形。
python
import tensorflow as tf
若无报错,即安装成功,若错误,请重新运行bash脚本,可能是下载时间过长断开。
python
import cv2
若无显示导入cv2错误,即安装成功,若错误,请重新运行bash脚本,可能是下载时间过长断开。
该教程识别帧率过低,在0.8帧左右,建议在树莓派使用tensorflowlite以及corel tpu加速器,帧率较高。
博主会录制一期帧率以及效果对比视频,欢迎关注!