使用 TensorFlow 和 Raspberry Pi 创建实时对象跟踪摄像头

通过构建经济实惠的便携式计算机视觉和运动跟踪系统,开始使用机器学习。
193 位读者喜欢这篇文章。
Vector, generic Raspberry Pi board

您是否刚开始接触机器/深度学习、TensorFlow 或 Raspberry Pi?

我创建了 rpi-deep-pantilt 作为一个在野外进行对象检测的互动演示,在本文中,我将向您展示如何重现下面的视频,该视频描绘了一个摄像头平移和倾斜以跟踪我在房间内的移动。

Real-time tracking setup

Raspberry Pi 4GB, Pi Camera v2.1, Pimoroni Pan-Tilt HAT, Coral Edge TPU USB 加速器

本文将涵盖

  1. 构建材料和硬件组装说明。
  2. TensorFlow Lite 对象检测模型 (MobileNetV3-SSD) 部署到 Raspberry Pi
  3. 使用比例-积分-微分 (PID) 控制器向云台/倾斜伺服电机发送跟踪指令。
  4. 使用 Coral 的 USB Edge TPU 加速器Edge TPU 编译器加速任何 TensorFlow Lite 模型的推理。

术语和参考

  • Raspberry Pi 一种小型、经济实惠的计算机,在教育工作者、硬件爱好者和机器人爱好者中很受欢迎。
  • Raspbian Raspberry Pi 基金会的 Pi 官方操作系统。Raspbian 衍生自 Debian Linux。
  • TensorFlow 一种用于 数据流 编程的开源框架,用于机器学习和深度神经学习。
  • TensorFlow Lite 一种用于在移动和嵌入式设备上部署 TensorFlow 模型的开源框架。
  • 卷积神经网络 CNN 是一种神经网络架构,非常适合图像分类和对象检测任务。
  • 单次检测器 SSD 是一种 CNN 架构,专门用于实时对象检测、分类和边界框定位。
  • MobileNetV3 一种最先进的计算机视觉模型,针对在适度的手机处理器上的性能进行了优化。
  • MobileNetV3-SSD 一种基于 MobileNet 架构的 SSD。本教程将使用通过 TensorFlow 的对象检测模型库提供的 MobileNetV3-SSD 模型。

    Comparison of computer vision neural networks

    计算机视觉神经网络的比较

  • Edge TPU 张量处理单元 (TPU) 是一种集成电路,用于加速 TensorFlow 执行的计算。Edge TPU 的开发旨在为“边缘”的移动和嵌入式设备提供小巧的尺寸。
Cloud TPUv1
Cloud TPUv2
Edge TPUs

云 TPU(左图和中图)加速 TensorFlow 模型训练和推理。Edge TPU(右图)加速移动设备中的推理。

构建列表

必需

可选

正在寻找移动部件较少的项目?查看 便携式计算机视觉:Raspberry Pi 上的 TensorFlow 2.0,创建一个手持式图像分类器。

设置 Raspberry Pi

有两种方法可以将 Raspbian 安装到您的 MicroSD 卡

  1. NOOBS(“全新开箱即用软件”)是一个 GUI 操作系统安装管理器。如果这是您的第一个 Raspberry Pi 项目,我建议从这里开始。
  2. 将 Raspbian 镜像写入 SD 卡.

本教程和支持软件是使用 Raspbian (Buster) 编写的。如果您使用的是不同版本的 Raspbian 或其他平台,您可能会遇到一些问题。

在继续之前,您需要

安装软件

  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. 从社区构建的 wheel 安装 TensorFlow 2.0
    $ pip install https://github.com/leigh-johnson/Tensorflow-bin/blob/master/tensorflow-2.0.0-cp37-cp37m-linux_armv7l.whl?raw=true
  6. 安装 rpi-deep-pantilt Python 包
    $ python3 -m pip install rpi-deep-pantilt

组装 Pan-Tilt HAT 硬件

如果您购买了预组装的 Pan-Tilt HAT 套件,您可以跳到下一节。否则,请按照 组装 Pan-Tilt HAT 中的步骤进行操作,然后再继续。

连接 Pi Camera

  1. 关闭 Raspberry Pi。
  2. 找到 USB 模块和 HDMI 模块之间的摄像头模块。
  3. (轻轻地)向上拉,解锁黑色塑料夹。
  4. 插入摄像头模块的排线(金属连接器背对 Raspberry Pi 4 上的以太网/USB 端口)。
  5. 锁定黑色塑料夹。

