PoseNet 结合 LSTM 模型,实现在 Google 街景中虚拟“漫步”

2020 年 9 月 28 日 TensorFlow

文/ Javier Gamazo 与 Gonzalo Izaguirre


由于 COVID-19 大流行,世界多个国家和地区为了保护民众,采取了隔离措施(如关闭边界,发出限制旅行警告等),人们的外出活动也因此受到了限制。


本项目 Virtual Walks 借助姿态估计模型和 LSTM 神经网络在 Google 街景中模拟步行,实现了居家“逛街”。
  • 姿态估计:采用 修改后的 PoseNet 模型;
  • 动作检测部分:使用基于 TensorFlow 2.0 开发的 LSTM 模型。

  • Virtual Walks
    https://github.com/Moving-AI/virtual-walk
  • 修改后的 PoseNet
    https://tensorflow.google.cn/lite/models/pose_estimation/overview

  • TensorFlow 2.0 
    https://tensorflow.google.cn/


本项目能够模拟在世界各地的街道漫步,这一点离不开 Google 街景 的帮助。

  • Google 街景
    https://www.google.com/intl/es_ES/streetview/


本项目主要使用的技术有:TensorFlow 2.0,Selenium 和 Python 3.7。



工作原理

PoseNet 结合 LSTM 模型,推断出图像中的人正在执行的动作。一旦检测到动作,就将其映射到控制器——实现与 Google 街景的交互。
  1. 打开 Selenium Firefox 窗口。
  2. 该系统使用摄像头检测使用者的动作,动作会被分类为:
    • 站立
    • 行走
    • 右转
    • 左转
  3. 对于拍摄的每张照片,使用 PoseNet 推断图像中关节的位置。
  4. 每 5 帧作为一组。首帧选取可以达到关节检测置信度要求的一帧,在首帧之后,对每一帧都进行缺失关节的预测。
  5. 随后每一组帧都被传递到 LSTM 模型, LSTM 后面连接一个前馈神经网络 (FF Neural Network),预测动作。
  6. 预测的动作将被传递到 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 的路径。

  • Geckodriver
    https://github.com/mozilla/geckodriver/releases

  • config_resnet.yml
    https://github.com/Moving-AI/virtual-walk/blob/master/config_resnet.yml


运行命令 download_models 下载我们所使用的模型文件。该脚本将下载 PoseNet 模型(MobileNet 和 ResNet,输出步幅分别为 16 和 32),LSTM,PCA,Scaler 和神经网络。后文单独列出了模型的下载链接。

cd virtual-walk
python3 download_models.py


最后,您可以运行 execute.py 试一下效果。

python3 execute.py


  • download_models
    https://github.com/Moving-AI/virtual-walk/blob/master/download_models.py

  • execute.py
    https://github.com/Moving-AI/virtual-walk/blob/master/execute.py

  • 效果演示
    https://github.com/Moving-AI/virtual-walk/blob/master/readme_resources/output_git.mp4?raw=true


注意事项
  • 实践该模型的经验告诉我们,尽量选择在亮度适中,而不是非常明亮的环境下使用。
  • 此系统对摄像头的位置很敏感,如果效果不佳请调整位置。


总而言之,应该使用近似上面 GIF 图中所示的位置。


上述模型的下载链接
  • LSTM
    https://drive.google.com/uc?export=download&id=1JydPMY58DVZr3qcZ3d7EPZWfq__yJH2Z

  • Scaler
    https://drive.google.com/uc?export=download&id=1eQUYZB1ZTWRjXH4Y-gxs2wsgAK30iwgC

  • PCA
    https://drive.google.com/uc?export=download&id=1cYMuGlfBdkbH6wd9x__1D07I64VA94wE

  • 前馈神经网络 (FF Neural Network)
    https://drive.google.com/uc?export=download&id=1dn51tNt96cWesufjCRtuQJQd2S3Ro6fu



训练

训练部分可能是此项目中最艰难的部分,因为我们缺乏足够的训练数据和计算能力。我们的训练数据是基于 40 分钟的录像生成的。每段录像中,一个人在一段时间内持续做某个特定动作。正如我们将在后文讨论的,我们的模型倾向于过拟合,尽管这套系统能够运行。下图是其中一个训练数据。


我们训练过的模型和生成示例的模型可以通过运行 download_models 脚本下载。下图显示了训练性能:

图:epoch categorical accuracy 与 epoch loss


