点击我爱计算机视觉标星,更快获取CVML新技术


本文为52CV群友咆哮的阿杰投稿,介绍了他最近做的一个人机交互小项目,代码已经开源,欢迎大家参考~

在12月初,我诞生了这个想法。现在的拍摄效果的转换都是人和机器通过物理接触完成,包括开始拍摄,各种拍摄效果等,几乎都是通过手指来完成。人类具有丰富的表达自我的能力,手势是表达自我的手段之一。无论是哪个地域的文化,一些手势都有其含义。在深度学习时代,我们完全可以用手势代替手指,告诉机器我们想做什么样的事情,想调换什么拍摄模式,因此HandAI诞生了。固然手指在更多的场合还是很方便,但我做这个事情,不想去探讨手势控制的价值以及实用性,我只是单纯想做这个事情。

效果演示视频:

友情提示:后半段视频声音略大,请调小音量

项目地址 随手赏个star吧((╹▽╹))。

https://github.com/shoutOutYangJie/HandAI/tree/master

项目功能

HandAI能识别 8 种手势。这八种手势是亚洲地区常用的手势,其意义都是积极或中性的,没有贬义手势。

one:背景虚化,实现景深效果,前景人物不虚化

two:背景变化

three:背景调成黑白模式,前景人物依然有色彩。

four:人脸贴纸

five:画面横向复制扩展

good:视频背景转换模式,当右上角出现红点之后,使用yeah手势(two),即可把背景换成视频数据,而不是单纯的图像。

eight:华丽防挡弹幕模式。

ok:结束录制

项目设计思路

项目包括三个深度学习模型,分别是手部关键点检测及识别(算统一的一个模型), 人像精细分割模型,人脸及五个关键点检测。

手部关键点检测以及识别:对每一帧都要运行该模型,用来判断手势的含义(8个类别之一)。

人像分割模型:也是每一帧都要运行,获得前景人物的掩码。用于做背景变化,背景虚化,背景黑白,防挡弹幕。

人脸及五个关键点检测:用于做人脸贴纸。

下面具体讲解,首先看整个项目的结构图,非常简单:

我使用了一个flags.py文件设置各种手势的当前状态。这些状态会保留并施加到下一帧上,所以每个手势都不是独立作用的。正如视频中描述,这些手势对应的效果能一起作用在同一帧上。

手势识别

在2019年8月,谷歌发布了一个能检测手部关键点的开源apk,详见:谷歌开源手势识别器,手机能用,运行流畅,还有现成的App,但是被我们玩坏了 。在他们开放的视频中,该开源模型可以检测手部21个关键点并且识别手势。但是遗憾的是,在开源的代码中,并没有识别手势的部分,仅仅有关键点检测。但是在谷歌发布的博客中,提到了他们识别手势的方法是,判断手部关节点的弯曲程度以及关系。在HandAI中,我使用了他们开源的网络检测手部关键点,根据他们的描述,复现了8种手势的识别。

如果判断手部弯曲程度: 计算指关节到指尖的向量,计算指关节到手掌底部的向量,再计算两个向量的余弦距离。根据余弦距离判断手指的弯曲程度。再把每个手指的状态(弯曲,伸直)映射到一组预定义的手势上即可。不需要在训练一个分类网络。

背景的虚化,变化,黑白效果

关于背景的虚化,变化,以及黑白效果。本质上就是得到了人像的mask,然后把mask迁移到另一张图像上罢了。不多介绍。

人脸贴纸的实现思路:

首先贴纸肯定要往脸上贴,所以需要一个人脸检测网络。还需要确保贴纸能贴到脸上的合理区域,比如猫耳朵不能把人眼睛覆盖了是吧。所以需要关键点检测。越是需要贴的准,贴的多样,就越需要检测多个关键点,一般98个关键点是很合适的,因为关键点还覆盖了头部,可以贴帽子。当然68个点也可以,只是需要根据面部比例算出头部的位置。

在我的项目中,我简化了操作。首先我在网上找到了这样的素材:

这个猫脸贴纸图包含了足够多的部分,所以我没有必要定位每个需要贴纸的位置,贴上合适的贴纸。我只要找到人脸鼻子的位置,和猫鼻子对应。然后计算合适的比例,对猫脸素材缩放,然后把素材的mask找到,算出相对坐标,直接覆盖在人脸上就ok了。

详细说下计算比例的问题。我使用centerFace检测人脸。centerFace还能输出人脸的眼部中心,鼻子,两个嘴角这五个位置的关键点。通过计算人脸鼻子到嘴角(左或者右)的距离,和猫脸素材的鼻子中心到嘴角(估计一下大概位置)的距离,这两个距离的比值,就是猫脸素材应该缩放的尺度。

然后在猫脸素材上求得所有像素点相对于鼻子中心的相对坐标,加上人脸鼻子的坐标,就是猫脸素材应该在人脸图像坐标上的具体位置。

其中,x,y是猫脸素材在猫脸图像坐标系下的坐标。通过函数f1,将坐标变换到人脸坐标系下。

画面扩展

如果检测到了5这个手势,flags将会设置对应的状态。首先会记录手掌中心的位置pospospos。然后后续帧在移动5的过程中,计算当前帧手掌中心和pospospos在x轴的距离,按照合理的比例求出当前画面有多宽的位置应该被扩展。包括画面的扩展,以及收回扩展画面,都是这样做的。

防挡弹幕

防挡弹幕,其中防挡的效果自然是用人像精细分割得到的mask来实现的,不多说。至于这个弹幕效果如何生成。哈哈。将每一条弹幕视作一个对象,加入到队列中。首先没有一个弹幕被发出,所有的弹幕都在一个队列中。每一帧都有弹幕发出,发出的弹幕出列,并进入另一个队列中。所以有两个队列,其中一个队列用来保存没有发出的弹幕,另一个队列用来保存发出的队列。对每一帧,都遍历保存发出的队列,弹幕这个对象中保存了弹幕应该出现的位置,然后draw出来,再把位置更新一下,就是x轴减去一个合理的数值,数值是和fps有关的。

项目例子

推荐先运行webCamera_demo.py看看效果。需要pytorch-GPU, tensorflow2.0等库。在我的电脑,CPU是intel i5-8300, GPU GTX1060(6GB)上,处理速度是5 fps。

同时我还提供了每个模型使用的例子,可以去example文件夹查看。

致谢

本项目受很多开源项目支撑。其中有谷歌的mediapipe,centerFace,PortraitNet。

https://github.com/google/mediapipe

https://github.com/Star-Clouds/CenterFacePortraitNet

https://github.com/dong-x16/PortraitNet

https://tech.sina.com.cn/csj/2019-08-23/doc-ihytcern3008248.shtml

https://github.com/metalwhale/hand_tracking

感谢这些开源项目,今后我也将会秉持开源精神,促进知识传播,共享技术,共同进步。

项目地址 随手赏个star吧((╹▽╹))。

https://github.com/shoutOutYangJie/HandAI/tree/master

推荐阅读:

OpenARK:惊艳的增强现实、虚实交互开源库


姿态估计与手势识别交流群

关注最新最前沿的手部关键点检测、手势识别、人体姿态估计及与其相关的人机交互技术,扫码添加CV君拉你入群,(如已为CV君其他账号好友请直接私信)

(请务必注明:手势)

喜欢在QQ交流的童鞋,可以加52CV官方QQ群:805388940。

(不会时时在线,如果没能及时通过验证还请见谅)


长按关注我爱计算机视觉

