目录标题
选题意义背景
随着人工智能技术的快速发展,手势识别作为一种自然、直观的人机交互方式,在智能家居、虚拟现实、增强现实、医疗辅助和工业控制等领域展现出广阔的应用前景。基于数据手套的接触式识别方法虽然精度较高,但需要用户佩戴专用设备,限制了其在日常场景中的广泛应用。而非接触式手势识别方法以其便捷性和自然性受到越来越多的关注。早期的非接触式手势识别主要基于传统计算机视觉技术,如模板匹配、特征提取和分类器结合等方法,但这些方法在复杂背景、光照变化和姿态变化等情况下表现不佳。
目标检测是计算机视觉领域的核心任务之一,旨在图像或视频中准确定位和识别目标对象。从2010年代初的R-CNN系列两阶段检测器,到后来的YOLO、SSD等单阶段检测器,目标检测技术经历了从准确性优先到速度与精度平衡的演进过程。YOLO系列算法因其高效性和实时性在目标检测领域占据主导地位。YOLOv8作为该系列的最新版本,在架构设计、特征提取和损失函数等方面进行了多项创新,进一步提升了检测精度和速度。然而,将YOLOv8直接应用于手势识别任务仍存在一些问题:首先,标准YOLOv8模型的参数量和计算量较大,不适合在移动设备上部署;其次,手势识别具有特殊性,需要模型对细节特征有更强的感知能力;最后,复杂背景下的手势定位精度仍需提高。

本课题基于YOLOv8算法提出改进的手势识别模型,具有重要的理论意义和实际应用价值。理论上,通过对YOLOv8进行多维度改进,探索轻量化网络、注意力机制、下采样策略和损失函数优化在手势识别任务中的有效性,为计算机视觉领域的目标检测算法优化提供新思路。
数据集
本研究使用了两个主要数据集进行实验:自建的数字手势数据集和公开的ASL字母手势数据集。这两个数据集涵盖了不同类型、不同复杂度的手势,为验证改进算法的有效性提供了全面的测试基础。

自建数字手势数据集
自主构建的数字手势数据集,旨在提供高质量的手势识别训练和测试数据。为了提高数据集的质量和模型的鲁棒性,对采集的原始图像进行了以下预处理:
-
图像尺寸统一:将所有图像统一调整为640×640像素,以适应YOLOv8模型的输入要求。
-
数据增强:对原始图像进行了多种数据增强操作,以扩充数据集并提高模型的泛化能力:
-
椒盐噪声添加:随机向图像中添加椒盐噪声,模拟实际应用中的图像噪声干扰。

-
直方图均衡化:对图像进行直方图均衡化处理,增强图像对比度,提高模型在不同光照条件下的识别能力。
-
随机翻转:对图像进行水平翻转,增加手势方向的多样性。
-
随机裁剪:对图像进行随机裁剪,增强模型对不同手势位置的适应性。
-
-
图像标注:使用LabelImg工具对预处理后的图像进行标注,采用YOLO格式保存标注信息。每张图像标注手势的类别和位置信息,生成对应的.txt标注文件。
处理后的LY数字手势数据集统计信息如下表所示:
| 手势类别 | 样本数量 | 占比 | 手势类别 | 样本数量 | 占比 |
|---|---|---|---|---|---|
| 0 (zero) | 910 | 10% | 5 (five) | 910 | 10% |
| 1 (one) | 910 | 10% | 6 (six) | 910 | 10% |
| 2 (two) | 910 | 10% | 7 (seven) | 910 | 10% |
| 3 (three) | 910 | 10% | 8 (eight) | 910 | 10% |
| 4 (four) | 910 | 10% | 9 (nine) | 910 | 10% |
| 总计 | 9100 | 100% |
ASL字母手势数据集
ASL字母手势数据集是一个公开的大规模手势数据集,包含美国手语中的26个字母手势。本研究使用的ASL数据集包含10050张图像,每类字母手势约386-387张图像,为了与自建LY数据集保持一致的处理标准,对ASL数据集进行了类似的预处理:

-
图像尺寸统一:将所有图像调整为640×640像素。
-
数据增强:应用与LY数据集相同的数据增强策略,包括椒盐噪声添加、直方图均衡化、随机翻转和随机裁剪。
-
图像标注:使用LabelImg工具对图像进行标注,生成YOLO格式的标注文件。

