导读 | 疫情特殊时期,各企业、学校纷纷启用远程办公和学习的方式,在办公期间,除了要完成日常工作安排,还要照顾自身的饮食起居,在高强度的工作节奏和缺少运动锻炼的情况之下,如何及早发现健康隐患,快乐办公?且看鹅厂小哥bottlejiang带来的今日分享。

背 景

你,是否还在为当下的疫情忧心忡忡?你,是否还在为每日三餐苦苦思虑?不端正的坐姿是否让你腰酸背痛?窄小的电脑屏幕是否让你眼干眼涩?

居家办公期间,不知不觉间暴露了很多的健康隐患:

第一:坐姿问题

家里的办公环境相对简陋,笔记本屏幕高度低,一天不知不觉的弯腰驼背。

第二:吃饭问题

不能出门,不能叫外卖,自己做饭不好吃,又累又乏味。

第三:喝水问题

高度投入工作时总是忘了喝水运动。

第四:情绪问题

疫情严峻,待在出租屋担心染病,情绪低迷。

我命由我不由天,健康生活赛神仙!做为一个工程师,平日里做了无数的需求,这一次,何不为自己做一个需求?用自己的专业能力,用自己的双手,用代码,去开发,去创造,去解决以上问题。

对症下药

1. 针对坐姿问题

要避免弯腰驼背,需要在我坐姿不端正的时候提醒我。那么需要解决以下3个问题:

  • 实时监控我的坐姿

  • 判断我的坐姿是否端正

  • 当我坐姿不端正的时候提醒我

(1)监控

如何监控?办法是使用电脑摄像头!笔记本基本自带,台式机可以通过接入外设的方式支持。

web 想要调用电脑摄像头,只需要调用一个 api 就能轻松解决:navigator.mediaDevices.getUserMedia[1]

navigator.getUserMedia 已更名为 MediaDevices.getUserMedia[2]。同时,由于隐私原因,该 api 仅在 https 下支持。

navigator.mediaDevices.getUserMedia 返回一个 promise 对象,支持音视频、尺寸帧率等设置。

(2)判断

能够实时拍下我的坐姿图像,那么又该如何判断我的坐姿端正呢?解决办法是:借助 tensorflow.js!

早在半年前,TensorFlow.js 最开始吸引我的地方正是他能够识别人像的五官,输入一张图片,输出人体器官在图片中位置,包括:鼻子,眼睛,耳朵,肩膀,手肘,手腕,臀部,膝盖,脚踝。

TensorFlow.js[3] 是一个 JavaScript 库,用于在浏览器和 Node.js 训练和部署机器学习模型。简单来说就是把机器学习搬到web上。它的应用有很多,也已经实现的一些有意思的事情。

问题来了,工作的时候正对着电脑,但笔记本摄像头最多只能拍到人的头部五官和肩膀啊?

这里可以想象一下,当坐姿不端正的时候,其实头也是不端正的。(头部端正而身体七歪八扭恐怕不常见)所以,判断五官实际上就已经足够了。

实现上,初始化(posenet.load)之后,通过 estimateSinglePose 方法输入一个图片,输出得分(score)和人体各部位坐标数据:

{"score": 0.36588028040440645,"keypoints": [{"score": 0.998099148273468,"part": "nose","position": {"x": 318.6268163302529,"y": 371.8572926799611}},{"score": 0.996922492980957,"part": "leftEye","position": {"x": 260.77240393968873,"y": 307.9062803988327}},...]
}

posenet.load 的初始化有很多参数:architecture、outputStride、inputResolution、multiplier、quantBytes、modelUrl。

这些参数是对模型的设置,跟输出的分辨率、识别精度、准确性相关,并直接影响识别效率和性能。在当前的需求场景里,可不必关注这些,默认即可。

estimateSinglePose 有一个参数 flipHorizontal:是否应水平翻转/镜像姿势。

电脑摄像头返回的是一个与现实方向水平相反的图片(相对于自己的视角)。通过ccs水平翻转180度(rotateY(180deg))可处理。

同样,模型的输出通过设置 flipHorizontal 为true 能够得到相应方向的坐标数据。得到五官坐标之后,通过 canvas 将相应的点画到图像上即可验证识别是否正确。

如上图所示,坐姿端正时,脸部在图像中间,双眼双耳水平,鼻子在眼耳高度之间。坐姿不端正时往往不能满足以上条件。那么通过判断五官的相对位置和绝对位置就可以检测坐姿了。比如近大远小,越靠近屏幕,拍到的人脸越大,两眼的间距也越大。当大到一定程度可以认为人距离屏幕近到一定的程度,这个程度就是阈值。

超过这个阈值即可认定为:此时我正在近距离的盯着电脑屏幕看。此时我正在不健康的工作。

