前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >飞桨手势识别带你玩转神庙逃亡

飞桨手势识别带你玩转神庙逃亡

作者头像
用户1386409
发布于 2020-03-30 02:53:44
发布于 2020-03-30 02:53:44
1.7K0
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle
随着经济社会的进步,人们对美好生活的追求也不断地刺激着电子娱乐行业的发展。但这些应用场景的人机交互方式却一直被束缚在通过键盘、鼠标、触摸屏的物理接触方式上。这些传统的交互方式将玩家的操作范围局限在简单的二维平面空间,也限制了游戏开发者创意的发挥。因此,我们引入了一种新的人机交互模式——手势识别交互。

手势交互方式符合人类思维逻辑,具有自然性和直观性等特点。使用者不需要有过高的门槛,便可以很好地体验到人机交互的乐趣。手势识别技术具有良好的应用前景——包括电子娱乐、智能家居、VR及自动驾驶等热点领域。这个项目设计的目的就是实现简单直观的人机交互方式,并促使该技术和产品在未来大规模民用成为可能。

我们的项目基于飞桨及其高性能端侧推理引擎Paddle Lite开发,实现了在基于Android系统的手机、平板电脑、嵌入式开发板上利用手势来实时控制贪吃蛇、神庙逃亡、地铁跑酷等交互式游戏,并可在大屏幕端进行投屏展示。

项目内容

手势识别交互系统采用分层架构、模块化方式进行设计,可满足系统定制及扩展的灵活要求。主要包括:前端采集模块、算法模块、通信模块。

01

采集模块

采集模块实现了Android设备上图像采集与设备运行状态的监控功能。通过高频调用关联相机来获取手势图片,将采集到的图片放入缓冲池中以供算法分析模块使用。此外,采集模块还负责对所连设备进行状态监测,如相机离线将及时产生预警,并支持自动重连等功能,保证系统的稳定性。

1. 拍照方法的实现

Android Camera是安卓系统提供的实现自定义相机功能的官方支持库,采集模块封装了一系列相关调用方法,实现了连续抓拍存储及浮窗实时预览的效果。

此外,对于没有自带摄像头的安卓设备(如嵌入式开发板),我们使用外接USB摄像头,并完成 USB摄像头的驱动模块的编写,实现了设备对外接摄像头的调用及相关配置功能。

2. 浮窗实时预览

为了便于调试,通过Service组件定制浮窗的方式来在实时显示当前摄像机的预览画面、手势识别结果、处理响应延时等信息,并设立了开关来一键控制程序,如图所示.

浮窗实时预览效果(镜像显示)

02

算法模块

算法模块负责对输入的手势图片进行分类,并将识别结果返还。此部分的开发流程如下所示。

1. 数据集的选取与采集

在数据集的选取上,从NUS Hand Posture Dataset II[1]中选择了5类作为手机、平板电脑等小型设备的手势。该数据集每一类手势由40名志愿者分别在不同的环境下拍摄,并重复5次;同时每类还含有75张有人类身体噪音的图片。共(200+75)×5=1375张图片。

在研究过程中,我们发现NUS数据集的手势不符合所应用游戏的正常操作习惯(即上下左右)。因此,我们重新设计并自己采集了数据集,用于电视端远距离的演示。该数据集同样有5种类别,每类由3名志愿者在6种场景下重复6次,共540张图片。但自己在实验室采集的数据集环境比较单一,只适用于特定环境的展示。

从NUS Hand Posture Dataset II选取的5中手势, 环境复杂、部分手势不符合游戏操作习惯:

从左至右分别对应控制命令:无控制、上、下、左、右

重新设计并自己采集的数据集示例,环境单一、手势符合游戏操作习惯:

从左至右分别对应控制命令:无控制、上、下、左、右

2. 数据集增广、划分与预处理

