《Kinect应用开发实战:用最自然的方式与机器对话》一3.2 基于“管道”的系统架构

简介: 本节书摘来自华章出版社《Kinect应用开发实战:用最自然的方式与机器对话》一书中的第3章,第3.2节,作者 余涛,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.2 基于“管道”的系统架构

Kinect for Xbox 360是一个基于“管道”的体系架构,如图3-3所示。
Kinect传感器设备提供三大类的原始数据信息,包括深度数据流(depth stream)、彩色视频流(color stream)、原始音频数据(raw audio stream),同时分别对应骨骼跟踪(Skeletal Tracking)、身份识别(Identify)、语音识别(Speech Pipeline)三个处理过程。

image

1)骨骼跟踪具有以下特点:
从Kinect Primesense芯片组获取深度数据流,通过USB 2.0端口传输。
设定人体“分类”(Classification)的特征阈值,通过约定的字节编码,为每个被追踪的玩家在深度图像中创建“分割遮罩”(Segmentation)。
将深度数据中出现的游戏玩家(用户)与背景图像分割,发现玩家。
通过机器学习的结果,快速对人体部位进行分类。
通过机器学习的结果,从人体部位进一步识别关节点三维坐标,从而进行人体骨骼三维建模。
根据Xbox 360游戏场景需要进行后续的游戏渲染工作。
2)身份识别包括动作识别和人脸识别两部分,其具有以下特点:
从Kinect彩色摄像头获得视频流信息,通过USB 2.0端口传输。
玩家面部器官被分解成几个关键性的面部标志,通过彩色视频信息的特征采样进行人脸匹配。
为了提高识别精度和效率,同时结合人的着装信息、身高等因素来进行匹配。
玩家用户信息被识别,并从关联数据库中被检索。
根据玩家的个性化信息,Xbox 360游戏进行后续的游戏渲染工作。
3)语音识别处理具有以下特点:
从Kinect麦克风阵列中获取原始音频信息,通过USB 2.0端口传输。
根据特定算法进行多通道回声消除、回声抑制,适应玩家与Kinect麦克风一定距离及室内空旷回声等情况。
通过波束成形等机制,进行声源定位。
通过噪声抑制等机制,自动过滤环境噪声。
语音命令识别。
根据Xbox 360游戏场景需要进行后续的处理工作。
Kinect“体感操作”带来了全新的用户体验和交互设计,可以说用户体验、交互设计、创新技术正是Kinect成功的“三板斧”。Kinect for Xbox 360的关键技术特性归纳为如下四点:骨骼跟踪、动作识别、人脸识别、语音识别。
下面,我们逐一分析这些关键特性。

3.2.1 骨骼跟踪

骨骼跟踪是Kinect“体感操作”的基础,同时系统根据这一特性创建你的数字Avatar。
当你玩Xbox游戏时,根据Kinect传输过来的深度数据,系统将创建一个你的“数字骨架”。因此,无论当你向左或向右移动甚至跳跃时,你的Avatar都会保持一致的动作,就像照镜子一般,如图3-4所示。
image

为什么Kinect的骨骼跟踪意义非凡?从用户交互设计的角度来看,之前游戏控制器的自由度都是预先设定好的,比如键盘、鼠标、更多自由度的遥杆、带重力感应的手柄及更为先进的数字手套。骨骼跟踪的设计目标是和玩家的运动保持一致,无论他是在跳华尔兹还是在打太极拳。这其中的自由度和变换是无法穷举的,这也给Kinect For Xbox体感游戏创造了无限遐想的空间。
微软在2010年的E3上展示了Kinect Avatar,如图3-5所示。

image

