文/ Javier Gamazo 与 Gonzalo Izaguirre
由于 COVID-19 大流行,世界多个国家和地区为了保护民众,采取了隔离措施(如关闭边界,发出限制旅行警告等),人们的外出活动也因此受到了限制。
本项目 Virtual Walks 借助姿态估计模型和 LSTM 神经网络在 Google 街景中模拟步行,实现了居家“逛街”。
- 姿态估计 :采用修改后的 PoseNet 模型;
- 动作检测部分 :使用基于 TensorFlow 2.0 开发的 LSTM 模型。
- Virtual Walks
- 修改后的 PoseNet
- TensorFlow 2.0
本项目能够模拟在世界各地的街道漫步,必然也离不开 Google 街景 。
本项目主要使用的技术有:TensorFlow 2.0,Selenium 和 Python 3.7。
工作原理
PoseNet 结合 LSTM 模型,推断出图像中的人正在执行的动作。一旦检测到动作,就将其映射到控制器——实现与 Google 街景的交互。
- 打开 Selenium Firefox 窗口。
- 该系统使用摄像头检测使用者的动作,动作会被分类为:
- 站立
- 行走
- 右转
- 左转
- 对于拍摄的每张照片,使用 PoseNet 推断图像中关节的位置。
- 每 5 帧作为一组。首帧选取可以达到关节检测置信度要求的一帧,在首帧之后,对每一帧都进行缺失关节的预测。
- 随后每一组帧都被传递到 LSTM 模型, LSTM 后面连接一个前馈神经网络 (FF Neural Network),预测动作。
- 预测的动作将被传递到 Selenium 控制器,并在打开的 Firefox 窗口中实现该动作。
现在还有另一种模型可用于运行该程序。不使用 LSTM,而是每 5 帧一组计算关节速度,并将速度与关节位置一起进行 主成分分析 (PCA) 并结合前馈神经网络来预测动作。默认模型是 LSTM,因为我们认为该模型在方法上是正确的,并且是精度最高的模型。
由于动作预测一般比人的步速快得多(当然,也取决于主机的性能),因此每 0.5 秒预测一次动作就够了(设置过高的预测频率可能会导致模型重复输出动作,造成转向过度等问题),当然,您也可以调整参数来修改预测频率。
使用示例
下图展示了模型从图像推断出骨骼,并预测且执行了相应的动作的过程。
图:“漫步”在巴黎街头
安装和使用
别忘了,该程序是需要使用摄像头的,因为要捕捉您动作。
建议将本项目安装在新的 Python 3.7 环境中,以避免出现意外问题和版本冲突。
安装运行 ResNet 所需的 TensorFlow.js :
pip install tensorflowjs
安装 TensorFlow.js 图模型转换器 tfjs-to-tf (此包可将 TensorFlow.js 图模型转换到 TensorFlow,如需详细信息请访问 https://github.com/patlevin/tfjs-to-tf)
pip install tfjs-graph-converter
克隆本项目的 git 仓库
git clone https://github.com/Moving-AI/virtual-walk.git
并安装本项目所依赖的包
pip install -r requirements.txt
安装 Firefox 并下载 Geckodriver。然后在本项目的配置文件 config_resnet.yml 中声明 Geckodriver 的位置,即在 driver_path 选项下填写 Geckodriver 的路径。
运行命令 download_models 下载我们所使用的模型文件。该脚本将下载 PoseNet 模型(MobileNet 和 ResNet,输出步幅分别为 16 和 32),LSTM,PCA,Scaler 和神经网络。后文单独列出了模型的下载链接。
cd virtual-walkpython3 download_models.py
最后,您可以运行 execute.py 试一下效果。
python3 execute.py
注意事项
- 实践该模型的经验告诉我们,尽量选择在亮度适中,而不是非常明亮的环境下使用。
- 此系统对摄像头的位置很敏感,如果效果不佳请调整位置。
总而言之,应该使用近似上面 GIF 图中所示的位置。
上述模型的下载链接
- LSTM,Google Drive 原始链接
- Scaler,Google Drive 原始链接
- PCA,Google Drive 原始链接
- 前馈神经网络 (FF Neural Network),Google Drive 原始链接
训练
训练部分可能是此项目中最艰难的部分,因为我们缺乏足够的训练数据和计算能力。我们的训练数据是基于 40 分钟的录像生成的。每段录像中,一个人在一段时间内持续做某个特定动作。正如我们将在后文讨论的,我们的模型倾向于过拟合,尽管这套系统能够运行。下图是其中一个训练数据。
我们训练过的模型和生成示例的模型可以通过运行 download_models 脚本下载。
下图显示了训练性能:
图:epoch categorical accuracy 与 epoch loss
如果有人想训练一个自己的 LSTM 模型,我们提供了 DataProcessor 类。它可以处理存储于文件夹中的视频,从 labels.txt 文件读取有效的帧编号,并生成带有训练示例的 CSV 文件。该文件可用于 train.py 生成新的 LSTM 模型。该模型的路径将被传递给 WebcamPredictor 类供系统使用。
未来工作
- 生成更多训练数据 。在这个项目中,我们试图做出一个最小可用产品(MVP),鲁棒性并不是主要目标。从训练部分可以看出,该模型似乎并没有过拟合,即使我们知道 LSTM 非常倾向于过拟合。这个问题在于,训练和测试数据非常相似,因为视频中的人是在做循环的动作。因此,我们希望该模型在更多无法检测到人体关节的视频中具备过拟合的潜能。可能在不同的光照条件下录制更多的视频会使模型具有更好的鲁棒性和一致性。
- 尽管是向左转和向右转是对称动作,但目前仍无法做到相同精度的预测。镜像坐标系或许可以用于转弯预测,以 改善一致性 。
联系作者
许可
该项目采用 MIT 许可。访问 LICENSE 文件 以获取许可的详细信息。
致谢
- @atomicbits 的 仓库 提供用于下载 TFJS 模型 PoseNet 的工具。
- @tensorflow 提供 Posenet 模型。
- @patlevin 提供在 Python 中从图文件创建会话的工具。
- @ajaichemmanam 在我们遇到 Python 读取图文件的问题时伸出了援手。
- @felixchenfy 和他的 Realtime-Action-Recognition 仓库为我们提供了灵感。