处理后的ASL字母手势数据集统计信息如下:
| 统计项 | 数值 |
|---|---|
| 总样本数 | 10050张 |
| 类别数 | 26类(A-Z字母手势) |
| 每类样本数 | 约386-387张 |
| 图像分辨率 | 640×640像素 |
| 标注格式 | YOLO格式 |
数据集分割策略
为了进行模型的训练、验证和测试,对两个数据集进行了如下分割:
- 训练集:占总数据量的70%,用于模型的主要训练过程。
- 验证集:占总数据量的20%,用于训练过程中的模型性能评估和超参数调整。
- 测试集:占总数据量的10%,用于最终评估模型的泛化能力。
这种分割方式确保了训练、验证和测试数据的独立性,避免了模型在测试过程中过拟合训练数据的问题。同时,通过在分割过程中保持各类别数据的比例不变(分层采样),确保了各类别在不同集合中的代表性。
功能模块介绍
整体架构设计
本研究提出的YOLOv8n-ours手势识别系统采用了经典的深度学习目标检测框架结构,同时进行了多维度的改进和优化。系统整体架构包括输入层、主干网络层、颈部网络层、头部网络层和输出层五个主要部分。
输入层负责接收预处理后的手势图像,并进行必要的数据增强和格式转换。主干网络层采用改进的MobileNetV3-Small网络进行特征提取,颈部网络层使用改进的PAN+FPN结构进行特征融合,头部网络层采用解耦头设计进行分类和回归,输出层则生成最终的手势检测结果。
整个系统的工作流程如下:输入手势图像→数据预处理→特征提取→特征融合→分类与回归→后处理→输出检测结果。系统架构设计注重模型的轻量化和实时性能,同时保证检测精度,适合在移动设备上部署和应用。

主干网络模块
主干网络模块是手势识别系统的核心组件之一,负责从预处理后的图像中提取有效的特征信息。本研究对YOLOv8n的原始主干网络进行了改进,采用MobileNetV3-Small轻量化网络替代原始的DarkNet53主干网络,为了进一步提高MobileNetV3-Small主干网络的性能,本研究还实施了以下优化策略:

-
特征金字塔集成:在MobileNetV3-Small的不同深度处提取特征,构建特征金字塔,保留不同尺度的特征信息。
-
激活函数优化:在网络的关键位置,根据性能需求灵活选择H-Swish或ReLU激活函数。
-
批归一化层优化:对批归一化层的参数进行优化,提高模型的训练稳定性和收敛速度。
通过上述改进和优化,MobileNetV3-Small主干网络在保持较高特征提取能力的同时,大幅降低了模型的参数量和计算量,为手势识别系统在移动设备上的部署提供了可能。
颈部网络模块
颈部网络模块位于主干网络和头部网络之间,主要负责对主干网络提取的特征进行融合和增强,生成更具表达力的特征表示,为后续的分类和回归任务提供支持。本研究对YOLOv8n的颈部网络进行了两项关键改进:引入ADown下采样模块和添加CPCA注意力机制。原始YOLOv8的颈部网络采用跨步卷积进行下采样,这种方法虽然可以减少特征图尺寸,但可能导致空间信息丢失。ADown下采样模块是一种更高效的下采样方法,为了增强模型对关键特征的关注能力,本研究在颈部网络中引入了CPCA注意力机制。CPCA注意力机制是一种通道优先的卷积注意力机制,能够同时关注通道和空间维度的重要信息。CPCA注意力机制的工作流程如下:

