首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >体感游戏 | 手势识别玩飞机大战游戏(四) 使用深度学习实现手势识别玩飞机大战游戏

体感游戏 | 手势识别玩飞机大战游戏(四) 使用深度学习实现手势识别玩飞机大战游戏

作者头像
Color Space
发布于 2021-01-22 02:25:13
发布于 2021-01-22 02:25:13
2K00
代码可运行
举报
运行总次数:0
代码可运行
后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是:
  • 使用Pygame实现简易飞机大战小游戏
  • 使用Python+OpenCV实现简单手势识别
  • 使用OpenCV实现手势识别玩飞机大战游戏
  • 使用深度学习实现手势识别玩飞机大战游戏

今天是第四部分:使用深度学习实现手势识别玩飞机大战游戏的功能。这里标题我把TensorFlow实现改为了深度学习实现,这里识别手势主要用到的是目标检测,当然不止TensorFlow可以实现,其他能够做到实时的目标检测网络也很多,比如最近比较火的YoloV4/V5。这里演示我为了方便,就用我以前训练好的SSD手势识别模型,你只需要使用下面的代码,加载模型就可以测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import sys
import tarfile
import cv2
import tensorflow as tf
import numpy as np

from utils import label_map_util
from utils import visualization_utils as vis_util

# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_FROZEN_GRAPH = './export/frozen_inference_graph_ssd.pb'

# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('./data', 'hands_label_map.pbtxt')

NUM_CLASSES = 3
   
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_FROZEN_GRAPH, 'rb') as fid:
    serialized_graph = fid.read()
    od_graph_def.ParseFromString(serialized_graph)
    tf.import_graph_def(od_graph_def, name='')

label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categorys = label_map_util.convert_label_map_to_categories(label_map,max_num_classes=NUM_CLASSES,use_display_name=True)
categorys_index = label_map_util.create_category_index(categorys)

config = tf.ConfigProto()
config.gpu_options.allow_growth = True

cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("xxx.mp4")

with detection_graph.as_default():
  with tf.Session(graph=detection_graph,config=config) as sess:
    #image = cv2.imread("./VOC2012/JPEGImages/700.jpg")
    while True:
      start = cv2.getTickCount()
      ret,image = cap.read()
      image_np_expanded = np.expand_dims(image,axis = 0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      (boxes,scores,classes,num_detections) = sess.run([boxes,scores,classes,\
                                num_detections],feed_dict={image_tensor:image_np_expanded})
      vis_util.visualize_boxes_and_labels_on_image_array(
        image,
        np.squeeze(boxes),
        np.squeeze(classes).astype(np.int32),
        np.squeeze(scores),
        categorys_index,
        min_score_thresh = 0.5,
        use_normalized_coordinates = True,
        line_thickness = 5  
        )
    
      end = cv2.getTickCount()
      use_time = (end - start) / cv2.getTickFrequency()
      print("use_time:%0.3fs" % use_time)
      strText = ("SSD one frame use_time: %0.3fs" % use_time)
      cv2.putText(image,strText,(5,30),cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,255,0),2)
      cv2.imshow("object_detection", image)
      if cv2.waitKey(1)&0xFF ==27:
        break
cv2.destroyAllWindows()

上面是用TensorFlow Object Detection API训练的SSD手势识别模型,训练步骤网上很多参考文章,当然这里可以替换为YoloV4或者YoloV5,识别的时候可以使用GPU加速或者OpenVINO CPU加速。

用深度学习目标检测的方法和OpenCV传统方法识别的优缺点这里做个简单说明:

OpenCV手势识别优缺点:

  • 优点 :灵活、简单、省时。在允许情况下做简单算法设计即可达到较好的效果,不用花长时间标注样本和训练;
  • 缺点:对环境(光照,背景等)适应性差。

深度学习目标检测手势识别优缺点:

  • 优点:对环境(光照,背景等)适应性好---前提是样本足够丰富足够多 可以使用硬件加速;
  • 缺点:耗费时间长(包括标注时间、训练时间和调参优化等)

所以总体来说,各有优缺点,根据实际情况来使用,我们工作中一般能使用传统算法解决的尽量不用深度学习,看大家自己的应用场景决定吧。

剩余的步骤就和上篇文章一样了,讲手势识别部分用目标检测的方法代替即可,源码前面的文章都有,大家自己组合整理一下就可以用,有兴趣可以自行优化。