HandAI开源项目,拉近人和摄影的距离:基于手势识别完成不同的拍摄行为相关推荐

  1. 即插即用!开源项目【云框架】发布“基于Spring cloud的微服务架构”

    开发者面对新技术无非两个场景,一是不懂技术想要学习,二是懂技术想要使用. 前者需要考虑如何快速掌握技术原理并能把技术用起来,而后者需要琢磨如何花费最小代价将技术应用于生产环境. 换句话说,想要获得新技 ...

  2. dva开源项目_后台前端管理系统,基于react、typescript、antd、dva及一些特别优秀的开源库实现...

    react-antd-admin

  3. 寻优秀开源项目,百万程序员为你助力!

    在近三十年的科技创新里,开源已成为技术应用和行业数字化发展的基石,开发者极度依赖与关注开源,开源商业化也取得了巨大突破. 全球开源的大趋势下,中国正逐渐成为全球开源软件的主要使用者和核心贡献者,大力发 ...

  4. CNCF 首个中国开源项目Harbor是如何炼成的?

    题图摄于加州蒙特雷 感谢 InfoQ 万佳 编辑的采访, 本文经授权转载,增加了配图. 相关信息:招聘云原生工程师 "天南地北侃技术,自娱自乐于互联网的缝隙中",这是公众号亨利笔记 ...

  5. 开源项目在GitHub上贡献33.5W个Star!腾讯的十年“云”答卷,请收好!

    来源:新智元 本文约2800字,建议阅读6分钟 本文带你观看腾讯云主办的「2020 Techo Park」开发者大会. [ 导读 ] 根据数据,GitHub中国开发者数量增至第二,仅次于美国.这一路来 ...

  6. 开源项目面试重要吗_年度最重要的开源新闻

    开源项目面试重要吗 这是我们每周一次的开源新闻摘要的特刊,回顾2014年的热门新闻! 我最仔细地研究了商业,政府和教育领域的新闻. 关于开源如何帮助改变世界,让世界变得更美好,还有一些您不会想到的非凡 ...

  7. 这 6 个开源项目很 Cool

    推荐 6 个不错的开源项目,本文推荐的开源项目已经收录到 Awesome GitHub Repo. Awesome GitHub Repo 是逛逛 GitHub 创建的开源项目,会收集整理 GitHu ...

  8. Github的开源项目ChuanhuChatGPT和gpt-academic,专用于学术拓展ChatGPT

    目录 1 前言 2 Chuanhu ChatGPT的安装部署 3 ChatGPT学术优化 3.1 主要功能 3.2 下载软件安装运行 3.3 用docker运行 3.4 自定义快捷键(类似functi ...

  9. 新垣结衣的孩子长啥样?用 StyleGAN 开源项目,一次看个够

    作者 | 神经三羊 来源 | Hyper超神经 近日,日本男星星野源通过事务所发布声明,宣布结婚,新娘正是被不少男粉丝奉为「老婆」的新垣结衣. 「老婆嫁人了」.「星野源夺妻之痛」.「爷青结」--星野源 ...

最新文章

  1. 《工作DNA》摘录三
  2. Python sort()和sorted()函数区别及用法详解
  3. 如何实现线程间的通讯(转载)
  4. 读教材并提问-回答自己的提问
  5. xcode--常用快捷键
  6. 由SGA组件内存移动导致前台业务超时问题处理过程
  7. Kotlin入门(25)共享参数模板
  8. mysql 查看索引
  9. python中的range与xrange
  10. java技术栈有哪些_2020 年 Java 程序员应该学习掌握哪些技术?
  11. linux内存手动释放
  12. 绝版、珍藏、经典软件集合!
  13. 流程控制 case分支
  14. Pycharm相对路径
  15. Cannot save setting
  16. 猿辅导python资源_2020猿辅导(小猿搜题)高中辅导全资源合集百度网盘下载
  17. ARM Neon Intrinsics各函数介绍
  18. 前端项目运行错误提示及解决proble (1 error, 0 warnings) m1 error and 0 warnings potentially fixable with the `--fi
  19. 黑客与画家:硅谷创业之父Paul Graham文集
  20. DDPG中的Ornstein-Uhlenbeck过程怎么理解

热门文章

  1. Java7并发编程指南——第四章:线程执行器
  2. 贪心法——区间覆盖问题
  3. Linux学习笔记13
  4. C语言,后门程序,C语言CGI编程二 - 编写cmd后门
  5. 字节跳动python面试_【字节跳动Python面试】生平遇到最好的面试体验-看准网
  6. 程序语言python循环_Python 循环语句
  7. bme280 环境传感器开发板_半导体所在柔性湿度传感器与非接触控制方面取得进展...
  8. adb最新版本是多少_新版本更新有问题?别慌,来这里找答案!
  9. linux子系统gdp调试,Linux GDB调试 详述
  10. java jedis_Java操作Redis之Jedis用法详解