-
通道注意力计算:对输入特征图进行平均池化和最大池化,然后通过共享的多层感知机(MLP)生成通道注意力权重。
-
特征加权:将通道注意力权重与输入特征图相乘,得到通道加权后的特征图。
-
多尺度空间注意力计算:使用深度可分离卷积对通道加权后的特征图进行多尺度处理,生成空间注意力权重。
-
特征融合:将空间注意力权重与通道加权后的特征图相乘,得到最终的注意力增强特征。
在颈部网络中,CPCA注意力机制被添加在特征融合的关键位置,具体实现步骤包括:
-
模块定义:创建CPCA注意力模块的类定义,实现其计算逻辑。
-
集成到颈部网络:在颈部网络的第22层和第26层添加CPCA注意力模块。
-
参数优化:调整注意力模块的参数,包括MLP的隐藏层维度、卷积核大小等。
通过引入ADown下采样模块和CPCA注意力机制,颈部网络能够更有效地融合不同尺度的特征信息,增强对关键特征的表达能力,从而提高手势识别的准确性。
头部网络与损失函数模块
头部网络模块负责对颈部网络输出的特征进行分类和回归,生成最终的手势检测结果。本研究对YOLOv8n的头部网络和损失函数进行了优化,主要包括解耦头设计改进和Focaler-CIoU损失函数设计。YOLOv8采用了解耦头设计,将分类和回归任务分开处理。本研究保留了这一设计理念,并进行了以下优化:
-
分类分支优化:使用VFL Loss(Varifocal Loss)作为分类损失函数,解决正负样本不平衡和难易样本不均衡的问题。
-
回归分支优化:使用改进的Focaler-CIoU损失函数替代原始的CIoU损失函数,提高边界框回归的精度,特别是对困难样本的定位能力。
-
特征交互增强:在分类和回归分支之间添加特征交互机制,促进两个任务之间的信息共享。
针对原始CIoU损失函数在处理困难样本时的不足,本研究提出了Focaler-CIoU损失函数,该函数通过以下方式改进:
-
困难样本聚焦:引入Focaler-IoU机制,对不同IoU值的样本分配不同的损失权重,重点关注IoU值较低的困难样本。
-
动态惩罚调整:根据样本的IoU值动态调整惩罚力度,对低IoU样本施加更大的惩罚,对高IoU样本施加较小的惩罚。
-
边界框回归优化:结合CIoU损失函数的优点,考虑边界框的重叠度、中心点距离和宽高比,全面优化边界框回归。
Focaler-CIoU损失函数的实现步骤包括:
-
损失函数定义:实现Focaler-IoU和Focaler-CIoU的计算逻辑。
-
参数调整:优化损失函数中的参数d和u,平衡对不同难度样本的关注程度。
-
集成到训练流程:将Focaler-CIoU损失函数集成到模型的训练流程中,替代原始的CIoU损失函数。
通过以上改进,头部网络和损失函数模块能够更准确地进行手势分类和定位,特别是在复杂背景和困难样本情况下,表现出更强的鲁棒性和准确性。
算法理论
目标检测算法基础
目标检测是计算机视觉领域的核心任务之一,旨在图像或视频中同时完成目标的定位和分类。目标检测算法通常可以分为两阶段(Two-Stage)和单阶段(One-Stage)两大类。两阶段算法如R-CNN系列,首先生成候选区域,然后对这些区域进行分类和边界框回归;单阶段算法如YOLO系列和SSD,直接从输入图像生成检测结果,具有更快的推理速度。YOLO系列算法作为代表性的单阶段目标检测算法,采用端到端的训练方式,将目标检测任务转化为回归问题,具有极高的推理效率。从YOLOv1到最新的YOLOv8,该系列算法在网络结构、特征提取、损失函数等方面进行了持续改进,检测精度和速度不断提升。

YOLOv8算法原理
YOLOv8是Ultralytics公司于2023年发布的YOLO系列最新版本,相比前代算法,在架构设计、特征提取、损失函数等方面进行了多项创新,YOLOv8采用了经典的特征提取-特征融合-检测头架构,具体包括:
-
输入端:包括数据增强(Mosaic、MixUp等)、自适应缩放和批量归一化等预处理操作,提高模型的泛化能力和训练稳定性。
-
主干网络:采用C2f模块替代YOLOv5中的C3模块,C2f模块通过更丰富的梯度流设计,提高了特征提取能力。同时,使用SPPF模块进行多尺度特征融合,增强模型对不同尺度目标的适应能力。

-
颈部网络:采用PAN+FPN结构,实现了自顶向下和自底向上的双向特征融合,有效融合了不同层次的特征信息。

-
头部网络:采用解耦头设计,将分类和回归任务分开处理。分类分支采用VFL Loss,回归分支采用CIoU Loss+DFL Loss(Distribution Focal Loss)。
YOLOv8相比前代算法的主要技术创新包括:
-
C2f模块:C2f模块是对C3模块的改进,通过引入更多的分支和跳连接,增加了网络的深度和特征提取能力,同时保持了计算效率。

-
解耦头设计:将分类和回归任务分开处理,使用不同的卷积层分别处理分类特征和回归特征,减少了任务间的干扰,提高了检测精度。
-
新型损失函数组合:采用VFL Loss作为分类损失,CIoU Loss+DFL Loss作为回归损失,有效解决了正负样本不平衡和边界框回归精度问题。
-
数据增强策略优化:优化了Mosaic、MixUp等数据增强策略,提高了模型的泛化能力和鲁棒性。
-
模型轻量化设计:提供了从nano到extra large的多个模型版本,满足不同场景下的精度和速度需求。
MobileNetV3-Small轻量化网络原理
MobileNetV3-Small是Google提出的一种专为移动设备设计的轻量化卷积神经网络,深度可分离卷积是MobileNet系列的核心技术,它将标准卷积分解为深度卷积和逐点卷积两个步骤,大幅减少了计算量和参数量。
-
深度卷积:对输入特征图的每个通道单独使用一个卷积核,进行空间卷积操作。对于输入通道数为Cin,卷积核大小为Dk×Dk的情况,深度卷积的计算量为Cin×Dk×Dk×H×W,其中H和W为特征图的高度和宽度。

