用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏

今年上半年,由于疫情原因,Switch 大火,Switch 平台上有许多款体感游戏,比如:健 身环大冒险、马力欧赛车、舞力全开。这些游戏凭着“硬核健身”的标签吸引了大量玩家, 通过两个手柄配合记录传感数据,就能检测到跑步、抬腿、深蹲等动作,这种精准的体感动 作感知吸引了不少玩家。
但是,现在不需要 Switch!不需要体感手柄!树莓派+visionseed!你也可以动手自己 实现属于你的体感游戏!今天,小编就来教大家,如何从 0 开始,实现一款基于 AI 的体感 吃火锅游戏~
先为大家展示一下游戏的全流程:

  1. 玩家张嘴,游戏开始
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
  2. 玩家张嘴触碰到食物,食物消失,分数加一
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
  3. 游戏结束,显示分数
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏

什么是树莓派呢?

用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏

树莓派(Raspberry Pi)是尺寸仅有信用卡大小的一个小型电脑,您可以将树莓派连接 电视、显示器、键盘鼠标等设备使用。
树莓派能替代日常桌面计算机的多种用途,包括文字处理、电子表格、媒体中心甚至是 游戏。并且树莓派还可以播放高至 1080p 的高清视频。

神奇的 VisionSeed

提到 AI 体感游戏,大家第一时间想到的可能是高深的 AI 算法训练和复杂的工程部署, 来自不同厂家的芯片、系统框架、AI 算法之间,常常存在一定的兼容性或效率问题,导致 AI 产品开发周期长,算法效果不理想。以前用树莓派 3B 跑过人脸检测,用 OpenCV 的 Haar Cascades 算法,要 160 多毫秒才能跑完一帧人脸检测。如果用效果更好的深度神经网络模 型,比如通过 ncnn 加速框架跑 MobileNet-SSD 模型,则需要 260 多毫秒,再跑一个关键点 定位模型估计还要几十毫秒,整体帧率就只有 3fps 了。
当当当,是时候请出一个神奇的模块了,他内置了一颗 AI 加速芯片,单周期可以运行 512 次乘加运算,硬件支持卷积、池化、全连接等操作,还带了两颗手机摄像头模组,直接 能对拍到的图像跑 AI 算法进行分析,通过 UART 输出分析后的结果,非常有意思!
这就是我们隆重推出的腾讯优图 AI 视觉模组 VisionSeed!
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
目前 VisionSeed 模块提供的算法有:人脸检测、90 点关键点定位、姿态角解算、人脸 识别,还能够把自己训练的模型下载到模块上的 AI 芯片中运行。
我们先通过腾讯提供的 PC 端配置工具,看看模块上的 AI 算法输出的信息:
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
通过 USB 把 VisionSeed 连上电脑后,识别出来一个 video0 设备和 ttyACM0 设备,用配 置工具打开 ttyACM0,就能源源不断的获取到实时分析数据了,左下角马上显示出了我的脸 部关键点,随着我眨眼、摇头、张嘴,这个虚拟的小人也跟着变化,数据可视化界面上,选 择“左眼开闭”,曲线就开始滚动起来了,我每次眨眼,曲线就出现一个向下的尖峰,如果 闭眼,曲线就稳定在 0.05 以下的位置,非常灵敏!

VisionSeed 中的关键算法