如果您看到这,相比也算是本公众号的真爱粉了,下面做一个简单调研活动,我想了解下大家比较希望看到在公众号更新哪些内容呢?可以投票或留言回复,我会根据投票和留言点赞数尽量多更新相关文章,谢谢。

觉得有用,麻烦给个赞和在看~

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

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Shell编程基础篇-下
惨绿少年
2017/12/27
1.7K0
Shell编程基础篇-下
Shell编程基础篇-上
本文介绍了如何利用WooCommerce快速搭建一个专业的电商网站,从安装步骤、主题定制、插件使用、SEO优化、支付与物流、客户管理等六个方面进行了详细讲解,帮助读者快速上手WooCommerce,为电商事业添砖加瓦。
惨绿少年
2017/12/27
2.2K0
Shell编程基础篇-上
sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10
惨绿少年
2017/12/27
3.6K0
Shell编程基础02
条件表达式 文件判断 常用文件测试操作符: 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 -f文件,f的全拼为file 文件存在且为普通文件则为真,即测试表达式成立 -e文件,e的全拼为exist 文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件 -r文件,r的全拼为read 文件存在且可读则为真,即测试表达式成立 -s文件,s的全拼为size 文件存在且文件大小不为0则为真,即测试表达式成立 -w文件,w的全拼为
mikelLam
2022/10/31
3190
shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
惨绿少年
2017/12/27
1.4K0
Shell编程100例,超赞!
7、检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用字串对比版本)
C语言中文社区
2022/05/31
3.8K0
shell 编程详细命令
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
飞询
2025/08/01
4080
LXC 容器集chroot使用说明
1.1 LXC是什么? 1.1.1 关于LXC LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易
惨绿少年
2018/03/30
4K0
一文彻底弄懂Linux-Shell编程
‐su: syntax error near unexpected token `} '
Maynor
2022/09/28
1.1K0
一文彻底弄懂Linux-Shell编程
CentOS 7.X 系统安装及优化
  修改CentOS7网卡名称为传统名称eth0格式 http://oldboy.blog.51cto.com/2561410/1722101
惨绿少年
2019/05/24
1.7K0
ansible服务部署与使用
第1章 ssh+key实现基于密钥连接(ansible使用前提) 说明:    ansible其功能实现基于SSH远程连接服务 使用ansible需要首先实现ssh密钥连接 1.1 部署ssh ke
惨绿少年
2017/12/27
4.3K0
ansible服务部署与使用
02·Shell编程-变量
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.1K0
02·Shell编程-变量
centos7_1708 安装
惨绿少年
2017/12/14
1.6K0
centos7_1708 安装
Shell编程
文章目录 1. Shell编程 1.1. 变量 1.2. 位置参数变量 1.2.1. $*与$@的区别 1.2.2. 实例 1.3. 预定义变量 1.4. 运算符 1.4.1. 基本语法 1.4.2. 实例 1.5. 判断语句 1.5.1. 基本语法 1.5.2. 常用判断条件 1.5.3. 实例 1.6. 流程控制 1.6.1. if 1.6.1.1. 基本语法 1.6.1.2. 实例 1.6.2. case 1.6.2.1. 基本语法 1.6.2.2. 实例 1.6.3. for循环 1.6.3.1
爱撒谎的男孩
2019/12/31
6090
Linux中常见问题(磁盘 定时任务)
根据文章内容总结的摘要
惨绿少年
2017/12/27
9480
Git详解及 github与gitlab使用
惨绿少年
2017/12/27
3.3K1
Git详解及 github与gitlab使用
linux系列之shell编程(一)
$n 功能描述:n为数字,$0 代表该脚本名称,$1-$9代表第一到第九个参数,十以内的参数,十以上的参数需要用大括号包含,如${10}
趣学程序-shaofeer
2020/07/11
1.5K0
linux系列之shell编程(一)
Linux Shell编程入门
注意:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。
程裕强
2022/05/06
3.3K0
Shell编程
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。
用户4870038
2021/02/05
5.3K0
Shell编程
101个shell脚本
emm。。这个脚本是因为tomcat没有自带的能够给service开机启动的脚本,我就琢磨着自己写了一个简单的启动脚本,如下:
端碗吹水
2020/09/23
1.5K0
101个shell脚本
相关推荐
Shell编程基础篇-下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档