深度学习手势检测与识别算法 - opencv python 计算机竞赛

文章目录

  • 0 前言
  • 1 实现效果
  • 2 技术原理
    • 2.1 手部检测
      • 2.1.1 基于肤色空间的手势检测方法
      • 2.1.2 基于运动的手势检测方法
      • 2.1.3 基于边缘的手势检测方法
      • 2.1.4 基于模板的手势检测方法
      • 2.1.5 基于机器学习的手势检测方法
    • 3 手部识别
      • 3.1 SSD网络
      • 3.2 数据集
      • 3.3 最终改进的网络结构
  • 4 最后

0 前言

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

🚩 深度学习图像识别手势检测识别系统

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

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

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] =  255else:skin2[i][j] =  0cv2.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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gitee 之初体验(上)

我们在项目开发或者自己学习的时候&#xff0c;总会存在这样的问题&#xff1a; 在一台电脑上编写完代码&#xff0c;想要再另外一台电脑上再去写&#xff0c;再或者和其他人一起协作等等场合&#xff0c;代码传来传去很麻烦。 这个时候&#xff0c;我们就可以去使用代码管理工…

K8s 多租户方案的挑战与价值

在当今企业环境中&#xff0c;随着业务的快速增长和多样化&#xff0c;服务器和云资源的管理会越来越让人头疼。K8s 虽然很强大&#xff0c;但在处理多个部门或团队的业务部署需求时&#xff0c;如果缺乏有效的多租户支持&#xff0c;在效率和资源管理方面都会不尽如人意。 本…

Jvm常见问题

1. 为什么用元空间替换永久代 避免OOM异常&#xff1a;永久代中存放了很多JVM需要的类信息&#xff0c;这些数据大多数是不会被清理的&#xff0c;所以Full GC往往无法回收多少空间。而永久代的空间是有限的&#xff0c;如果经常加载新的类进来或者频繁的创建和删除类&#xf…

天眼销:精准的企业名录

企业名录的重要性&#xff0c;对于销售而言都是极其重要的。本期为家人们分享如何正确挑选出优质的企业名录渠道&#xff0c;避免走一些弯弯坑坑。 为了有效利用企业名录进行客户开发&#xff0c;您需要关注信息的准确性、可提供的资源数量以及信息的时效性。能否根据您的需求…

Arduino、ESP8266、HTML相关知识点记录

C代码 const char *ssid "********"; // 这里定义将要建立的WiFi名称。 const char *password "********"; // 这里定义将要建立的WiFi密码。 多WiFi连接&#xff1a; wifiMulti.addAP("**…

Zookeeper从零入门笔记

Zookeeper从零入门笔记 一、入门1. 概述2. 特点3. 数据结构4. 应用场景 二、本地1.安装2. 参数解读 三、集群操作3.1.1 集群安装3.2 选举机制1. 第一次启动2. 非第一次启动 3.3 ZK集群启动停止脚本3.4 客户端命令行操作3.2.1 命令行语法3.2.2 节点类型&#xff08;持久/短暂/有…

热部署怎么部署

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言操作流程&#xff1a;在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a832d83c091742eda9d9325931a89df4.png) 这里的跟上面的…

Java系列-new Object的过程

从《深入理解Java虚拟机》里面的第七章看到了一些&#xff0c;先简单记录一下&#xff0c;好多不懂的。 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证…

Stream API练习题

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 考虑到Stream API在实际…

(蓝桥杯)1125 第 4 场算法双周赛题解+AC代码(c++/java)

题目一&#xff1a;验题人的生日【算法赛】 验题人的生日【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 1.又是偶数&#xff0c;又是质数&#xff0c;那么只有2喽 AC_Code:C #include <iostream> using namespace std; int main() {cout<<2;return 0; …

java_springboot企业人事考勤请假管理信息系统rsglxx+jsp

&#xff08;1&#xff09;熟练掌握Java开发的原理和方法 &#xff08;2&#xff09;熟练学习掌握SSM框架 &#xff08;3&#xff09;熟悉软件开发的流程 &#xff08;4&#xff09;了解中内外互联网中所主流的技术 &#xff08;5&#xff09;深层次的了解计算机学科领域的知识…

【机器学习】线性模型之逻辑回归

文章目录 逻辑回归Sigmoid 函数概率输出结果预测值与真实标签之间的并不匹配交叉熵逻辑回归模型 梯度下降逻辑回归模型求解编程求解sklearn 实现&#xff0c;并查看拟合指标 逻辑回归 逻辑回归是一种广义线性模型&#xff0c;形式上引入了 S i g m o i d Sigmoid Sigmoid 函数…