由于深度神经网络的训练需要足够的数据支持,规模过小的数据集会使得模型的泛化能力差,容易导致过拟合。因此,我们按以下步骤对NUS数据集进行了增广,并划分为训练集、测试集:

  • 从原始1000张无噪音图片、375张有噪音图片中都分别选择125张,共250张作为测试集,以保证数据集在有无噪音、类别等维度的分布相同;
  • 将剩余的875张无噪音图片、250张有噪音图片都分别扩充为3500张,共7000张图片形成训练集。增广方式有:0.8~0.9倍的随机裁剪、以图片中心为旋转中心的±10°的随机旋转。

此外,还通过padding的方式将图片调整为方形,以保持原始手势及背景的长宽比。最后,在将图片传入神经网络之前,对图片进行z-score归一化,以加快神经网络的收敛速度。

数据集增广及预处理效果如下图所示:

数据集增广、预处理示意图(左:padding后的原图为方形,中:随机裁剪,右:随机旋转)

3. 设计、搭建与训练神经网络

卷积神经网络的选取与设计上,由于要将模型应用于计算资源非常受限的Android平台上,因此考虑选用轻量级神经网络MobileNet[2]。

MobileNet是目前常用的可以在移动设备端部署的轻量级神经网络。它将标准卷积用Depthwise Convolution和Pointwise Convolution代替,减少了模型参数与计算量。我们利用百度开源深度学习框架飞桨搭建MobileNet并进行训练。

较低延时是手势实时控制游戏的关键。为了降低算法延时,即尽可能减少模型参数量与计算量,但同时保证算法准确率,我们在MobileNet模型(

https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/models/mobilenet_v1.py)的基础上,通过调整网络结构(层数、各层通道数),设计多组实验进行对比,结果如表1所示。其中模型输入图片尺寸为120×120×3。最终选择了算法延时小,同时识别准确率较高的模型(序号3),其结构如表2所示。

4. 模型保存

在训练过程中,将模型进行保存,用于之后的推理预测。具体地,在训练时每个epoch都将神经网络的参数进行保存,并评估测试集准确率。训练完成后,选择测试集准确率最高的模型作为预测模型。

5. Android端推理

最后,基于Paddle Lite在Android端加载模型并进行推理预测。

首先我们要编译Android端能够调用的CPP库。本项目中编译的是Paddle Lite。编译时,参考Paddle Lite在GitHub平台上Android部分开发文档

https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/mobile/doc/development_android.md),基于Ubuntu系统,利用Android NDK及CMake交叉编译出符合我们Android硬件环境的库libpaddle-mobile.so文件。

之后,将采集模块中摄像头捕捉的图片按照训练模型前完全一致的方法进行预处理,并加载保存好的预测模型,通过调用刚才编译的libpaddle-mobile.so库提供的API,就能实现Android端的推理。

下面是没有运行游戏的演示效果。将识别结果和包括摄像头拍照、算法推理、控制的总延时显示在浮窗上,方便调试。

03

通信模块

通信模块根据算法不同的推理预测结果,向操作系统发送相对应的控制命令,就实现了应用程序的控制。

跨进程操作通常采用进程间通讯,可建立专用通讯管道实现,我们采用向Android系统直写shell命令模拟动作事件的方式来实现系统控制功能,这种方式快捷高效,但需先取得root权限。

实验中用到的设备参数如表3所示。

作品展示

01

手机端贪吃蛇游戏

02

平板电脑端神庙逃亡游戏

03

嵌入式板+电视投屏端神庙逃亡游戏

总结

我们的手势识别交互系统是面向人机交互的嵌入式应用程序,用户仅需使用带有摄像头的安卓设备便可以利用手势实现对界面(游戏)的控制。利用嵌入式主板丰富的接口带来的多平台投影功能,还可以得到更好的展示与体验效果。

本项目中手势指令发出、识别不依赖任何可穿戴的设备,可以使用户获得沉浸式体验,并可带动相关游戏开发、设备制造等产业的发展。相信手势识别等AI技术在未来会更加完善,改善人类生活。

