热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手势识别原来还可以这样控制电脑,你知道怎么做到的吗?

什么是手势识别?手势是人类表达信息的重要途径之一,通过手势识别,我们可以获得表达者所要表达信息(例如对方竖起大拇指ÿ

7ffe10e52576704cb168584330911f13.png

什么是手势识别?

手势是人类表达信息的重要途径之一,通过手势识别,我们可以获得表达者所要表达信息(例如对方竖起大拇指,表达了对方的表扬之意)。本项目将基于PaddleVideo来训练一个手势识别模型,利用模型对七种手势进行识别,分别是点击、放大、向下滑动、向上滑动、缩小、旋转以及抓取。

还可以将手势识别模型的能力植入到电脑控制系统中,具体演示详见b站视频:

https://www.bilibili.com/video/BV1dh411U7SC

什么是PaddleVideo?

PaddleVideo是飞桨官方出品的视频模型开发套件,旨在帮助开发者更好的进行视频领域的学术研究和产业实践。可以简单的将其理解成一套帮助开发者快速完成开发的工具,避免重复造轮子,也会获得更好的精度。

同时PaddleVideo已包含多种模型,包括不限于PP-TSM、PP-TSN、AGCN、ST-GCN、Slowfast等等,本文采用PP-TSN模型对数据进行训练,感兴趣的同学可以自己更换模型进行尝试。

TSN

TSN全称Temporal Segment Network ,是视频分类领域非常经典的模型。其主要思想是将一整段长视频分解为K个片段,每个片段随机抽取一帧,同时将RGB图像与光流分别放入两个神经网络中提取特征。通过片段共识函数,分别融合两个不同分支的结果,最后再将两类共识融合。

同时该网络主要采取稀疏采样的方式,只在K个片段中随机抽取,因此既能捕获视频全局信息,也能去除冗余,降低计算量。

48e0eece3499c0240fa54aed360e453e.png

图引用于论文[1]

351878d63dc86c0217035e38c86ad9ae.png

图引用于论文[1]

同时TSN还采取了多模态数据增强的方式,解决样本数据偏少的情况。上图中的RGB image和RGB difference分别代表了视频中某一帧以及某一帧相邻帧的差。Optical flow 和warped optical flow fields 为视频中的光流信息。

基于以上两种数据则正好对应了网络图中的两种输入,一种RGB image,一种光流。

如何准备训练数据?

PaddleVideo PP-TSN的训练数据集使用的是由DeepMind 公布的Kinetics-400动作识别数据集。我们可以以其数据集格式作为规范进行数据准备,下面以手势识别训练数据集为例子:

af980f7dd83d32b95ac546c6a2e9ff53.png

数据集总共有七种动作,我们训练的模型也是用于识别这七种动作之一,其中开头的四个文件分别存放了对应的准备测试的视频或准备训练的视频名字以及分类。例如:

5749d515052835aacded071d2ff709f0.png

再更换自己的数据集训练时也要以这个作为参考,准备完成后即可开始训练。

基于PaddleVideo

开始训练模型

大道至简,基于PaddleVideo训练的动作分类任务时基本可以做到0代码完成训练,

在训练开始前需要先下载Backbone,具体代码为:

!wget https://videotag.bj.bcebos.com/PaddleVideo/PretrainModel/ResNet50_vd_ssld_v2_pretrained.pdparams

完成后仅需找到对应的网络训练配置文件进行修改即可,这里以PP-TSN为例:进入:PaddleVideo-develop/configs/recognition/pptsn/pptsn_k400_videos.yaml文件

bf7e8cc665a05d07dfcfcb78165442d1.png

根据项目情况对num_classes(预测类别数),pretrained(backbone模型位置),num_workers(多卡训练),以及train,vaild,test的file_path(数据集文件位置)进行修改,即可开始训练。

开始训练命令:

!python main.py  --validate -c configs/recognition/pptsn/pptsn_k400_videos.yaml

本项目经过100个epoch的训练已经达到了极好的效果:

[11/22 17:00:15] epoch:[100/100] val step:0    loss: 0.09835 top1: 1.00000 top5: 1.00000 batch_cost: 0.40634 sec, reader_cost: 0.00000 sec, ips: 39.37611 instance/sec.
[11/22 17:00:16] END epoch:100 val loss_avg: 0.09812 top1_avg: 1.00000 top5_avg: 1.00000 avg_batch_cost: 0.08464 sec, avg_reader_cost: 0.00000 sec, batch_cost_sum: 1.50070 sec, avg_ips: 53.30851 instance/sec.
[11/22 17:00:16] training ppTSN finished

预测及模型导出

训练完成后,即可对模型进行测试,可直接执行下列命令:

!python main.py  --test -c configs/recognition/pptsn/pptsn_k400_videos.yaml -w "output/ppTSN/ppTSN_best.pdparams"

最后也是收获了百分百的精度(因为数据集较少原因 可能存在过拟合情况):

64fb2426938f9e189d7e089025a94cf1.png

测试完成后,我们利用下列命令对导出预测模型:

!python tools/export_model.py -c configs/recognition/pptsn/pptsn_k400_videos.yaml -p output/ppTSN/ppTSN_best.pdparams -o inference/ppTSN

利用预测模型再次对动作进行分类(这里使用的是放大的手势视频):

!python tools/predict.py --input_file ../mydata/val/fangda40.avi \
--config configs/recognition/pptsn/pptsn_k400_videos.yaml \
--model_file inference/ppTSN/ppTSN.pdmodel \
--params_file inference/ppTSN/ppTSN.pdiparams \
--use_gpu=True \
--use_tensorrt=False

预测结果:

ea38477b5b2932688a85df549bca67d4.png

预测的结果为标号1的类别。

c0fe4c38e06c1a93fff2571f3cd2e16e.png

正好对应为我们数据集标注中的放大动作,模型训练成功🤣。

后续发展

至此,我们便完成了基于PaddleVideo训练动态手势识别的过程。项目中所选数据集为个人单独录制,所以会存在过拟合的情况,重新应用时应该收集更完善更多样的数据,这样才能达到更好的效果。希望大家可以多多尝试不同的模型,将会获得更好的效果。

当然,训练完成后任务并没有结束,结合手势识别我们能干更多有趣的事,希望未来能看到更多关于手势识别的有趣作品。

同时,强大的PaddleVideo也等待大家探索更多有趣、实用的玩法及应用。欢迎大家玩转PaddleVideo,点好star🌟不迷路哦~

PaddleVideo 的 GitHub地址:

https://github.com/PaddlePaddle/PaddleVideo

项目链接:

https://aistudio.baidu.com/aistudio/projectdetail/2298774

项目参考数据集:

https://aistudio.baidu.com/aistudio/datasetdetail/105113

参考文献:

[1] Temporal Segment Networks: Towards Good Practices for Deep Action Recognition  https://arxiv.org/abs/1608.00859

关注公众号,获取更多技术内容~


推荐阅读
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 精讲代理设计模式
    代理设计模式为其他对象提供一种代理以控制对这个对象的访问。代理模式实现原理代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色ÿ ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  •  项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例 ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • charles3.11.1抓https包
    结论先行:用的是安卓测试机,没加固之前的生产环境的安装包,可以抓到https请求加固之后的包【也就是要上应用市场的包】,抓不到https请求电脑上的操作:1.安装证书【电脑上安装了 ... [详细]
  • 初学反射基本原理
    反射:框架设计的灵魂*框架:半成品软件。可以在框架的基础上进行软件开发,简化编码*反射:将类的各个组成部分封装为其他对象 ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
author-avatar
卢健波_785
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有