Avatar可以将玩家的虚拟形象带入全新的世界中。除了步态一致的肢体控制外,系统甚至可以惟妙惟肖地克隆玩家的表情,当他笑、皱眉、点头或者说话时,虚拟形象也会做同样的动作。通过Avatar,玩家可以邀请好友加入各种虚拟环境,比如车尾野餐会场景。
骨骼跟踪要求系统在允许的延时范围内,快速构建玩家的躯干、肢体、头部甚至手指。目前这一代的Kinect技术有其自身的限制,比如视场角(FoV)有限,低于手指的分辨率,但这些限制本身应该也是更多因为相关芯片及工艺的成本,其中涉及以下三个关键点:

  1. 压缩感知
    前面在剖析Kinect硬件架构时,已经谈到黑客是利用USB记录仪截获数据进行分析的,当时令黑客大吃一惊的就是“数据洪水”(data flood)。如何从深度图像中抛弃背景图像信息,把人体骨骼抽象出来,这将是一件关键的工作。后面的原理分析会谈到,那将是“一个像素一个像素”地识别的工作,系统会通过机器学习和模式识别来压缩感知,处理这些原始数据(raw data)。
  2. 骨骼关节
    游戏中的Avatar人物与真实人体的匹配度的高低是“骨骼识别”的关键。匹配度的高低决定于能实时抽象出多少个关节点。关节点连线在一起就是一个“火柴人”,如图3-6所示。应该说关节点越多,骨骼就越真实。当然,游戏中的人物还会通过表面渲染来构建一个3D人物。

image

  1. 关节点的精度问题
    另外一个关键点是骨骼关节点精度问题,这同时涉及几个层次:

激光散斑测距采样的精度(后面会具体谈到)。
红外摄像头的采样分辨率和频率(比如Kinect深度图像默认为每秒30帧,320×240的分辨率)。
通过深度图构建骨骼数据的延时。传输延时基本可以忽略不计(正如图像显示器的刷新率一样,延时的控制应该在人的生物识别范围内,人类对事物的反应速度几乎都超过100ms)。
国外调查发现Kinect的空间判断精准度为4mm, PlayStation Move则是1mm。对于运动类的游戏而言,不用携带额外控制器的好处完全可以弥补这点精度的下降。通过Kinect,玩家可以身体自如地加入运动或比赛:用脚射门、用手挥动打乒乓、身体倾斜控制皮划艇的漂流等。
关于这一话题后面会具体分析,值得注意的是,Kinect深度图像采样频率并不是产生延迟进而使空间精度下降的主因,延迟的主因是芯片处理速度和软件识别处理速度不够。我们相信,随着硬件发展和软件升级,Kinect的空间精度会不断提高。如果你希望通过Kinect做运动竞技分析,或是用于低成本电影的动作捕捉,空间精度和响应速度将是关键的技术评估点。

3.2.2 动作识别

动作识别的基础是骨骼跟踪,广义上识别的内容包含肢体运动、手势以及静态姿势。
美国著名心理学家艾伯特赫拉伯恩曾提出过一个公式:
信息交流的结果=7%的语言+38%的语调语速+55%的表情和动作
人们在人际交往中,多达93%的信息是通过非语言方式传递,其中又以肢体语言为主。比如在美剧《Lie to me》中,卡尔莱特曼博士无需测谎仪,无需确凿证据,即使嫌疑人保持沉默,也从其最终细微的表情变化和身体语言中洞察出端倪。因此,动作识别是“体感操作”的前提,引领着新一代的自然人机交互技术,也是Kinect for Xbox 360游戏的最大卖点,如图3-7所示。
我们可以把动作抽象为骨骼关节点的状态或运动序列。手语是一种较为复杂的手势,它的表达涉及动作的连续性和持续性,不同的组合可以表达丰富的词组或短句。
如何进行动作识别呢?最为朴素的算法是基于动作序列的算法分析。正如词组匹配算法那样,你会考虑准备一个足够长的队列,然后根据预设的算法不断地扫描,中间可以用一些决策树进行有效的删减;或者,你实现一个“有限状态机”,去触发你预先定义的动作事件。
image

我们这里谈的动作识别包含两个层次的概念:
1)骨骼在某一时间点的状态,是为静态的姿势。比如图3-8所示是Kinect的“通用暂停或退出”姿势,玩家的左手倾斜举起,并与脊柱保持45度。
2)骨骼中的某一关节或是多个关节点在空间的运动序列,是为动态的行为。比如人挥动左手,或是用手在空气中划一个圈,或者双脚离地跳起,如图3-9所示。

image

显然,动态的行为分析要比静态的姿势识别要复杂得多。这其中的区别,正如语音识别中“命令词识别”和“自然语义理解”一样。
Kinect游戏中的动作表达有大致可分为两类:
大开大合的肢体运动,比如运动、舞蹈或者武术。
手的运动,包括手指运动。
人体的各个关节从运动动力学的角度来看,有着不同的自由度。其中手是人体自由度最大的部位,它包含十根手指,除拇指外每根手指又有三个关节。通过手可以完成许多动作,简单的如挥手以引起别人的注意或表示再见,复杂点的如用手来控制镜像的机械手臂。翻译聋哑人的手语无疑是最具挑战的。Kinect手语识别示意图如图3-10所示。
image

