虽然有点“2”,但还是有意义的:PoseNet+LSTM 实现虚拟“逛街”
文/ 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/overviewTensorFlow 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 街景的交互。
打开 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 的路径。
Geckodriver
https://github.com/mozilla/geckodriver/releasesconfig_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.pyexecute.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__yJH2ZScaler
https://drive.google.com/uc?export=download&id=1eQUYZB1ZTWRjXH4Y-gxs2wsgAK30iwgCPCA
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.pyDataProcessor
https://github.com/Moving-AI/virtual-walk/blob/master/source/dataprocessing/__init__.pytrain.py
https://github.com/Moving-AI/virtual-walk/blob/master/train.pyWebcamPredictor
https://github.com/Moving-AI/virtual-walk/blob/master/source/webcam_predictor.py
未来工作
生成更多训练数据。在这个项目中,我们试图做出一个最小可用产品(MVP),鲁棒性并不是主要目标。从训练部分可以看出,该模型似乎并没有过拟合,即使我们知道 LSTM 非常倾向于过拟合。这个问题在于,训练和测试数据非常相似,因为视频中的人是在做循环的动作。因此,我们希望该模型在更多无法检测到人体关节的视频中具备过拟合的潜能。可能在不同的光照条件下录制更多的视频会使模型具有更好的鲁棒性和一致性。
尽管是向左转和向右转是对称动作,但目前仍无法做到相同精度的预测。镜像坐标系或许可以用于转弯预测,以改善一致性。
联系作者
Javier Gamazo (Github)
https://github.com/javirkGonzalo 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
备注:姿态
姿态估计与生成交流群
人体姿态估计与生成、手势识别等更多新鲜资讯,若已为CV君其他账号好友请直接私信。
我爱计算机视觉
微信号:aicvml
QQ群:805388940
微博知乎:@我爱计算机视觉
投稿:amos@52cv.net
网站:www.52cv.net
在看,让更多人看到
虽然有点“2”,但还是有意义的:PoseNet+LSTM 实现虚拟“逛街”相关推荐
- 2023年你最值得了解的信息技术-AI篇(二)
20688 北京朗阁信息技术有限公司 企业服务 前沿技术 北京市 mailkey 专注云企业邮件领域的产品,随云服务而生. 未融资 MailKey 是北京朗阁信息技术有限公司(以下简称"朗 ...
- 情人节送什么礼物好呢?实用又有纪念意义的礼物推荐
情人节礼物送花,这是很常见的一种方式,但是,在表达自己的爱意的时候,我们可以亲自去买一份比较有意义的礼物,下面整理了几款实用礼物,让我们来看看哪些情人节礼物值得种草. 推荐一.南卡小音舱蓝牙耳机 这款 ...
- 我始终相信努力奋斗的意义
很多人提起努力这个词的时候,总是以一种过来人的姿态嗤之以鼻.或许努力很久,也才只有百分之一的可能获得自己想要的那个结果.但是,扪心自问,你真的努力了吗?我说的努力,不是你嘴上喊着努力,却依旧熬夜追剧看 ...
- 一位上海女生所经历过的N次感情,对80 90后的朋友具有深刻的教育意义。如果你真的看懂了,那么表示你可以真正开始谈恋爱了...
遇到过各种形形色色的男人,想写出来和大家分享,不知道大家有没有兴趣. 其中还是有JP的,也让我见识到男人花心滥情,负心无情,可以到一个什么程度. 当然了,也遇到过善良温柔的男人....... 先说1号 ...
- html所有标签解释,HTML5所有标签汇总及标签意义解释
这篇文章主要介绍了HTML5所有标签汇总及标签意义解释,本文总结了结构标签.多媒体交互标签.Web应用标签.注释标签.其他标签等内容,需要的朋友可以参考下 结构标签:(块状元素) 有意义的p arti ...
- 互联网时代,VR全景营销的意义是什么?
互联网时代,很多事项我们都可以在手机上解决,随着互联网的不断发展,年轻人每天花在手机上的时间也在日益增加,这就将压力给到了线下实体店铺,年轻人不喜欢逛街,线下店铺的获客成本就会越来越高.同时也是由于互 ...
- keyshot卡住了还能保存吗_倒入醒酒器的红酒一次没喝完,还能倒回酒瓶保存吗?...
用餐结束,我们常会碰到这样的情况. 有朋友看着醒酒器里,还有大半瓶红酒在,有些心疼,便招呼服务员,把醒酒器里的酒液,倒回酒瓶,想要带走. 或者,家里请客人吃饭,开了不少红酒,吃完饭后,不少红酒还留在醒 ...
- 又一年5.20,用Python助力程序员脱单大攻略(视频版)
作者 | 写代码的明哥 来源 | Python编程时光(ID: Cool-Python) 情人节年年有,但今年的 5.20 要比以往的更有意义. 2020.05.20 ,爱你爱你我爱你,如果再卡个时间 ...
- 520 情人节 :属于Python 程序员的脱单攻略大合集(视频版)
作者| Python 编程时光 责编| Carol 情人节年年有,但今年的 5.20 要比以往的更有意义. 2020.05.20 ,爱你爱你我爱你,如果再卡个时间(13:14),那就是 爱你爱你我爱你 ...
最新文章
- 从Google代码库找到的好东西
- java 锁_Java 锁之我见
- 腾讯2019暑期实习生提前批CV岗笔试题
- SAP UI5应用里搜索功能的实现
- 移动计算比移动数据更划算
- python游戏入门书籍推荐
- Flex 4(Hero)对应Flex 3 容器方法
- android去掉菜单键,大部分安卓手机为何取消菜单键
- 前端工程师---软必备
- 力扣-204 计数质数
- php获取当前文件夹下所有图片大小,PHP获取文件夹大小函数用法实例
- Windows一键修改IP、DNS等网络配置(AutoHotkey实现)
- linux 内核代码阅读工具,linux内核源码阅读工具
- photoshop制作烫金效果logo详细教程
- 网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient...
- RMON学习笔记(一)
- spss和python哪个好用_数据分析5大软件PK,你最爱哪个?
- python 全文检索 whoosh flask_基于whoosh的flask全文搜索插件flask-msearch
- 多少秒算长镜头_电影中什么是长镜头画面(9个经典长镜头)
- xcode9.4网盘资源
热门文章
- Multi-thread--C++11中std::unique_lock的使用
- 514 - Rails
- ajax 入参为list_ajax向后台传递list参数
- 使用lambdaquery() 报空指针异常_Java 14 来势汹汹,这回让空指针无处遁形!!
- centos iptables_SQLyog远程连接centos中mysql数据库
- python 邮件发送附件 本目录下所有文件_为python中的每个txt文件发送附件电子邮件...
- oracle日期修改格式化,oracle日期格式化的实现
- java 监听事件和处理事件_Java基础教程之事件和监听器
- 李大勇matlab视频解压密码,13.4 环境控制、手动开关模块
- oracle 数据分页功能,Oracle数据库实现分页功能