互联网加竞赛 基于机器视觉的手势检测和识别算法

0 前言

🔥 优质竞赛项目系列,今天要分享的是

基于深度学习的手势检测与识别算法

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 实现效果

废话不多说,先看看学长实现的效果吧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 技术原理

2.1 手部检测

主流的手势分割方法主要分为静态手势分割和动态手势分割两大类方法。

  • 静态手势分割方法: 单张图片利用手和背景的差异进行分割,

  • 动态手势分割方法: 利用了视频帧序列的信息来分割。

2.1.1 基于肤色空间的手势检测方法

肤色是手和其他背景最明显的区分特征,手的颜色范围较统一并且有聚类性,基于肤色的分割方法还有处理速度快,对旋转、局部遮挡、姿势变换具有不变性,因此利用不同的颜色空间来进行手势分割是现在最常用的方法。

肤色分割的方法主要有以下几种:基于参数、非参数的显式肤色聚类方法。参数模型使用高斯颜色分布,非参数模型则是从训练数据中获得肤色直方图来对肤色区间进行估计。肤色聚类显式地在某个特定的颜色空间中定义了肤色的边界,广义上看是一种静态的肤色滤波器,如Khan根据检测到的脸部提出了一种自适应的肤色模型。

肤色是一种低级的特征,对计算的消耗很少,感知上均匀的颜色空间如CIELAB,CIELUV等已经被用于进行肤色检测。正交的颜色空间如,YCbCr,YCgCr,YIQ,YUV等也被用与肤色分割,如Julilian等使用YCrCb颜色空间,利用其中的CrCb分量来建立高斯模型进行分割。使用肤色分割的问题是误检率非常高,所以需要通过颜色校正,图像归一化等操作来降低外界的干扰,提高分割的准确率。

基于YCrCb颜色空间Cr, Cb范围筛选法手部检测,实现代码如下:


# 肤色检测之二: YCrCb中 140<=Cr<=175 100<=Cb<=120
img = cv2.imread(imname, cv2.IMREAD_COLOR)
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域
(y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道分量图像

skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据
(x, y) = cr.shape # 获取源图像数据的长和宽

# 遍历图像, 判断Cr和Br通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0
for i in  range(0, x): 
	for j in  range(0, y):
		if (cr[i][j] >  140) and (cr[i][j] <  175) and (cb[i][j] >  100) and (cb[i][j] <  120):
			skin2[i][j] =  255
		else:
			skin2[i][j] =  0

cv2.imshow(imname, img)
cv2.imshow(imname +  " Skin2 Cr+Cb", skin2)

检测效果:

在这里插入图片描述
在这里插入图片描述

2.1.2 基于运动的手势检测方法

基于运动的手势分割方法将运动的前景和静止的背景分割开,主要有背景差分法、帧间差分法、光流法等。

帧间差分选取视频流中前后相邻的帧进行差分,设定一定的阈值来区分前景和后景,从而提取目标物体。帧差法原理简单,计算方便且迅速,但是当前后景颜色相同时检测目标会不完整,静止目标则无法检测。

背景差分需要建立背景图,利用当前帧和背景图做差分,从而分离出前后景。背景差分在进行目标检测中使用较多。有基于单高斯模型,双高斯模型的背景差分,核密度估计法等。景差分能很好的提取完整的目标,但是受环境变化的影响比较大,因此需要建立稳定可靠的背景模型和有效的背景更新方法。


1, 读取摄像头
2, 背景减除
fgbg1 = cv.createBackgroundSubtractorMOG2(detectShadows=True)
fgbg2 = cv.createBackgroundSubtractorKNN(detectShadows=True)
# fgmask = fgbg1.apply(frame)
fgmask = fgbg2.apply(frame) # 两种方法
3, 将没帧图像转化为灰度图像 在高斯去噪 最后图像二值化
gray = cv.cvtColor(res, cv.COLOR_BGR2GRAY)
blur = cv.GaussianBlur(gray, (11, 11), 0)
ret, binary = cv.threshold(blur, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4, 选取手部的 ROI 区域 绘制轮廓
gesture = dst[50:600, 400:700]
contours, heriachy = cv.findContours(gesture, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 获取轮廓本身
for i, contour in enumerate(contours): # 获取轮廓
cv.drawContours(frame, contours, i, (0, 0, 255), -1) # 绘制轮廓
print(i)

在这里插入图片描述

2.1.3 基于边缘的手势检测方法

基于边缘的手势分割方法利用边缘检测算子在图像中计算出图像的轮廓,常用来进行边缘检测的一阶算子有(Roberts算子,Prewitt算子,Sobel算子,Canny算子等),二阶算子则有(Marr-
Hildreth算子,Laplacian算子等),这些算子在图像中找到手的边缘。但是边缘检测对噪声比较敏感,因此精确度往往不高。

边缘检测代码示例:


import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.signal as signal # 导入sicpy的signal模块

# Laplace算子
suanzi1 = np.array([[0, 1, 0],  
                    [1,-4, 1],
                    [0, 1, 0]])

# Laplace扩展算子
suanzi2 = np.array([[1, 1, 1],
                    [1,-8, 1],
                    [1, 1, 1]])

# 打开图像并转化成灰度图像
image = Image.open("pika.jpg").convert("L")
image_array = np.array(image)

# 利用signal的convolve计算卷积
image_suanzi1 = signal.convolve2d(image_array,suanzi1,mode="same")
image_suanzi2 = signal.convolve2d(image_array,suanzi2,mode="same")

# 将卷积结果转化成0~255
image_suanzi1 = (image_suanzi1/float(image_suanzi1.max()))*255
image_suanzi2 = (image_suanzi2/float(image_suanzi2.max()))*255

# 为了使看清边缘检测结果,将大于灰度平均值的灰度变成255(白色)
image_suanzi1[image_suanzi1>image_suanzi1.mean()] = 255
image_suanzi2[image_suanzi2>image_suanzi2.mean()] = 255

# 显示图像
plt.subplot(2,1,1)
plt.imshow(image_array,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,3)
plt.imshow(image_suanzi1,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,4)
plt.imshow(image_suanzi2,cmap=cm.gray)
plt.axis("off")
plt.show()

2.1.4 基于模板的手势检测方法

基于模版的手势分割方法需要建立手势模版数据库,数据库记录了不同手势不同场景下的手势模版。计算某个图像块和数据库中各个手势的距离,然后使用滑动窗遍历整幅图像进行相同的计算,从而在图像正确的位置找到数据库中的最佳匹配。模版匹配对环境和噪声鲁棒,但是数据库需要涵盖各种手型、大小、位置、角度的手势,并且因为需要遍历整个图像进行相同的计算,实时性较差。

2.1.5 基于机器学习的手势检测方法

贝叶斯网络,聚类分析,高斯分类器等等也被用来做基于肤色的分割。随机森林是一种集成的分类器,易于训练并且准确率较高,被用在分割和手势识别上。建立肤色分类的模型,并且使用随机森林对像素进行分类,发现随机森林得到的分割结果比上述的方法都要准确.

3 手部识别

毫无疑问,深度学习做图像识别在准确度上拥有天然的优势,对手势的识别使用深度学习卷积网络算法效果是非常优秀的。

3.1 SSD网络

SSD网络是2016年提出的卷积神经网络,其在物体检测上取得了很好的效果。SSD网络和FCN网络一样,最终的预测结果利用了不同尺度的特征图信息,在不同尺度的特征图上进行检测,大的特征图可以检测小物体,小特征图检测大物体,使用金字塔结构的特征图,从而实现多尺度的检测。网络会对每个检测到物体的检测框进行打分,得到框中物体所属的类别,并且调整边框的比例和位置以适应对象的形状。

在这里插入图片描述

3.2 数据集

我们实验室自己采集的数据集:

数据集包含了48个手势视频,这些视频是由谷歌眼镜拍摄的,视频中以第一人称视角拍摄了室内室外的多人互动。数据集中包含4个类别的手势:自己的左右手,其他人的左右手。数据集中包含了高质量、像素级别标注的分割数据集和检测框标注数据集,视频中手不受到任何约束,包括了搭积木,下棋,猜谜等活动。

在这里插入图片描述

需要数据集的同学可以联系学长获取

3.3 最终改进的网络结构

在这里插入图片描述
在这里插入图片描述

最后整体实现效果还是不错的:
在这里插入图片描述

4 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(超详细)9-YOLOV5改进-添加EffectiveSEModule注意力机制

1、在yolov5/models下面新建一个EffectiveSEModule.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch from torch import nn as nn from timm.models.layers.create_act import create_act_layerclass EffectiveSEModule(nn.Module):def __init__…

【Leetcode】277.搜寻名人

一、题目 1、题目描述 假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。 现在你想要确认这个 “名人” 是…

【Linux】基本指令收尾

文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了&#xff0c;还有几个基本指令我们需要说一下 首先是Date&#xff0c;它是用来显示时间和日期 直接输入date的话显示是有点不好看的&#xff0c;所以我们可以根据自己的喜欢加上分隔符&…

java垃圾回收GC过程

GC&#xff08;Gabage Collection&#xff09; 用于回收堆中的垃圾数据 清理方法 1.标记-清理 对数据标记&#xff0c;然后清理 缺点&#xff1a;容易产生内存碎片 2.标记-整理 对标记后的数据清理&#xff0c;剩下数据前移 缺点&#xff1a;每次清理后数据都要迁移&#xff0…

二叉树(一)

&#x1f4d1;前言 本文主要是【数据结构】——二叉树使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

第13节-简历中的开放性问题

(点击即可收听) 不少公司的开放式题目每年不会有太大的变化&#xff0c;所以在答题前可先去相关求职论坛看看这些公司往年的问题&#xff0c;分析和思考自己应当怎么回答 开放式问题回答技巧 开放式问题主要考察的是求职者的求职动机、解决问题的能力、创造力等软实力&#xff…

已解决java.lang.ClassNotFoundException——java连接mysql8/mysql5

1.准备工作 1.mysql8下载安装 这里大家没必要去mysql官网安装&#xff0c;可以直接安装phpStudy_pro,毕竟小皮面板的宣言是让天下没有难配的服务器环境&#xff0c;如下是小皮面板的界面&#xff08;同样的&#xff0c;此次用到的所有资料文末公众号可免费领取&#xff09;&a…

MSPM0L1306例程学习-UART部分(3)

MSPM0L1306例程学习系列 1.背景介绍 写在前边的话&#xff1a; 这个系列比较简单&#xff0c;主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包&#xff0c;具体可到官网下载并安装: https://www.ti…

快速傅立叶变换FFT学习笔记

什么是FFT&#xff1f; FFT&#xff08;Fast Fourier Transformation&#xff09; 是离散傅氏变换&#xff08;DFT&#xff09;的快速算法&#xff0c;即快速傅氏变换。FFT使计算机计算离散傅里叶变换所需要的乘法次数大为减少&#xff0c;特别是被变换的抽样点数N越多&#x…

使用STM32的UART实现蓝牙通信

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;&#x1f447…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

Python实现单因素方差分析

Python实现单因素方差分析 1.背景 正念越来越受到人们关注&#xff0c;正念是一种有意的、不加评判的对当下的注意觉察。可以通过可以通过观呼吸、身体扫描、正念饮食等多种方式培养。 为了验证正念对记忆力的影响&#xff0c;选取三组被试分别进行正念训练&#xff0c;运动训…

基于springboot+vue仓库管理系统

摘要 本文介绍了一种基于Spring Boot和Vue的现代化仓库管理系统的设计与实现。仓库管理是企业运营中至关重要的一环&#xff0c;它涉及到货物的进出、库存的管理以及订单的处理等方面。为了提高仓库管理的效率和精确度&#xff0c;我们设计了这个集成了前后端技术的系统。在系统…

37-WEB漏洞-反序列化之PHPJAVA全解(上)

WEB漏洞-反序列化之PHP&JAVA全解&#xff08;上&#xff09; 一、PHP 反序列化原理二、案例演示2.1、无类测试2.1.1、本地2.1.2、CTF 反序列化小真题2.1.3、CTF 反序列化类似题 2.2、有类魔术方法触发2.2.1、本地2.2.2、网鼎杯 2020 青龙大真题 三、参考资料 一、PHP 反序列…

16.云原生之kubesphere组件安装卸载

云原生专栏大纲 文章目录 KubeSphere组件介绍KubeSphere组件安装卸载配置内容参考安装组件步骤卸载组件步骤 KubeSphere组件介绍 KubeSphere 的全部可插拔组件如下&#xff1a; 配置项功能组件描述alertingKubeSphere 告警系统可以为工作负载和节点自定义告警策略。告警策略…

多级缓存

一、多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时&#xff…

FPGA时序分析与时序约束(五)——使用Timing Analyzer进行时序分析与约束

Quartus的安装路径下会自带有例程&#xff0c;通过fir_filter进行学习如何使用Timing Analyzer进行时序分析与约束。 1.1 创建时序网表 打开fir_filter并进行综合后可通过菜单栏Tool->Timing Analyzer或工具栏按钮运行Timing Analyzer。 根据前面提到的&#xff0c;时序分析…

研学活动报名系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景&#xff1a; 随着教育水平的提高和人们对综合素质培养的需求增加&#xff0c;研学活动作为一种教育方式受到了广大家长和学生的青睐。为了更好地组织和管理研学活动&#xff0c;需要建立一个研学活动报名系统&#xf…

大模型关键技术:上下文学习、思维链、RLHF、参数微调、并行训练、旋转位置编码、模型加速、大模型注意力机制优化、永久记忆、LangChain、知识图谱、多模态

大模型关键技术 大模型综述上下文学习思维链 CoT奖励建模参数微调并行训练模型加速永久记忆&#xff1a;大模型遗忘LangChain知识图谱多模态大模型系统优化AI 绘图幻觉问题从 GPT1 - GPT4 拆解GPTs 对比主流大模型技术点旋转位置编码层归一化激活函数注意力机制优化 大模型综述…

攻防世界——answer_to_everything-writeup

__int64 __fastcall not_the_flag(int a1) {if ( a1 42 )puts("Cipher from Bill \nSubmit without any tags\n#kdudpeh");elseputs("YOUSUCK");return 0LL; } kdudpeh这个东西&#xff0c;根据题目提示sha1加密 import hashlib flagkdudpeh x hashlib…