# 摘要
——基于手部跟踪实现音量大小的控制
手部跟踪在人机交互、虚拟现实、手语翻译等领域具有广泛应用。本报告中提出了一种基于 Google 的 MediaPipe Hands 模块和 Python 语言的实时手部跟踪系统设计方案。系统旨在通过摄像头捕捉手部动作,并运用深度学习算法准确追踪和解析手部各关节位置。简单来说就是用 mediapipe 进行手部侦测跟踪两部分和手部控制音量。
对于第一部分,为了先解决手掌侦测问题,用目标检测算法来找确定图像中是否有手存在,以及手在图像中的位置;并调用 mediapipe 库中建立好的深度学习模型 BlazePalm 来进行训练学习得到两组描框,一组用于调整锚框的大小和位置(边界框回归),另一组用于确定锚框内是否包含手部(分类)。
对于第二部分,基于手掌侦测完成后,为了找到关键点(0~20),用关键点检测算法来定位手部的结构(手指和关节),并调用 mediapipe 库中建立好的回归网络 MobileNet 模型来细化之前检测到的手部边界框,并预测手部关键点的精确位置。
对于第三部分,先获取手指坐标和计算手指距离通过读取手部姿势检测的关键点坐标,计算手指之间的距离,包括拇指和食指的距离以及食指和小指的距离。然后进行音量转换和控制利用计算得到的手指距离,通过 numpy.interp()
函数实现手指距离到系统音量的转换,并使用 pycaw
库对系统音量进行控制。最后进行可视化和反馈将计算得到的音量转换结果以直方图和百分比的形式展示在屏幕上,并且根据手指距离的变化,实现音乐播放控制,比如切歌和暂停等。
本系统预期实现低延迟、高精度的手部跟踪,文章将详细介绍系统设计、算法选型、系统开发、代码实现以及测试效果等关键部分。
关键词:手部跟踪 MediaPipe 人机交互 机器学习
# 1 背景介绍
在这次手部跟踪项目中,我运用了谷歌的 mediapipe 库;Google 的 MediaPipe 团队针对实时交互式应用的需求 —— 尤其是随着智能手机和增强现实技术的发展 —— 开发了 MediaPipe 框架。作为该框架的一部分,MediaPipe Hands 应运而生,因为手部跟踪是 AR/VR 交互中一个非常重要的标准,也是人机交互中的一个基本问题。
MediaPipe 是一个由 Google 构建的开源机器学习管道,该管道旨在实现多媒体内容的分析和处理,其目的是为人工智能提供稳定、可扩展和易用的机器学习框架。作为该框架的一个应用,MediaPipe Hands 提供了一种实时的手势跟踪解决方案,它能够实时地跟踪用户手部的位置和动作,并将其应用于 AR、VR、交互式游戏等各种场景中。MediaPipe Hands 的开源及免费的 API 使得开发者们能够轻松地将其整合到自己的应用程序中,并快速实现实时手势识别的功能。
MediaPipe Hands 的实现基于深度学习技术,利用了卷积神经网络等模型。模型需要大量的训练数据,并进行数据收集、预处理和规范化。同样重要的是,要针对目标检测和关键点检测这两个关键步骤来选择合适的算法。具体来说,MediaPipe Hands 使用了先进的卷积神经网络,建立模型来检测手部在图像中的准确位置。同时,借助 MobileNet 的模型,MediaPipe Hands 能够处理关键点检测等其他步骤。
# 2 系统设计
# 2.1 项目目标
项目的主要目标是使手部跟踪系统足够精确,能够在电脑摄像头下,实现实时和高精度的手部动作捕捉。
- A. 实现实时手部跟踪:系统应能够无显著延迟地追踪手部动作,即用户手部的每一个动作都能够在毫秒级别内被系统捕捉和反馈。这要求系统能够快速处理图像帧,并实时更新手部位置和动作信息。
- B. 确保高精度跟踪:系统需要能够准确识别和跟踪手部各关节的位置,以及整个手掌的三维姿态。MediaPipe Hands 的高精度模型应被配置为针对复杂背景和不同照明条件下都能保持精确的追踪能力。
总的来说,本项目的目标就是实现笔记本电脑实时摄像头认识手指的确认并控制音量的大小。
# 2.2 系统架构
# 2.2.1 流程图体现
因为我使用了 mediapipe 库,它里面已经用上万个数据集训练好了模型,我直接使用调用即可;
# 2.2.2 系统模块设计
在项目系统中我分成了二个模块;
- A.handDetector 类模块
handDetector` 类封装了手部检测和追踪的功能,提供了方法来寻找手部姿势的关键点,并计算手指状态和手部关键点之间的距离。其他部分的代码则是调用这个模块进行实际的手部姿势检测和展示。
handDetector 类是程序中的核心部分,用于创建对象并实现手部关键点检测与绘制;handDetector 类的主要包括:
(1)init:初始化方法,主要设置手部检测的参数(例如最大手的数量,检测置信度阈值和跟踪置信度阈值)。
(2)findHands:接收输入的图像数据,通过 MediaPipe 进行手部关键点检测和绘制。如果 draw 参数为 True,则在图像上绘制手部关键点及其连接。
(3)findPosition:在已检测到的手部关键点上,查找给定手部关键点的坐标位置,如拇指尖端、食指尖端等。如果 draw 参数为 True,则在关键点上绘制标签。
- B. 音量控制模块
当检验出点后,识别食指和大拇指的点数,高亮检测的标号,想标记的中间画根线,显示图像,然后获取长度。再改变系统的音量;映射用到的 numpy,然后控制音量,最后就是画一个矩形显示音量;它使用了以下算法和方法:
- 欧几里得距离计算 Euclidean distance calculation:通过计算两点之间的欧几里得范数来获取长度。使用了
math.hypot()
函数来计算两点之间的距离。 - 线性插值 Linear interpolation:使用
np.interp()
函数对距离进行线性插值,将距离映射到指定范围内。在这里,它被用于将拇指和食指之间的距离映射为音量大小和音量条的位置。
3. 主音量设置 Setting master volume:使用volume.SetMasterVolumeLevel()
函数设置系统的主音量。 - 图像处理 Image processing:使用 OpenCV 库对图像进行处理,包括绘制圆形、线段、矩形以及在图像上添加文本等操作。
- 键盘热键触发 Keyboard hotkey triggering:使用
pyautogui.hotkey()
函数模拟键盘按键触发热键操作,例如切换音乐或暂停。 - 时间延迟 Time delay:使用
time.sleep()
函数在特定的时间间隔内暂停执行。
总体来说,二个模块结合了数学计算、图像处理和模拟键盘操作等方法来实现音量控制功能。
# 3 算法应用
# 3.1 算法介绍和原理分析
MediaPipe Hands 包括两个主要阶段:目标检测和关键点检测。
- a. 目标检测算法:手部检测第一步是确定图像中是否有手存在,以及手在图像中的位置。这可以通过目标检测模型来完成;原理如下:
- 模型选择:MediaPipe Hands 使用了一种轻量级的深度学习模型 BlazePalm,用于有效地检测图像中手的存在和位置。
- 单阶段检测器:BlazePalm 的设计借鉴了单阶段检测模型的概念像 SSD,因此它能够直接在一遍过程中预测手部的边界框,而不需要先生成候选区域。
- 特征抽取:模型通常会采用多个卷积层来逐层抽取和深化图像特征。经过多层非线性变换后,能够从原始图像中得到足够的信息以预测手的位置。
- 锚框:通过在不同的特征图上定义一系列固定大小和比例的锚框(anchor boxes),模型可用来预测手部可能存在的区域。
- 回归和分类:对于每个锚框,模型进行两组预测:一组用于调整锚框的大小和位置(边界框回归),另一组用于确定锚框内是否包含手部(分类)。
- b. 关键点检测算法:一旦手部检测完成,接下来需要的是定位手部的结构,比如关节和指尖的位置。MediaPipe Hands 通常利用 CNN 来识别和关联人体关键点;原理如下:
- 回归网络:在检测到手部之后,使用另一个卷积神经网络(以 MobileNet 为基础架构的模型),它细化之前检测到的手部边界框,并预测手部关键点的精确位置。
- 关键点预测:模型输出手的 21 个关键点的坐标,这些关键点位置涵盖手腕、各指关节,以至于指尖。
- 3D 定位:MediaPipe Hands 还进行 3D 关键点定位,不仅预测每个关键点在图像平面上的位置,还推断出它们在 3D 空间中的近似深度。
- 手部姿态估计:基于预测出的 21 个关键点,算法可进一步推断手的姿态和手势。
- c. 欧几里得距离计算和线性插值
-
欧几里得距离:
欧几里得距离是指在几何空间中计算两点之间的直线距离的方法。在二维空间中,两点之间的欧几里得距离公式为:在三维空间中,两点之间的欧几里得距离可以类似地计算。
在系统中,欧几里得距离被用于计算手指关键点之间的直线距离,手指长度的计算。
-
线性插值:
线性插值是一种通过已知点的数值,计算出这些点之间某一位置的值的方法。在一维情况下,对于已知点,要计算点 x 处的插值点 y,可以通过以下线性插值公式得出:在系统中,线性插值被用于将手指长度值映射到音量范围和音量条高度范围,以实现手势控制音量的功能。
综上所述:这种组合使用目标检测和关键点检测的方法使 MediaPipe Hands 在手势追踪与识别方面非常高效且准确。其中目标检测为关键点检测提供了前处理步骤,有效地缩小了搜索范围和计算需求,而精确的关键点检测则让手势识别变得更为细致和实用。
# 3.2 算法优势和适用场景
MediaPipe Hands 中的目标检测和关键点检测算法的优势和适用场景体现在以下几个方面:
- a. 目标检测算法优势和适用场景:
BlazePalm 网络结构因其轻量级特性,在移动设备上能够实现高帧率的实时手部检测,展现出显著的优势。这种单阶段检测器直接生成目标边界框,相较于两阶段检测器,减少了计算量,同时能够适应不同大小的手部图像,通过在不同尺度上进行检测。这些优势使得 BlazePalm 非常适合多种应用场景,包括增强现实(AR)中的用户手部位置快速准确检测,用于 AR 应用的交互;实时视频流中的手势识别,作为手势控制系统的一部分;以及在计算能力受限的移动设备上运行,因其轻量级设计而特别适合。 - b. 关键点检测算法优势和适用场景:
利用深度学习模型,我们的手部姿态识别技术能够提供高精度的手部关键点位置预测,实现细粒度的手部识别,追踪包括手腕、指关节和指尖在内的 21 个不同关键点。此外,部分算法还能提供这些关键点在 3D 空间中的位置信息,极大地丰富了交互体验。这些技术优势使得我们的手部姿态识别技术在多个场景中得到广泛应用,如在虚拟现实(VR)中用手作为输入设备控制虚拟环境,交互式游戏中玩家用手控制游戏元素或角色,远程控制中通过手势识别发送控制信号无需接触设备,以及在医疗、体育或舞蹈训练等专业领域中分析手部运动。 - c. 欧几里得距离计算和线性插值算法优势和应用场景
欧几里得距离是计算两个点之间的直线距离的常用方法。在系统中,通过detector.findDistance()
方法计算手指之间的欧几里得距离,具体是计算手指关键点的坐标之间的直线距离。
线性插值是一种插值方法,用于将一个值从一个范围映射到另一个范围,并保持线性关系。在系统中,使用了np.interp()
函数来将手指长度值进行线性插值,将它映射到音量范围和音量条高度范围,以便手势控制音量。
总之,MediaPipe Hands 强大的目标检测和关键点检测能力让其在需要快速、实时且精确手部追踪的应用中极为适用,从实时交互到用户行为分析,其应用领域广阔。
# 4. 实验结果
https://github.com/Code-Fan007/Finger-follow
# 结 论
最后作为大学生,对 MediaPipe Hands 这一理解能够从多个角度深化我们对现代人机交互方式、计算机视觉和机器学习在实际应用中的融合。
一方面,学习 MediaPipe Hands 提供的目标检测和关键点检测技术,可以帮助我们理解如何通过轻量级但效率高的机器学习算法实现实时的手势跟踪。对于我来说,这意味着可以深入了解卷积神经网络(CNN)在图像处理中的应用,以及如何设计基于人手追踪的功能,如 AR。通过 MediaPipe Hands 的学习,我知道了到单阶段检测器的工作原理,这是计算机视觉中的一个重要概念,强化了理论知识与实践能力的结合。
另一方面,当讨论到关键点检测时,学生可以更加详细地探究如何对手部动作进行精确识别和分析,从基本的关键点检测到复杂的手势识别算法。这涉及到深度学习的具体应用,例如如何训练神经网络来识别和跟踪 21 个独立的手部关键点。此外,3D 关键点的重建和姿态估计则引入了更加高级的概念,通过探索 MediaPipe Hands 的基础和工作机制,我能获得对机器学习工作原理及其在实际问题解决中应用的深刻理解。这种技术的学习不仅可以促进学生技术能力的提升,还能增强我的理论知识应用到具体问题解决中的能力。
综上所述,对 MediaPipe Hands 的学习不仅能够增强我的技术知识储备,还能帮助我构建跨学科的解决方案思维,为未来在高科技领域的职业生涯奠定坚实的基础。
- a) 总结项目中涉及的本学期学过的具体函数或知识点,要求至少 3 个,并予以简单介绍;
①cv2.putText 是 OpenCV 中用于在图像上绘制文本的函数,指定文本内容、位置、字体、大小、颜色和厚度等参数。
②cv2.rectangle 是 OpenCV 库中的一个函数,用于在图像上绘制矩形。指定矩形的左上角和右下角坐标,以及矩形的线条颜色和厚度。
③cv2.circlecv2.circle 是 OpenCV 库中的一个函数,用于在图像上绘制圆形。指定圆心的坐标、圆的半径、线条颜色以及线条的厚度。
- b) 总结调试或优化过程中遇到的问题,并说明是如何解决的,要求至少 2 个
①界面上的 FPS 显示不正确或者音量条显示不清晰,检查了 cv2.putText () 和 cv2.rectangle () 函数的参数,确保了文本和图形的正确绘制。
②手部关键点的检测和跟踪不够准确,导致音量控制响应不灵敏或不准确;
调整了 detectionCon 和 trackCon 参数,参数控制检测和跟踪的置信度阈值。然后根据实际使用环境光线条件进行调整来进行识别。