如果有人想训练一个自己的 LSTM 模型,我们提供了 DataProcessor 类。它可以处理存储于文件夹中的视频,从 labels.txt 文件读取有效的帧编号,并生成带有训练示例的 CSV 文件。该文件可用于 train.py 生成新的 LSTM 模型。该模型的路径将被传递给 WebcamPredictor 类供系统使用。

  • download_models
    https://github.com/Moving-AI/virtual-walk/blob/master/download_models.py

  • DataProcessor
    https://github.com/Moving-AI/virtual-walk/blob/master/source/dataprocessing/__init__.py

  • train.py
    https://github.com/Moving-AI/virtual-walk/blob/master/train.py

  • WebcamPredictor
    https://github.com/Moving-AI/virtual-walk/blob/master/source/webcam_predictor.py



未来工作

  • 生成更多训练数据。在这个项目中,我们试图做出一个最小可用产品(MVP),鲁棒性并不是主要目标。从训练部分可以看出,该模型似乎并没有过拟合,即使我们知道 LSTM 非常倾向于过拟合。这个问题在于,训练和测试数据非常相似,因为视频中的人是在做循环的动作。因此,我们希望该模型在更多无法检测到人体关节的视频中具备过拟合的潜能。可能在不同的光照条件下录制更多的视频会使模型具有更好的鲁棒性和一致性。
  • 尽管是向左转和向右转是对称动作,但目前仍无法做到相同精度的预测。镜像坐标系或许可以用于转弯预测,以改善一致性


联系作者

  • Javier Gamazo (Github)
    https://github.com/javirk

  • Gonzalo Izaguirre (Github)
    https://github.com/gontxomde



许可

该项目采用 MIT 许可。访问 https://github.com/Moving-AI/virtual-walk/blob/master/LICENSE 以获取许可的详细信息。



致谢

  • @atomicbits仓库提供用于下载 TFJS 模型 PoseNet 的工具。

  • atomicbits
    https://github.com/atomicbits

  • @ tensorflow 提供 Posenet 模型。
  • tensorflow
    https://github.com/tensorflow/

  • Posenet
    https://github.com/tensorflow/tfjs-models/tree/master/posenet

  • @ patlevin 提供在 Python 中从图文件创建会话的工具。
  • patlevin
    https://github.com/patlevin/tfjs-to-tf

  • @ ajaichemmanam 在我们遇到 Python 读取图文件的问题时伸出了援手。
  • ajaichemmanam
    https://github.com/ajaichemmanam/simple_posenet_python

  • @ felixchenfy 和他的 Realtime-Action-Recognition 仓库为我们提供了灵感。
  • felixchenfy
    https://github.com/felixchenfy



— 推荐阅读 —



点击 “阅读原文” 访问 Virtual Walks GitHub。

登录查看更多
0

相关内容

长短期记忆网络(LSTM)是一种用于深度学习领域的人工回归神经网络(RNN)结构。与标准的前馈神经网络不同,LSTM具有反馈连接。它不仅可以处理单个数据点(如图像),还可以处理整个数据序列(如语音或视频)。例如,LSTM适用于未分段、连接的手写识别、语音识别、网络流量或IDSs(入侵检测系统)中的异常检测等任务。
【NeurIPS 2020】一种端到端全自由度抓取姿态估计网络简介
专知会员服务
19+阅读 · 2020年10月18日
[ICML-Google]先宽后窄:对深度薄网络的有效训练
专知会员服务
34+阅读 · 2020年7月5日
【CVPR 2020-商汤】8比特数值也能训练卷积神经网络模型
专知会员服务
25+阅读 · 2020年5月7日
自回归模型:PixelCNN
专知会员服务
26+阅读 · 2020年3月21日
干货 | 循环神经网络(RNN)和LSTM初学者指南
THU数据派
15+阅读 · 2019年1月25日
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
一文读懂LSTM和循环神经网络
七月在线实验室
8+阅读 · 2018年4月18日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
tensorflow LSTM + CTC实现端到端OCR
机器学习研究会
26+阅读 · 2017年11月16日
Fashion Meets Computer Vision: A Survey
Arxiv
5+阅读 · 2020年3月31日
Arxiv
6+阅读 · 2019年4月8日
VIP会员
相关资讯
干货 | 循环神经网络(RNN)和LSTM初学者指南
THU数据派
15+阅读 · 2019年1月25日
【年度系列】使用LSTM预测股票市场基于Tensorflow
量化投资与机器学习
19+阅读 · 2018年10月16日
一文读懂LSTM和循环神经网络
七月在线实验室
8+阅读 · 2018年4月18日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
tensorflow LSTM + CTC实现端到端OCR
机器学习研究会
26+阅读 · 2017年11月16日
Top
微信扫码咨询专知VIP会员