坐姿不端正一般有以下几种场景,转换到图片上的五官位置判断如下:

  • 弯腰驼背:

    此时整个头部在图像下半部分,判断鼻子的y坐标到图像下边沿的距离

  • 单手托下巴:

    此时头部是歪的,判断两眼的y坐标差

  • 斜视:

    此时头部沿y轴转动,判断左边的眼睛和耳朵的x坐标差和右边眼耳x坐标差之差

  • 过度仰视(抬头):

    此时头部向上仰,判断鼻子的y坐标是否过于接近眼睛的y坐标

  • 过度俯视(低头):

    此时头部向下弯,判断鼻子的y坐标是否过于接近耳朵的y坐标

  • 眼睛离屏幕太近:

    此时头部在图像中更大,判断两眼的x坐标差(近大远小)

接下来就是计算的问题了,算出各种差值之后设置阈值。这里可以直接对着屏幕扭转头部试试,自己感受一下坐姿不端正时的参数,把握判断的严格和宽松,逐步调参。

为了达到监控的目的,图片识别逻辑需要跑一个循环。这里用 setInterval 或者 requestAnimationFrame 都可以。

requestAnimationFrame 可以做到监控画面十分流畅,观赏效果极佳,但是60帧还是很吃性能的,每次都要 TensorFlow 识别、canvas 画图和逻辑判断,着实有些难顶,短时间还可以,长时间跑的话 mac 便突突突的进入煮鸡蛋模式。

一般来说开着页面放着听告警即可,这个监控不用那么实时,用 setInterval 每 500 毫秒跑一次足够。

(4)告警

能够实时拍下我的坐姿图像,能够判断我的坐姿是否端正,那么在不端正的时候如何提醒我?当然是播放语音啦!

从网上下载一段几秒的警铃音频即可。识别判断坐姿不端正的时候播放该音频,提醒效果就有了。音频的播放很简单,获取 audio 对象,play() 一下即可。

但有一个问题,以上坐姿不端正的场景有6种,听到告警的时候怎么知道是哪种呢,毕竟知道是哪种才能立马有针对性的纠正坐姿。

有办法!这里可以借助谷歌翻译,下载各种提示文字的朗读音频。当坐姿不端正的时候,播放对应的语音。一开始突然放个警铃总是吓一跳,谷歌翻译魔性的声音明显更人性化!

除此之外要考虑告警毛刺的过滤。比如我喝杯水或者伸个懒腰,这个时候头可能是歪的,这样的告警是不应该发出来的。考虑到喝水伸懒腰这些动作都是短时间内完成,假设3秒完成,那么可以加个判断,持续3秒以上的告警才是真正坐姿不端正的告警,才需要发出来。

实践中还有一个场景,当我去上厕所或者出去倒个水的时候,此时人都不在电脑前了,按照原先的逻辑肯定是告警的。

这时候,模型输出的得分(score)字段就派上用场了。score是一个0到1的数值,数值越大表示输出的结果更准确可靠。当人不在电脑前,score 分数小于0.1,于是把低于0.1分的数据直接舍弃。

最后把阈值和一些设置放到页面上支持编辑,同时加个告警次数统计,一天下来可以看到自己是哪种不端正坐姿比较突出,可以有针对性的做一些运动舒展放松。

2. 针对吃饭问题

吃饭这个问题啊!对于没有做饭经验的人来说真的是灾难。但当下情况特殊,也没的办法。只能随便对付一下,比如把食材丢到电饭煲里做懒人饭,或者买一次性碗筷。

1天2顿饭花3个钟,做出来还不好吃!这就很没意思了。做饭这个大前提是扳不倒的,只能提高一下趣味了。于是,按照主食、肉类、蔬菜、小吃四大类,将囤下来的吃食分类,然后加个随机功能,每次到饭点的时候,按一下,随机搭配。

这样可以解决两个问题:

  • 吃什么

    做饭难,其实面对一堆食材决定吃什么也很难。

  • 增加趣味

    可能随机出一些奇奇怪怪的组合。未知带来好奇,让人保持兴趣,未知是人类进步的阶梯。是不是有点意思!

这里要加多个去重的逻辑,连续两次随机出来的食物不能一样。毕竟午餐和晚餐吃一样的东西就没意思了!

3.针对喝水&运动问题

一天下来常常忘了喝水,直到口渴的时候才被动想起,这时候你的身体已经缺水了,这是不健康的!一天下来常常一屁股下去坐半天,长期久坐也是不健康的!

针对这个问题可以做个定时提示,回想平时工作中容易忘记喝水的时间,早中晚分别2个提醒,同时加2个运动提醒。

实现上也比较简单,跑个 setInterval 实时对比当前时间和设定提醒时间即可。告警方式同上。

结语

积极乐观,开心向上有助于提高免疫力。

成年人的生活没有容易二字,但要始终相信,办法总比困难多!写到这里,想象着100岁的自己,雄壮有力的敲着键盘,嘴里念到:健康生活,长命百岁。

参考资料:

[1] navigator.getUserMedia():

https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/getUserMedia

[2] MediaDevices.getUserMedia():

https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia

[3] TensorFlow.js :

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

[4] 应用体验:

https://www.doverr.com/alarm/index.html

推荐阅读

左耳朵耗子:技术人如何更好地把控发展趋势?

居家办公之后,鹅厂小哥发现Web开发竟能助力身体健康!相关推荐

  1. 跟小甲鱼学Web开发笔记07

    跟小甲鱼学Web开发笔记07 格式化大作战 加粗效果 strong元素 b元素 斜体效果 em元素 i元素 使用css代替b和i元素 久的不去新的不来 del和ins元素 s元素 u元素 mark元素 ...

  2. 在鹅厂做了14年开发

    导语|今天我们走进CDG新晋专家团,对话客户端开发专家Tongyiguo. 2007年从计算机专业毕业后,第一份工作是在顺丰做终端开发,后来又去到酷派手机做手机的业务开发.2012年入职腾讯,在ECC ...

  3. 微信小程序和Web开发的联系

    1.1 差异 在html中,我们最常见的标签有哪些呢?举一些大家都熟悉的例子:div.p.span.img.a.h1-h6等等标签,这里就不一一例举了,这里是指的网页中html标签元素.那么微信小程序 ...

  4. 拒收苹果超10万元赏金!程序员小哥找出iCloud账户漏洞后,发文直指苹果不够公开透明...

    明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 好不容易找出iCloud账户漏洞,但他竟然拒收苹果1.8万美元奖金! 最近,这件事在Hacker News上引起大批网友围观. 本来程序员找 ...

  5. 日本小哥“自虐神器”一夜爆火:用手柄控制自己的脸,代码自取,后果自负...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 鱼羊 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 用游戏手 ...

  6. 日本小哥开源“自虐神器”一夜爆火:用手柄控制自己的脸,代码自取,后果自负

    来源:量子位公众号(ID:QbitAI) 用游戏手柄控**(wan)制(huai)**面部表情,是一种怎样的体验? 按下LB键眨左眼,按下RB键眨右眼,还可以左右左右走一套连击.(画面为镜像) 是不是 ...

  7. Web开发到微信小程序

    闲来无事,突然想写一个小程序,于是好好的周五的晚上写了一晚上代码,从完全不知道什么情况(我的JavaScript水平很差的),到愣是写好了一个已经发布了的小程序.所以这里只是想分享一下一个Web开发人 ...

  8. 微信小程序开发和网页Web开发的区别

    小程序和web开发的区别主要在前端.小程序的主要操作平台在微信上.微信服务器的前端代码和从用户数据库后台传过来的数据,通过微信内置的解释器进行拼接,解释为我们平时看到的页面.Web 开发仍然具有相同的 ...

  9. 为什么居家办公后我更累了?提高远程工作效率小技巧~【互联网大厂打工人居家办公指南】

    文章目录 大厂打工人居家办公现状 1. 一日三餐是大问题 2. 沟通成本上升 3. 效率急剧下降 4. 工作与生活没有界限 提升远程办公效率的小技巧 1. 设立工作地点,还原办公环境 2. 制定工作计 ...

最新文章

  1. libgdx 学习笔记一 开发环境搭建
  2. Elasticsearch教程-从入门到精通
  3. onbeforeunload与onunload事件
  4. ECMAScript 2016,2017,和2018中新增功能
  5. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤
  6. 程序员去交友网站找女友,结果意外了...
  7. 免安装Oracle客户端使用PL/SQL连接Oracle
  8. JParticles 2.0 发布,打造炫酷的粒子特效
  9. 提高开发效率的十五个Visual Studio 2010使用技巧
  10. XP下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
  11. 《基于卷积神经网络(CNN)的网络流量分类》优秀本科毕设实验总结
  12. Daz3d:如何使用景深
  13. excel空白单元格自动下下填充上一个单元格的值
  14. Filament Android 编译搭建(基于Ubuntu环境)
  15. PDCAOODA循环
  16. 基于开源软件,“核高基”软件战略必定失败
  17. Source Insight主题美化插件
  18. 罗森伯格电子配线系统问答
  19. 清华计算机考研csp,「考研2021」400分跨考清华大学软件学院经验帖
  20. 【Stata】数据批量季节调整教程

热门文章

  1. 怎样使用更新域计算机,Windows Server 2019 组策略调整域计算机组策略刷新间隔时间...
  2. 计算机硬件有关的专业英语,计算机硬件专业英语词汇
  3. python 读写Excel的数据
  4. html5 判断横竖屏,前端js横竖屏检测的4种方案
  5. JAVA学习-基础部分【1】
  6. [xdoj]1303jlz的刷题黑科技
  7. 做科技型券商,光大证券构建私有云平台
  8. 《中外管理》 稻盛如果掌舵国航,一切将会怎样?
  9. 碧蓝航线8.20服务器维护,碧蓝航线8月20日更新内容及新玩法活动详解介绍
  10. 如何刷新微信服务器小程序版本,微信小程序版本自动更新