VisionSeed 这么牛,那我们直接拿它提供的 90 关键点定位算法去检测张闭嘴呀! 通过下面的内置算法 ID,我们可以获取对应的算法结果:
YtVisionSeedModel.FACE_DETECTION: 人脸检测 YtVisionSeedModel.FACE_LANDMARK: 人脸关键点定位(90 点) YtVisionSeedModel.FACE_POSE: 人脸姿态(roll, yaw, picth) YtVisionSeedModel.FACE_RECOGNITION: 人脸识别
我们要把这个模组与树莓派连接,需要一根 type-c 和 usb 的数据线,如下图所示连接。 启动树莓派后,模组上会亮起绿灯,表明两者已接通。
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
那么如何获取模组的摄像头数据呢?
datalink = vs.YtDataLink( serial.Serial("/dev/ttyACM0",115200,timeout=0.5) )
通过 python 中的 pyserial 模块连接串行口,再建立连接后,就可以通过 getResult 方法
获得人脸识别、人脸姿态、人脸关键点定位等信息。
| 检测到的人脸数 |faces = result.getResult([YtVisionSeedModel.FACE_DETECTION]) |
|人脸框坐标|rect = result.getResult([YtVisionSeedModel.FACE_DETECTION, 0]) 0 表示检测到的第一个人脸,1 表示第二个,以此类推…|
| 人脸关键点定位 |shape = result.getResult([YtVisionSeedModel.FACE_DETECTION, 0, YtVisionSeedModel.FACE_LANDMARK]) |
通过 rect = result.getResult([YtVisionSeedModel.FACE_DETECTION, 0]) 就可以获取到当 前检测到的人脸框,rect.x,rect.y,rect.w,rect.h 分别代表了人脸框的左上角横坐标、左上角纵 坐标、宽度、高度。
通过 shape = result.getResult([YtVisionSeedModel.FACE_DETECTION, 0, YtVisionSeedModel.FACE_LANDMARK]) 可以获取到人脸的 90 个配准点,下图就展示了嘴 巴上的配准点
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
然后通过计算嘴巴的姿态去判断张闭嘴:
let l1 = faceShape.mouth[0].distence(faceShape.mouth[6])
let l2 = faceShape.mouth[3].distence(faceShape.mouth[9])
output = l2 / (l1 + 0.01)
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
上图的曲线所描绘的就是当我的嘴巴张开时,出现峰值;当我的嘴巴闭合时,出现谷 值。纵坐标值 output 所表现的就是嘴巴的开闭程度。

游戏设计

我们将用 python 语言来设计这个游戏,其中涉及了几个重要的第三方库:cv2、cocos、 visionseed。

  1. cv2:通过 cap = cv2.VideoCapture(0)读取模组的摄像头
  2. cocos:是用于构建游戏的框架。这个引擎就跟拍电影一样,有导演(Director),有大
    背景(Scene),还有背景上的小修饰物(Layer),还有人物(Sprite)。
  3. visionseed:通过导入 visionseed 库,通过库中的一些方法获取人脸的信息。
    类的设计
    正如之前所展示的游戏视频,此游戏主要分为三个场景:游戏开始、游戏进行中、游戏 结束。三个场景形成一个闭环。

类的设计

正如之前所展示的游戏视频,此游戏主要分为三个场景:游戏开始、游戏进行中、游戏 结束。三个场景形成一个闭环。
用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
其次,我们要定义一个类 VisionSeedLayer,继承自 cocos.layer.Layer,实现下面这些方法:

  1. on_enter( )实现场景的进入
  2. on_exit( )实现场景的离开
  3. on_frame( )显示每一帧的画面
  4. addSprite( )在图层上添加精灵
  5. posFaceToScreen( )将人脸坐标映射到屏幕坐标上
  6. recvMsg( )通过 result,msg = datalink.recvRunOnce()接收 result 数据帧
  7. recvFrame( )通过 ret, frame = cap.read( )接收 frame 视频帧
    如下图所示
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
    如下图,展示了实现 GameBegin( )中的三个主事件的核心代码:
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
    如下图,展示了实现 GameMain( )中的四个主事件的核心代码:
    用腾讯优图AI视觉模组在树莓派上玩吃火锅体感游戏
    最后我们就能实现一个简单又真实的体感游戏啦!

后记

其实 VisionSeed 不仅仅是个集成了摄像头+AI 芯片的模块,AI 算法才是效果的保证,他 内置了腾讯优图的算法,效果过硬,一直处于业界领先地位,以前一般在腾讯内部产品中 应用,比如微信刷脸支付。现在通过 VisionSeed 人工智能视觉模块,开放给外界,你我也 能接触到世界一流的腾讯人工智能算法,甚至能应用在自己的产品中,实在是非常开心。 相信腾讯的开放,会惠及更多创业者和爱好者们。
另外,模块内还包括了人脸识别功能,通过附带工具软件管理数据库,能够实时离线识 别库中的身份,非常强大,能做出很多有意思的东西,等你一起来探索!