使用Google Cloud和基于Arm的Raspberry Pi的狗狗情绪探测器





1.00/5 (1投票)
在本文中,我们将演示如何使用 Google AI Cloud 创建一个模型来对不同的狗叫声进行分类,然后在基于 Arm 架构的 Raspberry Pi 上运行该模型来监听狗叫声并进行识别。
小型计算机正变得无处不在。如今,手机、智能手表和健身追踪器随处可见。它们对于监测我们自身和周围环境非常有用,可以及时通知我们可能会在意的事情。智能手表最初主要作为计步器,但后来发展到可以对房颤等严重健康问题进行早期检测。我们才刚刚迈出微型监测运动的开端。
小型计算设备通常受到计算能力有限、无法连接互联网以及存储容量小的限制。虽然这些智能设备可以在短时间内进行大量观测,但由于存储空间的限制,通常无法在断开互联网后将所有观测结果保存下来以便稍后同步。同样,通过无线信号发送大量数据也会消耗有限的电池电量。
为了最大限度地利用捕获到的信号,至关重要的是将信号处理步骤推送到边缘设备本身。
在过去十年中,机器学习 (ML) 取得了巨大进步,提高了许多信号处理任务的准确性,例如图像中的物体检测、视频中的手势检测和语音识别。今天,我们才刚刚触及可能性的表面。通过在小型设备中使用机器学习,还有无数其他方式可以改善人们的生活。
还有什么可能性?
在本文中,我们将探讨狗情绪探测器的想法。我们将构建一个设备,它能监听周围的环境声音,如果发现有狗存在,它会尝试判断狗发出的声音类型:是友好的吠叫、害怕的呜咽,还是攻击性的咆哮。
根据用户的偏好,当设备认为他们应该关注他们的狗时,它就会振动。这或许可以用来帮助主人在听不到狗叫声的时候,也能留意到他们的狗。当然,这只是一个原型,这个想法的结果尚未在实际场景中进行测试。
为了制作这个设备的prototype,我们将使用基于 Arm 架构的 Raspberry Pi,这是我在边缘设备上实现 ML 的首选平台。Arm 处理器不仅用于 Raspberry Pi,它们还为许多手机、移动游戏机和其他大量设备提供动力。它们在能源效率高的处理器中 packed 了大量的计算能力,而且你几乎可以在任何地方以实惠的价格买到它们。
对于训练,我们将研究 Google AudioSet,这是一个由 YouTube 视频中的 10 秒音频剪辑组成的庞大数据集。数据以预处理格式提供,与 YouTube-8M 启动包兼容,我们将使用它来训练一个能够分类音频剪辑的模型。
这个模型的训练可能需要一些时间,所以我们将把处理过程卸载到 Google Cloud AI Platform,并在完成后下载生成的模型。当我们准备好所有部件后,我们将把模型传输到 Raspberry Pi。我们还将创建一个 Python 脚本来捕获连接的麦克风的输入,并尝试每秒一次地对它识别到的任何狗叫声进行预测。
让我们开始构建模型
首先,让我们在一个地方创建一个文件夹来存放我们即将进行的全部工作。
要构建这个模型,我们需要 下载数据集 — 它可以通过“Features dataset”标题下的链接获得。最简单的方法是将单个 gzip tarball 文件下载到本地机器。
接下来,解压并提取文件。在这个包中,有三个文件夹,一个包含平衡的训练集,一个用于评估集,还有一个包含不平衡的训练集。每个文件夹包含超过 4000 个文件。
TFRecord 文件包含预处理的特征。文件名以 YouTube 视频 ID 的前两个字符开头。由于视频 ID 是区分大小写的,如果在不区分大小写的文件系统(如 Windows)上提取文件,请小心。(有用提示:我们使用 7zip 提取了这些特征文件。7zip 支持命令行选项,可以自动重命名已存在的文件,确保文件被重命名而不是被覆盖。)
一旦我们正确提取了数据集,我们将克隆 YouTube-8M Github 仓库,其中包含训练模型的代码。我们建议将其克隆到您为提取的数据集创建的同一个文件夹中。
接下来,更新 YouTube-8M 文件夹中的 `readers.py` 文件以支持旧的 AudioSet TFRecord 文件。这包括两个步骤:
- 将所有对“
id
”的使用更改为“video_id
” - 将默认的 `num_classes` 参数更改为 527,这是音频数据集中不同类别的数量。
有五个地方需要更改 ID,有两个地方需要更改 num_classes。
要运行程序,请启动一个新的 Python 3.6+ 虚拟环境并安装 `tensorflow==1.14` 包。现在也是 安装推理脚本的依赖项 的好时机,我们将在下一步构建该脚本。虽然每个包的版本号是特定的,但唯一硬性要求是我们使用 tensorflow 1.14。其余的可以安全地安装最新版本。
此时,我们已准备好训练模型。首先在本地运行训练脚本进行测试,这在平衡的训练集上应该不会花费很长时间。打开命令行,导航到本节第一步创建的文件夹,然后输入以下命令(请注意,这是一个完整的命令):
python youtube-8m/train.py \ --train_data_pattern=./audioset_v1_embeddings/bal_train/*.tfrecord \ --num_epochs=100 \ --feature_names="audio_embedding" \ --feature_sizes="128" \ --frame_features \ --batch_size=512 \ --train_dir ./trained_models/yt8m \ --model=FrameLevelLogisticModel \ --start_new_model
另外请注意,虽然 `\` 行中断在 Linux 系统上可以正常工作,但在 Windows 上您需要将其替换为 `^` 字符。
在 100 个 epoch 时,这将运行直到达到大约 8500 步。`FrameLevelLogisticModel` 的最大准确率约为 58-59%。在我们的测试系统上,完成时间不到 20 分钟。
此启动包中还包含其他模型,包括 `DbofModel` 和 `LstmModel`。这些模型在训练数据上都能达到近乎完美的准确率,但在使用评估集进行测试时,它们在平衡训练集上都会严重过拟合。
让我们在云端训练这个模型
另一种选择是使用不平衡数据集训练完整的音频集。这将需要更多的处理时间,但 Google Cloud AI Platform 上的 GPU 可以提供极大的帮助。简单的逻辑模型在不平衡训练集上的准确率约为 88%。
要在云端运行此程序,请注册并登录 Google Cloud AI Platform 帐户,启用结算并下载命令行工具,详细说明请 在此 查看。
一切设置完毕后,前往 Cloud Console,创建一个新项目,并创建一个新的存储桶。存储桶的名称必须全局唯一,如果包含用户的帐户名称,则最容易实现。将整个 `audioset_v1_embeddings` 和 `youtube-8m` 文件夹上传到此存储桶。
如果一切都正确完成,我们应该可以打开 Google Cloud SDK Shell 并运行以下命令来启动训练。请务必将 `your-project-name` 和 `your-storage-bucket-name` 替换为相应的帐户值。这是为类 Unix 系统编写的。请相应调整 Windows 系统。
BUCKET_NAME=gs://${USER}_yt8m_train_bucket gsutil mb -p your-project-name $BUCKET_NAME JOB_NAME=yt8m_train_$(date +%Y%m%d_%H%M%S) gcloud --verbosity=debug ml-engine jobs submit training $JOB_NAME --python-version 3.5 --package-path=youtube-8m --module-name=youtube-8m.train --staging-bucket=$BUCKET_NAME --region=us-east1 --config=youtube-8m/cloudml-gpu.yaml -- --train_data_pattern='gs://your-storage-bucket-name/audioset_v1_embeddings/unbal_train/*.tfrecord' --model=FrameLevelLogisticModel --train_dir=$BUCKET_NAME/yt8m_train_frame_level_logistic_model
再次注意,最后一个 gcloud 调用是一个包含配置选项的长命令。
这将花费半天左右的时间完成。完成后,请从您的 Cloud Storage 存储桶下载模型输出。
$BUCKET_NAME/yt8m_train_frame_level_logistic_model
在 Raspberry Pi 上运行
我们在运行 Raspbian 和安装了 Python 3 的 Arm 架构 Raspberry Pi 4 上演示此应用程序。在设备上安装 PyAudio。(如果遇到任何问题,这个答案 应该会有帮助。)
插入 USB 麦克风(可选配耳机用于输出音频进行测试)。此时,最方便的方法是将麦克风设置为默认设备。登录 Raspbian 桌面,然后点击右上角时钟旁边的声音图标,然后选择要使用的麦克风。
最后一步是获取处理原始音频到 AudioSet 提供的相同 128 特征嵌入值的工具。该工具是之前链接的 Tensorflow models Github 仓库 的一部分。在 Pi 上运行完全相同的安装过程,确保安装到 Python 3 实例。此外,将此仓库克隆到与数据集和 YouTube-8M 仓库克隆到同一个文件夹中。
运行 `vggish_smoke_test.py` 脚本以确保一切安装正确。
现在,将从 Google Cloud Platform 下载的模型复制到同一个文件夹,以及 麦克风监听脚本。
运行此脚本。它将开始监听默认设备,并将预测结果输出到控制台。
如果无法将所需设备设置为默认设备,请运行“`python model-run.py list”来显示按索引列出的所有设备。找到设备索引,然后再次运行该命令,并将该索引作为参数传入。例如:
python model-run.py 3
将此文件夹的全部内容复制到 Raspberry Pi 并再次运行代码脚本。每秒钟,我们应该会看到它认为正在发生的狗叫声的预测!输出步骤可以替换为适用于设备和目标用户的任何最合适的机制。
结论
今天,我们探索了基于 Arm 移动设备的音频 ML 应用的一种可能性。虽然这个概念在上市前还需要更详细的验证,但能够在移动设备上运行任意音频检测模型的能力已经存在。
AudioSet 数据包含 527 个标签,以及一个强大的城市声音本体。还有机会在将声音传递给预测器之前对其进行更好的处理,例如应用鸡尾酒会算法并将每个音频源通过 vggish 过滤器。
在配备 Arm 微处理器的 Raspberry Pi 上运行狗情绪探测器本身就非常酷。为了让它更酷,我们可以使用 TensorFlow 提供的工具来转换和量化模型,然后使用 TensorFlow Lite for Microcontrollers 在低成本、低功耗的 Arm 微控制器上运行它。
听起来很有趣?去尝试并看看您能用这种方法解决什么问题。您永远不知道您可能会对别人的生活产生多大的影响。
关于 Arm
查看 Arm 解决方案 页面,了解更多关于我们在 AI 和 ML 领域的工作。如果您是一家希望与 Arm 合作的企业,请查看我们的 Arm AI 合作伙伴计划。