-
逐点卷积:使用1×1卷积核,对深度卷积的输出进行通道间的信息融合和维度调整。对于输出通道数为Cout的情况,逐点卷积的计算量为Cin×Cout×H×W。
-
计算量对比:与标准卷积相比,深度可分离卷积的计算量减少到原来的1/Dk² + 1/(Cin×Cout),对于3×3卷积核,理论上可减少约9倍的计算量。
MobileNetV3在关键位置引入了SE注意力机制,通过对通道间的依赖关系进行建模,增强模型对重要特征的关注能力。SE注意力机制的工作流程包括:
-
压缩(Squeeze):通过全局平均池化,将每个通道的特征压缩为一个标量,捕获通道级的全局信息。
-
激励(Excitation):使用两个全连接层组成的门控机制,学习通道间的依赖关系,并生成通道注意力权重。
-
重标定(Reweight):将学习到的注意力权重与原始特征图相乘,对不同通道的特征进行自适应加权。
MobileNetV3使用H-Swish(Hard Swish)激活函数替代传统的ReLU或ReLU6激活函数, 与Swish函数相比,H-Swish函数使用ReLU6近似Sigmoid函数,避免了指数运算,降低了计算复杂度,同时保持了良好的性能表现。

CPCA注意力机制原理
CPCA注意力机制是一种通道优先的卷积注意力机制,结合了通道注意力和空间注意力的优点,能够同时关注通道和空间维度的重要信息。CPCA的通道注意力计算借鉴了CBAM 的设计,但进行了优化:

-
特征聚合:对输入特征图F分别进行全局平均池化和全局最大池化,得到两个不同的特征描述子。
-
共享MLP处理:将两个特征描述子分别输入到共享的多层感知机(MLP)中,学习通道间的依赖关系。MLP包含一个降维层(使用ReLU激活)和一个升维层(使用Sigmoid激活)。
-
特征融合:将MLP的输出相加,得到通道注意力权重图Mc。
-
特征加权:将通道注意力权重图Mc与输入特征图F相乘,得到通道加权后的特征图Fc。
CPCA的空间注意力计算采用了多尺度深度可分离卷积设计,能够捕获不同尺度的空间信息:

