作者 | Leigh Johnson
来源 | Medium
编辑 | 代码医生团队
第1部分-简介
创建了rpi-deep-pantilt 作为野外目标检测的交互式演示。
https://github.com/leigh-johnson/rpi-deep-pantilt
将在下面展示如何重现视频,该视频描绘了摄像机平移和倾斜以跟踪在整个房间中的运动。
将介绍以下内容:
边缘TPU:张量处理单元(TPU)是用于加速 TensorFlow执行的计算的集成电路。该边缘TPU与小尺寸发展,为移动和嵌入式设备“边缘”
在Google Cloud Next '18上存储TPUv1,TPUv2(上,中)。云TPU加快了TensorFlow模型的训练和推理。边缘TPU以美分计(下)。边缘TPU加快了移动设备中的推理速度。
第2部分-生成清单
必要
可选的
第3部分-Raspberry Pi安装
可以通过两种方式将Raspbian安装到Micro SD卡上:
本教程和支持软件是使用R aspbian(Buster)编写的。如果使用的是其他版本的Raspbian或其他平台,则可能会遇到一些麻烦。
在继续之前,需要:
https://projects.raspberrypi.org/en/projects/raspberry-pi-using/4
https://www.raspberrypi.org/documentation/remote-access/ssh/
第4部分-软件安装
1.安装系统依赖项
$ sudo apt-get update && sudo apt-get install -y python3-dev libjpeg-dev libatlas-base-dev raspi-gpio libhdf5-dev python3-smbus
2.创建一个新的项目目录
$ mkdir rpi-deep-pantilt && cd rpi-deep-pantilt
3.创建一个新的虚拟环境
$ python3 -m venv .venv
4.激活虚拟环境
$ source .venv/bin/activate && python3 -m pip install --upgrade pip
5.安装rpi-deep-pantilt Python软件包
$ python3 -m pip install rpi-deep-pantilt
第5部分-Pan Tilt HAT硬件组装
如果购买了预组装的 Pan-Tilt HAT套件,则可以跳至下一部分。
否则,请在继续之前按照组装Pan-Tilt HAT中的步骤进行操作。
https://learn.pimoroni.com/tutorial/sandyj/assembling-pan-tilt-hat
第6部分-连接Pi相机
图片来源:Pi相机入门
第7部分-启用Pi相机
1.开启Raspberry Pi
2.运行sudo raspi-config并Interfacing Options从Raspberry Pi软件配置工具的主菜单中选择。按ENTER。
3.选择Enable Camera菜单选项,然后按Enter。
4.在下一个菜单中,使用右箭头键突出显示ENABLE并按ENTER。
第8部分-测试Pan Tilt HAT
接下来,测试Pan-Tilt HAT模块的安装和设置。
1.SSH进入Raspberry Pi
2.激活虚拟环境:
source .venv/bin/activate
3.运行以下命令:
rpi-deep-pantilt test pantilt
4.使用Ctrl + C退出测试
如果正确安装了HAT,则应该在测试运行时看到两个伺服器均以平滑的正弦曲线运动。
第9部分-测试Pi相机
接下来,通过启动相机的预览图来验证Pi相机是否已正确安装。叠加层将在Pi的主显示屏(HDMI)上呈现。
1.将Raspberry Pi插入HDMI屏幕
2.SSH进入Raspberry Pi
3.激活虚拟环境:
$ source .venv/bin/activate
4.运行以下命令:
$ rpi-deep-pantilt detect
5.使用Ctrl + C退出测试
如果正确安装了Pi摄像机,则应该可以看到从摄像机渲染到HDMI或复合显示器的画面。
第10部分—测试对象检测
接下来,验证可以在Raspberry Pi上运行对象检测模型(MobileNetV3-SSD)。
1.SSH进入Raspberry Pi
2.激活虚拟环境:
$ source .venv/bin/activate
3.运行以下命令:
$ rpi-deep-pantilt detection
Raspberry Pi应该检测对象,尝试对对象进行分类,并在其周围绘制边框。
注意:使用默认的MobileNetV3-SSD模型只能检测和跟踪以下对象。
$ rpi-deep-pantilt list-labels
[‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘airplane’, ‘bus’, ‘train’, ‘truck’, ‘boat’, ‘traffic light’, ‘fire hydrant’, ‘stop sign’, ‘parking meter’, ‘bench’, ‘bird’, ‘cat’, ‘dog’, ‘horse’, ‘sheep’, ‘cow’, ‘elephant’, ‘bear’, ‘zebra’, ‘giraffe’, ‘backpack’, ‘umbrella’, ‘handbag’, ‘tie’, ‘suitcase’, ‘frisbee’, ‘skis’, ‘snowboard’, ‘sports ball’, ‘kite’, ‘baseball bat’, ‘baseball glove’, ‘skateboard’, ‘surfboard’, ‘tennis racket’, ‘bottle’, ‘wine glass’, ‘cup’, ‘fork’, ‘knife’, ‘spoon’, ‘bowl’, ‘banana’, ‘apple’, ‘sandwich’, ‘orange’, ‘broccoli’, ‘carrot’, ‘hot dog’, ‘pizza’, ‘donut’, ‘cake’, ‘chair’, ‘couch’, ‘potted plant’, ‘bed’, ‘dining table’, ‘toilet’, ‘tv’, ‘laptop’, ‘mouse’, ‘remote’, ‘keyboard’, ‘cell phone’, ‘microwave’, ‘oven’, ‘toaster’, ‘sink’, ‘refrigerator’, ‘book’, ‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’]
第11部分-以约8 FPS的速度跟踪对象
这是大家一直在等待的时刻!采取以下步骤,使用Pan-Tilt HAT以大约8帧/秒的速度跟踪对象。
1.SSH进入Raspberry Pi
2.激活虚拟环境:
$source .venv/bin/activate
3.运行以下命令:
$ rpi-deep-pantilt track
默认情况下,这将跟踪带有标签的对象person。可以使用--label参数跟踪其他类型的对象。
例如,要跟踪香蕉,可以运行:
$ rpi-deep-pantilt track --label=banana
在Raspberry Pi 4(4 GB)上,以大约每秒8帧的速度对模型进行基准测试。
INFO:root:FPS: 8.100870481091935
INFO:root:FPS: 8.130448201926173
INFO:root:FPS: 7.6518234817241355
INFO:root:FPS: 7.657477766009717
INFO:root:FPS: 7.861758172395542
INFO:root:FPS: 7.8549541944597
INFO:root:FPS: 7.907857699044301
第12部分-使用Edge TPU实时跟踪对象
可以使用Coral的USB Accelerator加快模型推断的速度。USB加速器包含Edge TPU,这是专用于TensorFlow Lite操作的ASIC芯片。有关更多信息,请查看USB Accelerator入门。
https://coral.ai/docs/accelerator/get-started/
1.SSH进入Raspberry Pi
2.安装Edge TPU运行时
$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-get update && sudo apt-get install libedgetpu1-std
3.插入Edge TPU(最好使用USB 3.0端口)。如果Edge TPU已经插入,请删除并重新插入,以便udev设备管理器可以检测到它。
4.尝试使用带有选项的detect命令--edge-tpu。应该能够实时检测物体!
$ rpi-deep-pantilt detect --edge-tpu --loglevel=INFO
注意:loglevel=INFO 将显示检测对象的FPS,并将边界框渲染到Raspberry Pi Camera的叠加层。
应该会看到大约24 FPS,这是从Pi Camera采样帧到帧缓冲区的速率。
INFO:root:FPS: 24.716493958392558
INFO:root:FPS: 24.836166606505206
INFO:root:FPS: 23.031063233367547
INFO:root:FPS: 25.467177106703623
INFO:root:FPS: 27.480438524486594
INFO:root:FPS: 25.41399952505432
5.尝试使用带有--edge-tpu选项的track命令。
$ rpi-deep-pantilt track --edge-tpu
总结
现在是DIY对象跟踪系统的骄傲拥有者,该系统使用单发检测器(一种卷积神经网络)对对象进行分类和定位。
PID控制器
平移/倾斜跟踪系统使用比例积分微分控制器(PID)控制器来平滑跟踪边界框的质心。
PID控制器架构,雷·约翰逊(Leigh Johnson)2019
TensorFlow Model Zoo
本教程中的模型源自TensorFlow Detection Model Zoo中的ssd_mobilenet_v3_small_coco和ssd_mobilenet_edgetpu_coco。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
模型可以通过Github下载。
https://github.com/leigh-johnson/rpi-deep-pantilt
添加了自定义的TFLite_Detection_PostProcess操作,该操作在模型输出上实现了非最大抑制(NMS)的变体。非最大抑制是一种使用set操作过滤许多边界框建议的技术。
图片来源:非最大抑制(NMS)
特别感谢
https://www.pyimagesearch.com/2019/04/01/pan-tilt-face-tracking-with-a-raspberry-pi-and-opencv/