使用 OpenMV 构建基于 TensorFlow Lite 的计算机视觉表情符号输入设备
2022 年 11 月 29 日

来自 Sandeep Mistry 的客座文章,Arm

简介

表情符号使我们能够在数字世界中表达情感,它们在配备触摸屏虚拟键盘的智能手机和平板电脑设备上相对容易输入,但它们在具有物理键盘的传统计算设备上并不那么容易输入。 要在这些设备上输入表情符号,用户通常使用键盘快捷键或鼠标调出屏幕表情符号选择器,然后使用鼠标从一系列类别中选择所需的表情符号。

本博客将重点介绍一个深入的开源指南,该指南在基于 Arm Cortex-M 的设备上使用 tinyML 创建一个专用输入设备。 该设备将从摄像头获取实时输入,并应用机器学习 (ML) 图像分类模型来检测摄像头图像中是否包含一组已知的 手势(✋、👎、👍、👊)。 当以高确定性检测到手势时,该设备将使用 USB 人机界面设备 (HID) 协议 在 PC 上“输入”表情符号。

带有 Arm CMSIS-NN用于微控制器的 TensorFlow Lite 运行时被用作专用输入设备上的设备上 ML 推理框架。 设备上推理将使我们能够减少系统的延迟,因为图像数据将在源头进行处理(而不是传输到云服务)。 用户的隐私也将得到保护,因为在推理时不会有图像数据离开设备。

注意: 完整的深入互动教程可在 Google Colab 上找到,该指南的所有技术资产都可以在 GitHub 上找到。

微控制器和键盘

微控制器单元 (MCU) 是嵌入在您每天使用的设备(包括您的键盘!)中的自包含计算系统。 与所有计算系统一样,它们具有输入和输出。

USB 键盘内部的 MCU 对键盘上的一个或多个键开关按下或释放时发生的数字事件做出反应。 MCU 确定触发事件的键,然后将事件转换为 USB HID 消息,并使用 USB 标准发送到 PC。
Block diagram of USB keyboard
USB 键盘的框图
表情符号“键盘”将使用图像传感器作为输入(而不是键开关),然后在功能更强大的 Arm Cortex-M7 基微控制器上本地处理图像数据。 所有操作,包括 ML 推理,都在 STM32H7 MCU 上执行,该 MCU 包含 Arm Cortex-M7 CPU 以及用于图像传感器和 USB 通信的数字接口。
Block diagram of computer vision based emoji 'keyboard'
基于计算机视觉的表情符号“键盘”的框图
即使 STM32 H7 是一个受限的计算平台,以 480 MHz 的速度运行,拥有 1 MB 的板载 RAM - 我们仍然可以以略低于 20 帧每秒 (fps) 的速度处理来自摄像头的 96x96 像素灰度图像输入!

OpenMV 开发平台

OpenMV 是一个开源的 (Micro) Python 驱动的机器视觉平台。 OpenMV 产品线 包括几个基于 Arm Cortex-M 的开发板。 每个板都配备了板载摄像头和 MCU。 对于此项目,OpenMV Cam H7OpenMV Cam H7 R2 板将满足我们的需求。

我们需要什么

OpenMV Cam H7 摄像头(左)和 microSD 卡(右)
  • 硬件

数据集

Kaggle 用户 Sparsh Gupta (@imsparsh) 之前已经策划并分享了一个优秀的 手势识别数据集,并在 Kaggle 上以宽松的 CC0 1.0 通用 (CC0 1.0) 公共领域许可 公开提供。

该数据集包含约 23,000 个图像文件,其中包含人们在 30 秒内执行各种手势的图像。

将需要对数据集中的图像进行如下重新标记

原始标签

新标签

  1. 左手滑动

  2. 右手滑动

  3. 拇指向下

  4. 拇指向上

  1. 🚫 - 无手势

  2. ✋ - 手举起

  3. 👎 - 拇指向下

  4. 👍 - 拇指向上

  5. 👊 - 拳头


由于 Kaggle 数据集中的向右滑动和向左滑动手势与这些类别中的任何一个都不对应,因此需要丢弃这些类别中的任何图像以用于我们的模型。

Kaggle 数据集中的图像是在 30 秒内拍摄的,它们可能在系列的开头或结尾包含其他手势。 例如,数据集中的某些人从拳头位置开始,然后最终转为标记的手势举起、向上和向下。 或者,数据集中的某些人从没有手势在帧中开始。

我们已经提前将图像手动重新标记到这些类别中,它可以在 CSV 格式中找到,位于 GitHub 上的数据文件夹 中,并包含约 14,000 个图像的标签。

TensorFlow 模型

您可以在 此 Colab 笔记本 中找到有关此处使用的训练管道的更多详细信息。