Getting started with the Pi Camera

启用 Pi Camera

  1. 打开 Raspberry Pi。
  2. 运行 sudo raspi-config 并从 Raspberry Pi 软件配置工具的主菜单中选择Interfacing Options(接口选项)。按 Enter 键。

    Raspberry Pi Software Configuration Tool
  3. 选择 Enable Camera(启用摄像头)菜单选项,然后按 Enter 键。

    Enable Camera
  4. 在下一个菜单中,使用右箭头键突出显示 Enable(启用),然后按 Enter 键。

    Enable Raspberry Pi Camera

测试 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 安装正确,您应该看到两个伺服电机在测试运行时以平滑的正弦运动移动。

Pan-Tilt HAT in motion

测试 Pi Camera

接下来,通过启动摄像头的预览叠加层来验证 Pi Camera 是否安装正确。叠加层将在 Pi 的主显示器 (HDMI) 上渲染。

  1. 将您的 Raspberry Pi 插入 HDMI 屏幕。
  2. SSH 进入您的 Raspberry Pi。
  3. 激活您的虚拟环境
    $ source .venv/bin/activate
  4. 运行
    $ rpi-deep-pantilt test camera
  5. 使用 Ctrl+C 退出测试。

如果 Pi Camera 安装正确,您应该在 HDMI 或复合显示器上看到来自摄像头的画面。

测试对象检测

接下来,验证您是否可以在 Raspberry Pi 上运行对象检测模型 (MobileNetV3-SSD)。

  1. SSH 进入您的 Raspberry Pi。
  2. 激活您的虚拟环境
    $ source .venv/bin/activate
  3. 运行
    $ rpi-deep-pantilt detect

您的 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’]

以 ~8FPS 跟踪对象

这是您一直在等待的时刻!采取以下步骤,使用 Pan-Tilt HAT 以大约每秒八帧 (FPS) 的速度跟踪对象。

  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 (4GB) 上,我将我的模型基准测试在大约 8FPS。

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

使用 Edge TPU 实时跟踪对象

您可以使用 Coral 的 USB 加速器 加速模型推理速度。USB 加速器包含一个 Edge TPU,它是一个 ASIC 芯片,专门用于 TensorFlow Lite 操作。有关更多信息,请查看 USB 加速器入门

  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. 尝试使用 --edge-tpu 选项的 detect 命令。您应该能够实时检测对象!
    $ rpi-deep-pantilt detect --edge-tpu --loglevel=INFO

    请注意,loglevel=INFO 将显示对象检测的 FPS 以及边界框渲染到 Raspberry Pi Camera 叠加层的 FPS。



    您应该看到大约 ~24FPS,这是从 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 Controller Architecture

TensorFlow 模型库

本教程中的模型源自 ssd_mobilenet_v3_small_cocossd_mobilenet_edgetpu_coco,位于 TensorFlow 检测模型库中。

我的模型可通过 GitHub 版本说明leigh-johnson/rpi-deep-pantilt 中下载。

我添加了自定义的 TFLite_Detection_PostProcess 操作,该操作在模型输出上实现了非极大值抑制 (NMS) 的变体。NMS 是一种使用集合运算过滤许多边界框提议的技术。

Non-maximum Suppression (NMS)

特别感谢和致谢

  • MobileNetEdgeTPU SSDLite 贡献者:Yunyang Xiong, Bo Chen, Suyog Gupta, Hanxiao Liu, Gabriel Bender, Mingxing Tan, Berkin Akin, Zhichao Lu, Quoc Le
  • MobileNetV3 SSDLite 贡献者:Bo Chen, Zhichao Lu, Vivek Rathod, Jonathan Huang
  • 感谢 Adrian Rosebrock 撰写了 使用 Raspberry Pi 和 OpenCV 进行云台/倾斜面部跟踪,这是整个项目的灵感来源
  • 感谢 Jason Zaman 审阅本文和早期候选版本

本文最初发表在 Towards Data Science Medium 频道上,并经许可重复使用。

接下来阅读什么
User profile image.
Leigh 是 Slack 的 Staff 机器学习工程师,并被公认为 Google 机器学习专家。她是 GDG Cloud San Francisco 和 Django Girls 的组织者。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.