第6章会具体谈Xbox Kinect Hub的一些设计,其理念就是通过简单的手势来浏览信息、翻阅信息、暂停播放、返回主界面或是确定下一步的操作。
目前,Kinect for Window SDK v1.0中并不包含手势识别的部分,整个手在骨骼建模中只有一个点。但这并不意味着当前的Kinect版本不能进行相应的手势识别,你可以从最为原始的深度数据做起。这其中会有很多挑战,比如手指深度图像的精度不够,手指间的交替或是手指与身体的重叠都会产生很多噪声数据等。
微笑、害羞的表情、唇语,属于人脸识别的命题,虽不属于动作的范围,但又有共同之处。相信随着技术和硬件的提升,Kinect除了可以理解人类的行为外,也可以洞察人类的内在情感。

3.2.3 人脸识别

人脸识别是整个身份识别中最重要的一个组成部分,你的身份证、驾照或是毕业证上无一不记录了你的脸部照片。作为传奇人物,拿破仑在指挥作战中,不仅能准确地记住他的各个部队的具体战斗位置,而且能记住许多士兵的姓名和面容。
Kinect也将拥有如此博闻强识的本领,它能区分不同玩家、快速识别玩家的身份,从而提供更为个性化的体验,比如记住你上次听过的歌曲,或者最近玩过的游戏。通过人脸识别实现的个性化体验已经成为游戏体验的一部分,神奇之处恰恰在于你并没有做任何事情,你只是站在那里,Kinect通过人脸识别就知道你是谁,如图3-11所示。
“人脸识别”与“骨骼跟踪”类似,第一步首先定位人脸的存在,其次基于人的脸部特征,对输入的人脸图像或者视频流进行进一步的分析,包括脸的位置、大小和各个主要面部器官的位置信息,并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人的身份。
由于Kinect摄像头分辨率仅为640×480,在1.8m及以上距离的情况下,摄像头所能提供的面部的像素数据十分有限,并不适用于进行高维计算。另外,房间内光线会变,玩家时而接近时而远离Kinect,而且当玩家投入游戏时他们的面部表情也会改变,这些都会给人脸识别带来影响。还有,由于环境光照、色温和人表情的这种差异,会给人脸识别带来噪声。
目前,Kinect for Xbox的人脸识别采用了抽取人脸中层结构特征的折中方式,但这种方法无法提供100%的准确识别率(大约为85%)。前面我们提到过,这种纯二维的图片识别算法也被应用在Windows Live Photo Gallery中。同时,人脸识别还综合了着装的色彩以及玩家身高的分析,以帮助提高识别准确率。
抽象脸部特征作为Kinect的人脸识别的关键步骤。如果说Kinect骨骼跟踪是给每个玩家穿上动作捕捉“Marker”点,那么人脸识别中的脸部特征分解这一环节,恰恰就类似好莱坞电影面部捕捉的做法,如图3-12所示。
image

人脸识别另外一个需要攻克的难点在于同一个人的变化。人的面部在不同照明、表情或姿势等因素的影响下产生的差异有时让对同一个人的识别产生不同的结果。
为了识别不同表情、不同光照条件下的人脸,联想推测模型的第一步是构建一个“通用”的人脸数据库。面部器官被分解成几个关键性的标志,如眼睛中心、嘴角和其他12个面部特征。这些信息作为识别引擎搜索到的不同条件下或以不同姿势呈现的人脸的基本“记忆”元素。下一步,将特定对象的面孔,如Kinect玩家的面孔与28种不同的“记忆”图像进行对比,也就是7种姿态乘以4种光照条件。识别引擎将对目标对象面部与记忆库存储的人脸展开“关联”,对一个或多个关键的面部特征进行匹配,如处于脸部阴影一侧并且正在向左看的眼睛等。然后,系统使用这些信息就对象脸部在不同姿势和不同光照条件下的样子做出科学的猜测。

image