参考文献

[1] Pisharady P K, Vadakkepat P, Loh A P. Attention Based Detection and Recognition of Hand Postures Against Complex Backgrounds[J]. International Journal of Computer Vision, 2013, 101(3): 403-419.

[2] Howard A G, Zhu M, Chen B, et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications[J]. arXiv: Computer Vision and Pattern Recognition, 2017.

注:本文示例代码和视频所使用的是Paddle Lite早期版本,目前最新版本为Lite 2.3.0,项目链接:https://github.com/PaddlePaddle/Paddle-Lite

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot下使用rabbitMQ之开发配置方式(二)
消息参数传递在开发中也是个坑,不论使用内置的SimpleMessageConverter还是Jackson2JsonMessageConverter均无法让Consumer接收动态参数
上帝
2023/10/16
6040
springboot下使用rabbitMQ之开发配置方式(二)
RabbitMQ 使用细节 → 优先级队列与ACK超时
  说到队列,相信大家一定不陌生,是一种很基础的数据结构,它有一个很重要的特点:先进先出
青石路
2024/02/19
1.1K0
RabbitMQ 使用细节 → 优先级队列与ACK超时
RabbitMQ消息监听异常问题探究「建议收藏」
在使用Spring RabbitMQ做消息监听时,如果监听程序处理异常了,且未对异常进行捕获,会一直重复接收消息,然后一直抛异常。为了更好的描述问题,下面写个简单的例子。
全栈程序员站长
2022/09/22
1K0
RabbitMQ消息监听异常问题探究「建议收藏」
如何解决eclipse远程服务器上面的Rabbitmq连接超时问题?
1、嗯,问题呢,就是一开始安装好RabbitMQ,练习了一下RabbitMQ的使用,但是呢,过了一段时间,我来复习的时候,发现运行出现下面的错误了。后来想想,是自己学习微服务的时候,修改了/etc/h
别先生
2019/11/23
1.6K0
springboot下使用rabbitMQ之开发配置方式(一)
本次结合着B站某MQ视频以及最近在MQ上的实践聊一聊个人在使用rabbitMQ中所得。
上帝
2023/10/16
1.2K0
springboot下使用rabbitMQ之开发配置方式(一)
RabbitMQ日常爬坑分享
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhiqiang0316/article/details/91346480
林老师带你学编程
2019/07/02
2.3K0
rabbitmq实际使用案例_沉默的螺旋案例
大家好,又见面了,我是你们的朋友全栈君。 一.发布与订阅模式(队列–>交换机) yml配置: server: port: 8088 spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest publisher-confirm-type: correlated #消息确认方式,通过 correlated 来确认(将来的消息中才会带 correlation_
全栈程序员站长
2022/11/10
7030
rabbitmq实际使用案例_沉默的螺旋案例
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
◆ 异步消息监听容器 ◆ 原生提供RabbitTemplate,方便收发消息 ◆ 原生提供RabbitAdmin,方便队列、交换机声明 ◆ Spring Boot Config原生支持RabbitMQ
不愿意做鱼的小鲸鱼
2022/09/26
1.6K0
RabbitMQ学习笔记(四)——RabbitMQ与SpringBoot适配
Spring Cloud Stream消费失败后的处理策略(一):自动重试
今天第一节,介绍一下Spring Cloud Stream中默认就已经配置了的一个异常解决方案:重试!
程序猿DD
2018/12/27
1.3K0
Rabbitmq延迟队列实现定时任务
开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期、订单定时关闭、微信支付2小时未支付关闭订单等等,都需要用到定时任务,但是定时任务本身有一个问题,一般来说我们都是通过定时轮询查询数据库来判断是否有任务需要执行,也就是说不管怎么样,我们需要先查询数据库,而且有些任务对时间准确要求比较高的,需要每秒查询一次,对于系统小倒是无所谓,如果系统本身就大而且数据也多的情况下,这就不大现实了,所以需要其他方式的,当然实现的方式有多种多样的,比如Redis实现定时队列、基于优先级队列的JDK延迟队列、时间轮等。因为我们项目中本身就使用到了Rabbitmq,所以基于方便开发和维护的原则,我们使用了Rabbitmq延迟队列来实现定时任务,不知道rabbitmq是什么的和不知道springboot怎么集成Rabbitmq的可以查看我之前的文章Spring boot集成RabbitMQ
搜云库技术团队
2019/10/18
3.5K0
【RabbitMQ分析】01 SimpleMessageListenerContainer原理分析
SimpleMessageListenerContainer是spring在rabbitmq原生api基础上封装实现的一个消费工具类,该类非常强大,可以实现:监听单个或多个队列、自动启动、自动声明,它还支持动态配置,如动态添加监听队列、动态调整并发数等等,基本上对RabbitMQ消费场景这个类都能满足。如@RabbitListener、cloud-stream中StreamListener中底层实现都是基于该类,所以,理解SimpleMessageListenerContainer原理对理解spring rabbitmq中消费模型非常关键。
Reactor2020
2023/03/22
3.5K0
【RabbitMQ分析】01 SimpleMessageListenerContainer原理分析
rabbitmq动态创建队列
阿超
2023/11/22
4640
【Rabbitmq篇】RabbitMQ⾼级特性----消息确认
前期讲了RabbitMQ的概念和应⽤,RabbitMQ实现了AMQP0-9-1规范的许多扩展,在RabbitMQ官⽹上,也给⼤家介绍了RabbitMQ的⼀些特性,我们挑⼀些重要的且常⽤的给⼤家讲⼀下
用户11369558
2024/11/20
6640
【Rabbitmq篇】RabbitMQ⾼级特性----消息确认
SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施,如果对限流细节有兴趣请参照之前的文章阅读:消费端限流
海向
2019/09/23
2.7K0
SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
Springboot 整合RabbitMQ ---基于Class的开发
1 加载配置文件 package com.zjxnjz.mall.core.config; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import
用户5927264
2019/08/01
4810
SpringBoot: RabbitMQ消息队列之同时消费多条消息
basicQos(int prefetchCount) basicQos(int prefetchCount, boolean global) basicQos(int prefetchSize, int prefetchCount, boolean global)
Freedom123
2024/03/29
5100
手把手带你Springboot整合RabbitMq ,一篇讲完
该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。(但是关于rabbitMq的安装,就不介绍了)
java进阶架构师
2020/06/16
1.7K0
手把手带你Springboot整合RabbitMq ,一篇讲完
RabbitMQ与Spring的框架整合之Spring AMQP实战
  RabbitAdmin类可以很好的操作RabbitMQ,在Spring中直接进行注入即可。注意,autoStartup必须设置为true,否则Spring容器不会加载RabbitAdmin类。RabbitAdmin底层实现就是从Spring容器中获取Exchange交换机、Binding绑定、RoutingKey路由键以及Queue队列的@Bean声明。
别先生
2019/12/02
1.8K0
如何使用 Spring 和 RabbitMQ 创建一个简单的发布和订阅应用程序?
原标题:Spring认证中国教育管理中心-了解如何使用 Spring 和 RabbitMQ 创建一个简单的发布和订阅应用程序。(内容来源:Spring中国教育管理中心)
IT胶囊
2022/02/10
2K0
如何使用 Spring 和 RabbitMQ 创建一个简单的发布和订阅应用程序?
【RabbitMQ】如何进行消息可靠投递【上篇】
前几天,突然发生线上报警,钉钉连发了好几条消息,一看是RabbitMQ相关的消息,心头一紧,难道翻车了?
弗兰克的猫
2019/09/29
1.1K1
【RabbitMQ】如何进行消息可靠投递【上篇】
推荐阅读
相关推荐
springboot下使用rabbitMQ之开发配置方式(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档