加载和增强图像

可以使用 TensorFlow 数据集 使用 tf.keras.utils.image_dataset_from_directory(...) API 加载数据集中的图像。 此 API 支持调整图像的颜色模式(转换为灰度)和大小(96x96 像素),以满足模型所需的输入格式。 数据增强的内置 Keras 层(随机:翻转旋转缩放对比度调整)也将在训练期间使用。

模型架构

MobileNetV1 是一个众所周知的模型架构,用于图像分类任务,包括 用于微控制器的 TensorFlow Lite 人员检测示例。 此模型架构在我们的数据集上进行了训练,使用与 视觉唤醒词数据集 论文中使用的相同的 alpha(0.25)和图像大小(96x96x1)。 MobileNetV1 模型由 28 层组成,但对 Keras tf.keras.applications.mobilenet.MobileNet(...) API 的 **一次** 调用可用于轻松地为 5 个输出类别以及所需的 alpha输入形状 值创建 MobileNetV1 模型

python

mobilenet_025_96 = tf.keras.applications.mobilenet.MobileNet(
    input_shape=(96, 96, 1),
    alpha=0.25,
    dropout=0.10,
    weights=None,
    pooling='avg',
    classes=5,
)


基于 MicroPython 的 OpenMV Cam H7 固件不支持使用 Keras API 创建的 MobileNetV1 模型中的所有层类型,但可以使用大约 30 行 Python 代码对其进行修改以使用支持的层。 调整和训练模型后,可以使用 tf.lite.TFLiteConverter.from_keras_model(..) API 将其转换为 TensorFlow Lite 格式。 生成的 .tflite 文件可用于在 OpenMV 开发板上进行设备推理。
OpenMV 应用程序和推理

然后可以将 .tflite 模型集成到 OpenMV 应用程序中。 您可以在 Colab 笔记本 中找到有关推理应用程序的更多详细信息,以及 GitHub 上的 openmv 文件夹 中的完整源代码。

该应用程序将循环运行,执行以下步骤
Block Diagram of Application processing pipeline
应用程序处理管道的框图
  1. 从相机获取图像帧。
  2. 获取机器学习模型对捕获图像帧的输出。
  3. 使用“低激活”和“置信度边距”技术过滤机器学习模型的输出,以获得高度确定的预测。
  4. 使用 指数平滑函数 平滑模型的噪声(Softmax)输出。
  5. 使用指数平滑的模型输出确定是否存在**新的**手势。
  6. 然后使用 USB HID 协议在 PC 上“输入”相关的表情符号。

结论

在本项目中,我们介绍了训练自定义图像分类模型的端到端流程,以及如何使用 TensorFlow Lite 将其部署到基于 Arm Cortex-M7 的 OpenMV 开发板。 TensorFlow 在 Google Colab 笔记本中用于训练模型,该模型基于 Kaggle 上重新标记的公共数据集。 训练后,使用 TensorFlow Lite for Microcontrollers 运行时以及加速的 Arm CMSIS-NN 内核,将模型转换为 TensorFlow Lite 格式,以便在 OpenMV 板上运行。

在推理时,使用模型确定性技术处理模型的输出,然后将 (Softmax) 激活输出的输出馈送到指数平滑函数中,以确定何时通过 USB HID 发送按键以在 PC 上输入表情符号。 我们创建的专用输入设备能够以略低于 20 帧/秒的速度捕获和处理灰度 96x96 图像数据,运行在 480 MHz 的 Arm Cortex-M7 处理器上。 设备推理提供了低延迟响应,并通过将所有图像数据保留在源并本地处理来保护用户的隐私。

您可以通过在 openmv.io分销商 上购买 OpenMV Cam H7 R2 板来自己构建一个。 可以通过使用您自己的数据微调模型或应用迁移学习技术并将我们开发的模型用作基础来训练其他手势来扩展该项目。 也许您可以找到另一个用于面部手势的公共数据集,并用它来在您微笑时输入 😀 表情符号!


非常感谢 Sparsh Gupta 在公共领域许可下在 Kaggle 上分享了手势识别数据集,以及我的 Arm 同事 Rod Crawford、Prathyusha Venkata, Elham Harirpoush 和 Liliya Wu 帮助审查本文和相关教程的材料!

下一篇文章
Building a TensorFlow Lite based computer vision emoji input device with OpenMV

由 Sandeep Mistry 撰写,来自 Arm引言 表情符号使我们能够在数字世界中表达情感,它们在配备触摸屏虚拟键盘的智能手机和平板电脑设备上相对容易输入,但它们在具有物理键盘的传统计算设备上并不那么容易输入。 为了在这些设备上输入表情符号,用户通常使用键盘快捷键或…