关于人脸识别的技术和算法有很多种,包括几何特征识别、神经网络、弹性图匹配、线段Hausdorff距离等,本书就不再展开,读者如有兴趣可参考相关资料。
Kinect for Xbox 360的人脸识别是基于彩色摄像头的信息,同时结合人的着装信息、身高来匹配的,属于纯二维的图片识别算法,并没有用到深度数据。你可以尝试基于Kinect提供的深度数据进行特征采集,提高人脸识别的精度。
提示 Kinect for Windwos SDK v1.5中增加了人脸跟踪的开发包。读者还可以访问face.com,它提供开发的API接口,方便你构造自己的人脸识别应用程序。

3.2.4 语音识别

语音识别的技术大家一点也不陌生,从前面影片中提到的HAL9000、IBM尝试过的ViaVoice,到现今苹果iPhone 4S Siri以及微软的TellMe服务,都是语音识别的产品。
从技术应用的深度及广度而言,语音识别丝毫不逊色动作识别、人脸识别。
语音识别包括很多层次的技术,如最为简单的“语音命令”、声音特征识别、语种识别、分词、语气语调情感探测等多个方面。
Kinect麦克风阵列捕获的音频数据流通过音频增强效果算法处理来屏蔽环境噪声。即使在一个大的空间,即使人离麦克风一定的距离,也能够进行语音命令的识别。Kinect阵列技术包含有效的噪声消除和回波抑制(Acoustic Echo Cancellation,AEC)算法,同时采用波束成形(Beamforming)技术通过每个独立设备的响应时间确定音源位置,并尽可能避免环境噪声的影响。
从前面的产品设计分析中我们可以了解到,Kinect for Xbox 360的语音识别也仅仅定位在简单的“语音命令”的层次。比如说“Xbox, Let抯 Play”,这里Xbox就相当于是一个命令提示符,后面的话对应着一些常用操作命令,如图3-13所示。
image

提示 Kinect for Windows SDK v1.5是基于Microsoft Speech SDK v11.0来实现的。后面开发章节,我们会有具体的例子。目前,Kinect SDK v1.5尚不支持中文语音命令支持。
在Kinect for Xbox 360中,语音识别通常用于Xbox控制中心的导航、菜单控制,以及多媒体的播放。
你可以对着Kinect说“Xbox Kinect”,进入Kinect控制中心,如图3-14所示。
对着Kinect说出“Xbox”,系统就会提示“if you see it, just say it”。比如打开光驱就说“Xbox Open Tray”,如果想去下一页就说“Xbox Next”,如果想退出Kinect控制中心就说“Xbox Dashboard”。
想用Xbox 360看电影,那就吩咐Kinect吧:Xbox Play(播放)、Xbox Pause(暂停)、Xbox Next(下一页)…
image

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
2月前
|
中间件 Go 数据处理
应用golang的管道-过滤器架构风格
【10月更文挑战第1天】本文介绍了一种面向数据流的软件架构设计模式——管道-过滤器(Pipe and Filter),并通过Go语言的Gin框架实现了一个Web应用示例。该模式通过将数据处理流程分解为一系列独立的组件(过滤器),并利用管道连接这些组件,实现了模块化、可扩展性和高效的分布式处理。文中详细讲解了Gin框架的基本使用、中间件的应用以及性能优化方法,展示了如何构建高性能的Web服务。
75 0
|
7月前
|
设计模式 数据采集 机器学习/深度学习
软件体系结构 - 架构风格(2)管道/过滤器架构风格
【4月更文挑战第21天】软件体系结构 - 架构风格(2)管道/过滤器架构风格
749 0
|
17天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
15天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
26天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
15天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
33 1
服务架构的演进:从单体到微服务的探索之旅
|
13天前
|
消息中间件 监控 安全
后端架构演进:从单体到微服务####
在数字化转型的浪潮中,企业应用的后端架构经历了从传统单体架构到现代微服务架构的深刻变革。本文探讨了这一演进过程的背景、驱动力、关键技术及面临的挑战,揭示了如何通过微服务化实现系统的高可用性、扩展性和敏捷开发,同时指出了转型过程中需克服的服务拆分、数据管理、通信机制等难题,为读者提供了一个全面理解后端架构演变路径的视角。 ####
35 8
|
14天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
42 5
|
17天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
40 7
|
16天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
32 5