-
多尺度特征提取:对通道加权后的特征图Fc使用不同大小的深度可分离卷积进行处理,生成多个尺度的特征表示。
-
特征融合:将不同尺度的特征在通道维度上拼接,然后使用1×1卷积进行通道融合,生成空间注意力权重图Ms。
-
特征增强:将空间注意力权重图Ms与通道加权后的特征图Fc相乘,得到最终的注意力增强特征图F’。
ADown下采样模块原理
ADown 下采样模块是一种高效的特征降维方法,通过多路径设计在减少特征图尺寸的同时,保留更多的特征信息,ADown下采样模块的工作原理如下:
-
输入特征处理:接收四维度的特征张量(B, C, H, W),其中B为批次大小,C为通道数,H和W为特征图的高度和宽度。
-
平均池化降维:对输入特征进行平均池化操作,将特征图的尺寸从(H, W)减小到(H/2, W/2)。
-
特征分割与多路径处理:将平均池化后的特征图分成两部分:
- 第一部分直接送入卷积层进行处理。
- 第二部分先经过最大池化层提取显著特征,然后再送入卷积层处理。
-
特征拼接:将不同路径处理后的特征在通道维度上进行拼接,生成最终的下采样特征。
核心代码介绍
MobileNetV3-Small主干网络实现
MobileNetV3-Small轻量化网络,主要包含以下几个关键部分:
-
h_swish激活函数:实现了H-Swish激活函数,通过ReLU6和线性变换近似Swish函数,降低计算复杂度。
-
SELayer注意力模块:实现了Squeeze-and-Excitation注意力机制,通过全局平均池化和全连接层学习通道间的依赖关系,生成通道注意力权重。
-
MobileNetV3_Block模块:实现了MobileNetV3的基本构建块,包括深度可分离卷积和倒置残差结构。根据参数配置,该模块可以灵活地选择是否使用SE注意力机制、是否使用H-Swish激活函数等。
-
MobileNetV3_Small主网络:根据MobileNetV3-Small的网络配置表构建完整的网络结构,并在指定位置提取特征输出,供后续的颈部网络使用。MobileNetV3-Small作为YOLOv8n-ours模型的主干网络,其实现代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
class h_swish(nn.Module):
def __init__(self, inplace=True):
super(h_swish, self).__init__()
self.inplace = inplace
self.relu = nn.ReLU6(inplace=inplace)
def forward(self, x):
out = self.relu(x + 3) / 6
return x * out
class SELayer(nn.Module):
def __init__(self, inp, oup, reduction=4):
super(SELayer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(oup, inp // reduction),
nn.ReLU(inplace=True),
nn.Linear(inp // reduction, oup),
h_swish()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y
class MobileNetV3_Block(nn.Module):
def __init__(self, inp, oup, kernel, stride, use_se, use_hs, expand_ratio):
super(MobileNetV3_Block, self).__init__()
assert stride in [1, 2]
hidden_dim = round(inp * expand_ratio)
self.identity = stride == 1 and inp == oup
if expand_ratio == 1:
# 深度可分离卷积
self.conv = nn.Sequential(
nn.Conv2d(hidden_dim, hidden_dim, kernel, stride, (kernel - 1) // 2, groups=hidden_dim, bias=False),
nn.BatchNorm2d(hidden_dim),
h_swish() if use_hs else nn.ReLU(inplace=True),
SELayer(inp, hidden_dim) if use_se else nn.Identity(),
nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),
nn.BatchNorm2d(oup),
)
else:
# 倒置残差结构
self.conv = nn.Sequential(
nn.Conv2d(inp, hidden_dim, 1, 1, 0, bias=False),
nn.BatchNorm2d(hidden_dim),
h_swish() if use_hs else nn.ReLU(inplace=True),
nn.Conv2d(hidden_dim, hidden_dim, kernel, stride, (kernel - 1) // 2, groups=hidden_dim, bias=False),
nn.BatchNorm2d(hidden_dim),
SELayer(inp, hidden_dim) if use_se else nn.Identity(),
h_swish() if use_hs else nn.ReLU(inplace=True),
nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),
nn.BatchNorm2d(oup),
)
def forward(self, x):
if self.identity:
return x + self.conv(x)
else:
return self.conv(x)
class MobileNetV3_Small(nn.Module):
def __init__(self, num_classes=1000):
super(MobileNetV3_Small, self).__init__()
# 网络配置表
cfg = [
# k, t, c, SE, HS, s
[3, 1, 16, 1, 0, 2], # 0
[3, 4.5, 24, 0, 0, 2], # 1
[3, 3.67, 24, 0, 0, 1], # 2
[5, 4, 40, 1, 1, 2], # 3
[5, 6, 40, 1, 1, 1], # 4
[5, 6, 40, 1, 1, 1], # 5
[5, 3, 48, 1, 1, 1], # 6
[5, 3, 48, 1, 1, 1], # 7
[5, 6, 96, 1, 1, 2], # 8
[5, 6, 96, 1, 1, 1], # 9
[5, 6, 96, 1, 1, 1], # 10
]
# 构建网络
input_channel = 16
self.features = [nn.Conv2d(3, input_channel, 3, 2, 1, bias=False),
nn.BatchNorm2d(input_channel),
h_swish()]
for k, t, c, use_se, use_hs, s in cfg:
output_channel = c
exp_size = round(input_channel * t)
self.features.append(MobileNetV3_Block(input_channel, output_channel, k, s, use_se, use_hs, t))
input_channel = output_channel
self.features = nn.Sequential(*self.features)
# 定义特征输出点
self.out_features = [24, 48, 96] # 对应三个不同尺度的特征图
def forward(self, x):
features = []
for i, layer in enumerate(self.features):
x = layer(x)
# 记录指定层的输出特征
if i == 3: # 对应第一个特征输出点
features.append(x)
elif i == 7: # 对应第二个特征输出点
features.append(x)
elif i == 11: # 对应第三个特征输出点
features.append(x)
return features
通过使用MobileNetV3-Small替代YOLOv8n的原始主干网络,在保证特征提取能力的同时,大幅降低了模型的参数量和计算量,使模型更适合在移动设备上部署。
CPCA注意力机制实现
CPCA 注意力机制,主要包含以下几个关键部分:
-
通道注意力计算:使用全局平均池化和全局最大池化提取特征图的通道信息,然后通过共享的MLP(多层感知机)生成通道注意力权重。这种双池化的设计可以捕获更丰富的通道信息。
-
多尺度空间注意力:使用不同大小的深度可分离卷积(3×3、5×5、7×7)对通道加权后的特征图进行处理,捕获不同尺度的空间信息。深度可分离卷积可以在保持性能的同时降低计算复杂度。
-
特征融合:将多尺度空间特征在通道维度上拼接,然后通过1×1卷积进行通道融合,生成最终的空间注意力权重。
-
注意力应用与残差连接:将通道注意力和空间注意力依次应用到输入特征上,并添加残差连接,帮助梯度流动,提高模型的训练稳定性。CPCA注意力机制是YOLOv8n-ours模型的重要改进点之一,其实现代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
class CPCA(nn.Module):
def __init__(self, in_channels, reduction=16, kernel_sizes=[3, 5, 7]):
super(CPCA, self).__init__()
self.in_channels = in_channels
# 通道注意力部分
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.shared_MLP = nn.Sequential(
nn.Conv2d(in_channels, in_channels // reduction, kernel_size=1, bias=False),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels // reduction, in_channels, kernel_size=1, bias=False)
)
self.sigmoid = nn.Sigmoid()
# 空间注意力部分 - 多尺度深度可分离卷积
self.spatial_attention = nn.ModuleList()
for k in kernel_sizes:
self.spatial_attention.append(
nn.Sequential(
nn.Conv2d(in_channels, in_channels, kernel_size=k, padding=k//2, groups=in_channels, bias=False),
nn.BatchNorm2d(in_channels),
nn.ReLU(inplace=True)
)
)
# 1x1卷积用于通道融合
self.fusion_conv = nn.Conv2d(in_channels * len(kernel_sizes), in_channels, kernel_size=1, bias=False)
def forward(self, x):
batch_size, channels, height, width = x.size()
# 计算通道注意力
avg_out = self.shared_MLP(self.avg_pool(x))
max_out = self.shared_MLP(self.max_pool(x))
channel_attention = self.sigmoid(avg_out + max_out)
# 应用通道注意力
x_channel_att = x * channel_attention
# 计算多尺度空间注意力
spatial_features = []
for sa in self.spatial_attention:
spatial_features.append(sa(x_channel_att))
# 融合多尺度特征
spatial_features_cat = torch.cat(spatial_features, dim=1)
spatial_attention = self.fusion_conv(spatial_features_cat)
spatial_attention = self.sigmoid(spatial_attention)
# 应用空间注意力
out = x_channel_att * spatial_attention
# 残差连接
out = out + x
return out
CPCA注意力机制通过通道和空间两个维度的注意力计算,能够自适应地关注图像中的重要特征,特别是对于手势识别任务中,能够更好地捕捉手势的边缘、纹理等关键特征,提高识别精度。
Focaler-CIoU损失函数实现
Focaler-CIoU损失函数,主要包含以下几个关键部分:
-
IoU计算:计算预测框和真实框的交并比(Intersection over Union),这是衡量边界框重叠程度的基本指标。
-
CIoU损失计算:在IoU的基础上,进一步考虑了中心点距离、宽高比等因素,计算CIoU损失。具体包括:
- 中心点距离项:衡量预测框和真实框中心点之间的距离。
- 宽高比一致性项:衡量预测框和真实框宽高比的差异。
- 权重系数alpha:根据IoU和宽高比一致性动态调整各项的权重。
-
Focaler-IoU计算:根据预设的阈值d和u,对不同IoU值的样本分配不同的权重:
- IoU < d:权重为0,对这些极难样本不进行优化,避免影响训练稳定性。
- d ≤ IoU ≤ u:权重线性增加,重点关注这些中等难度的样本。
- IoU > u:权重为1,对这些简单样本给予正常关注。
-
Focaler-CIoU损失组合:将CIoU损失和Focaler-IoU调整项组合,得到最终的损失函数。Focaler-CIoU损失函数是YOLOv8n-ours模型在损失函数方面的重要改进,其实现代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
class FocalerCIoULoss(nn.Module):
def __init__(self, d=0.4, u=0.6, eps=1e-7):
super(FocalerCIoULoss, self).__init__()
self.d = d # 低IoU阈值
self.u = u # 高IoU阈值
self.eps = eps # 防止除零错误
def forward(self, preds, targets):
# preds: [batch_size, num_boxes, 4], 格式为[x1, y1, x2, y2]
# targets: [batch_size, num_boxes, 4], 格式为[x1, y1, x2, y2]
# 计算IoU
iou = self._calculate_iou(preds, targets)
# 计算CIoU损失
ciou_loss = self._calculate_ciou_loss(preds, targets, iou)
# 计算Focaler-IoU
iou_focaler = self._calculate_iou_focaler(iou)
# 计算Focaler-CIoU损失
focaler_ciou_loss = ciou_loss + (iou - iou_focaler)
return focaler_ciou_loss.mean()
def _calculate_iou(self, preds, targets):
# 计算交集
x1 = torch.max(preds[..., 0], targets[..., 0])
y1 = torch.max(preds[..., 1], targets[..., 1])
x2 = torch.min(preds[..., 2], targets[..., 2])
y2 = torch.min(preds[..., 3], targets[..., 3])
# 交集面积
intersection = torch.clamp(x2 - x1, min=0) * torch.clamp(y2 - y1, min=0)
# 计算预测框和真实框的面积
pred_area = (preds[..., 2] - preds[..., 0]) * (preds[..., 3] - preds[..., 1])
target_area = (targets[..., 2] - targets[..., 0]) * (targets[..., 3] - targets[..., 1])
# 计算并集面积
union = pred_area + target_area - intersection
# 计算IoU
iou = intersection / (union + self.eps)
return iou
def _calculate_ciou_loss(self, preds, targets, iou):
# 计算中心点坐标
pred_center_x = (preds[..., 0] + preds[..., 2]) / 2
pred_center_y = (preds[..., 1] + preds[..., 3]) / 2
target_center_x = (targets[..., 0] + targets[..., 2]) / 2
target_center_y = (targets[..., 1] + targets[..., 3]) / 2
# 计算中心点距离
center_distance = torch.pow(pred_center_x - target_center_x, 2) + torch.pow(pred_center_y - target_center_y, 2)
# 计算最小闭包区域的对角线距离
x1 = torch.min(preds[..., 0], targets[..., 0])
y1 = torch.min(preds[..., 1], targets[..., 1])
x2 = torch.max(preds[..., 2], targets[..., 2])
y2 = torch.max(preds[..., 3], targets[..., 3])
diagonal_distance = torch.pow(x2 - x1, 2) + torch.pow(y2 - y1, 2)
# 计算宽高比一致性参数v
pred_width = preds[..., 2] - preds[..., 0]
pred_height = preds[..., 3] - preds[..., 1]
target_width = targets[..., 2] - targets[..., 0]
target_height = targets[..., 3] - targets[..., 1]
v = (4 / (torch.pi ** 2)) * torch.pow(torch.atan(target_width / (target_height + self.eps)) - torch.atan(pred_width / (pred_height + self.eps)), 2)
# 计算权重系数alpha
alpha = v / (1 - iou + v + self.eps)
# 计算CIoU
ciou = iou - (center_distance / diagonal_distance) - alpha * v
# 计算CIoU损失
ciou_loss = 1 - ciou
return ciou_loss
def _calculate_iou_focaler(self, iou):
# 根据IoU值计算Focaler-IoU
# IoU < d: 0
# d <= IoU <= u: 线性插值
# IoU > u: 1
iou_focaler = torch.zeros_like(iou)
# 线性插值区域
mask = (iou >= self.d) & (iou <= self.u)
iou_focaler[mask] = (iou[mask] - self.d) / (self.u - self.d)
# IoU > u 区域
mask = iou > self.u
iou_focaler[mask] = 1.0
return iou_focaler
Focaler-CIoU损失函数通过聚焦于中等难度的样本(d ≤ IoU ≤ u),在保持良好的边界框回归性能的同时,提高了模型对困难样本的定位精度,特别是在复杂背景和手势遮挡等情况下,能够取得更好的识别效果。
重难点和创新点
多维度改进策略的系统性设计
本研究提出了一种系统性的多维度改进策略,从主干网络、注意力机制、下采样模块和损失函数四个方面对YOLOv8n进行全面优化。这种系统性的改进设计,不仅解决了单一改进可能带来的局限性,还通过各模块之间的协同作用,实现了性能的全面提升。MobileNetV3-Small主干网络负责轻量化,CPCA注意力机制增强特征提取能力,ADown下采样模块优化特征融合,Focaler-CIoU损失函数提高定位精度。这四个模块相互配合,共同构成了一个高效、准确的手势识别系统。
CPCA注意力机制在手势识别中的创新应用
本研究创新性地将CPCA注意力机制应用于手势识别任务,并根据手势识别的特点进行了优化。CPCA注意力机制通过通道优先的设计,能够更好地捕捉手势的纹理、边缘等关键特征,特别是对于形状相似的手势,能够有效增强它们之间的特征区分度。与传统的CBAM等注意力机制相比,CPCA使用多尺度深度可分离卷积设计空间注意力部分,能够适应不同尺度的手势特征,同时通过通道与空间的交互增强,实现了更有效的特征表达。
Focaler-CIoU损失函数的创新设计
针对传统CIoU损失函数在处理困难样本时的不足,本研究创新性地提出了Focaler-CIoU损失函数。该损失函数通过Focaler-IoU机制,动态调整对不同IoU值样本的关注程度,重点关注IoU值在中等范围(d ≤ IoU ≤ u)的困难样本。Focaler-CIoU损失函数的创新之处在于:
- 通过动态惩罚调整,平衡了对不同难度样本的关注,避免了对简单样本的过度拟合和对极难样本的无效优化。
- 结合CIoU损失函数的优点,全面优化边界框的重叠度、中心点距离和宽高比,提高整体定位精度。
- 在不增加计算复杂度的情况下,显著提高了模型对困难样本的识别能力。
大规模手势数据集的构建与优化
为了支持模型的训练和评估,本研究构建了大规模的手势数据集,包括自建的LY数字手势数据集和处理后的ASL字母手势数据集。数据集构建的创新点在于:
-
数据多样性考虑:在多种环境条件下采集数据,包括不同光照强度、不同背景和不同距离,确保数据集的多样性和代表性。
-
针对性数据增强:根据手势识别的特点,设计了针对性的数据增强策略,如椒盐噪声添加、直方图均衡化等,增强模型的泛化能力。
-
精细标注:使用专业工具对数据集进行精细标注,确保标注质量,为模型训练提供准确的监督信号。
总结
研究工作总结
本研究基于YOLOv8算法,针对手势识别任务的特点和挑战,提出了一种名为YOLOv8n-ours的改进模型。通过从主干网络、注意力机制、下采样模块和损失函数四个维度进行系统性的优化,成功实现了高精度、低计算成本的实时手势识别功能。主要研究工作总结如下:
-
模型轻量化设计:采用MobileNetV3-Small轻量化网络替代YOLOv8n的原始主干网络,在保证特征提取能力的同时,大幅减少了模型参数量和计算量。
-
特征提取能力增强:创新性地引入CPCA注意力机制,通过通道优先的设计和多尺度深度可分离卷积,有效提升了模型对关键特征的关注能力。
-
特征融合策略优化:采用ADown下采样模块替代传统的跨步卷积下采样,在减少特征图尺寸的同时,保留了更多的空间信息和细节特征。
-
损失函数创新:提出Focaler-CIoU损失函数,通过Focaler-IoU机制动态调整对不同难度样本的关注程度,重点关注中等难度的样本。Focaler-CIoU损失函数的引入,使模型的精确率提高
-
多模块组合效果验证:通过大量的消融实验,验证了各改进模块的有效性,并确定了最佳的模块组合方式。
研究展望
手势识别技术作为一种自然、直观的人机交互方式,具有广阔的应用前景。随着深度学习技术的不断发展和硬件性能的持续提升,手势识别技术将在以下方面取得进一步突破:
-
更广泛的应用场景:手势识别技术将在智能家居、虚拟现实、医疗辅助、工业控制等领域得到更广泛的应用,为人们的生活和工作带来更多便利。
-
更高的识别精度:通过算法创新和数据资源的积累,手势识别的精度将进一步提高,能够准确识别更复杂、更多样的手势。
-
更强大的环境适应能力:未来的手势识别系统将具备更强的环境适应能力,能够在各种光照条件、背景环境下准确识别手势。
-
更低的计算成本:通过模型轻量化和计算优化,手势识别系统的计算成本将进一步降低,能够在更多的设备上部署和应用。
本研究提出的YOLOv8n-ours模型为手势识别技术的发展提供了一种新的思路和方法。相信通过持续的研究和创新,手势识别技术将在未来的人机交互领域发挥更加重要的作用,为构建更智能、更自然的人机交互系统提供有力支持。
参考文献
[1] Liu W, Anguelov D, Erhan D, et al. SSD: Single Shot MultiBox Detector[C]//European Conference on Computer Vision. Springer, Cham, 2016: 21-37.
[2] Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 779-788.
[3] Redmon J, Farhadi A. YOLO9000: Better, Faster, Stronger[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 7263-7271.
[4] Redmon J, Farhadi A. YOLOv3: An Incremental Improvement[J]. arXiv preprint arXiv:1804.02767, 2018.
[5] Bochkovskiy A, Wang C Y, Liao H Y M. YOLOv4: Optimal Speed and Accuracy of Object Detection[C]//2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition Workshops (CVPRW). IEEE, 2020: 1397-1407.
1208

被折叠的 条评论
为什么被折叠?



