# 基于yolo的手语图像及视频识别 **Repository Path**: yumeyo/sign_language ## Basic Information - **Project Name**: 基于yolo的手语图像及视频识别 - **Description**: 基于yolo的手语图像及视频识别 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2025-03-11 - **Last Updated**: 2025-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 基于YOLOv8的手语识别检测系统报告 一、实验目标 1. 实现手语动作的实时检测与识别 2. 构建端到端的手语识别解决方案 3. 优化模型性能与部署效率 ________________________________________ 二、实现过程 2.1 数据准备 • american-sign-language数据集 o 数据集地址:https://universe.roboflow.com/david-lee-d0rhs/american-sign-language-letters/dataset/6 o 该数据集只有720张图片,train,valid,test按照7:2:1划分,显然对于模型训练来说数据不足,故需要再自行标注。 • 数据标注 ![输入图片说明](https://foruda.gitee.com/images/1749530775640893803/d04bbce7_13373781.png "屏幕截图") o 拍摄图像,拍摄26类928张图片,后续因数据不足,又追加550张,共标注1478张图片。 将图片整理为每一类对于一个文件夹,如图形式: o 图像归一化处理 代码 ./resize.py 运行后会输出有多少个类别,共有多少张图片。 关键参数: resize_image = 640 # 图片缩放尺寸 file_path = '.\\a_z' # 原始数据路径 save_path = '.\\resize\\images' # 保存数据路径 o 使用LabelImg进行目标标注(标注文件格式说明) 使用Python 3.8版本按照yolo格式进行标注。(LabelImg已经停止更新Python 3.11不兼容,会报错) ![输入图片说明](https://foruda.gitee.com/images/1749530808540282692/53fe55b0_13373781.png "屏幕截图") o 类别定义与标签对应关系表(示例表格) iamges文件夹内为更改大小后的类别子目录和对应图片 • 数据预处理 o 数据集划分(训练集/验证集/测试集比例) 代码:./split_dataset.py: 将数据集按照指定比例分割为训练集、验证集和测试集 参数: source_dir: 源数据目录,包含images和labels子目录 target_dir: 目标数据目录 train_ratio: 训练集比例 valid_ratio: 验证集比例 test_ratio: 测试集比例 2.2 模型训练 • 训练环境 o 硬件配置 GPU型号 = RTX3060(12GB) Cuda版本 = 12.7.29 内存 = 32GB o 软件环境(Python/PyTorch版本) o Python = 3.11.11 o 根据自身电脑配置按照Pytorch选择安装版本: https://pytorch.org/get-started/locally/ ![输入图片说明](https://foruda.gitee.com/images/1749530832729204281/59c6688e_13373781.png "屏幕截图") 虚拟环境 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126 pip install ultralytics • 训练配置 ./train.py: 1. task:任务类型 o 介绍:指定训练任务类型,这里是目标检测('detect')。 2. mode:运行模式 o 介绍:指定模型运行的模式,这里是训练模式('train')。 3. data:数据集配置文件路径 o 介绍:指定数据集配置文件的路径,这里是'./data/data.yaml'。 4. epochs:训练轮数 o 介绍:整个训练集将被遍历的次数,这里是300次。 5. patience:早停法耐心值 o 介绍:在验证集性能没有提升时,继续训练的轮数,这里是30轮。 6. batch:批大小 o 介绍:每次训练时使用的样本数量,这里是8。 7. imgsz:输入图像尺寸 o 介绍:输入到模型中的图像尺寸(宽和高,通常为正方形),这里是640x640。 8. save:是否保存模型 o 介绍:是否在每个保存周期结束时保存模型,这里是True。 9. save_period:保存周期 o 介绍:多少轮训练后保存一次模型,这里是每10轮。 10. cache:是否缓存数据 o 介绍:是否在训练前缓存数据集,这里是False。 11. device:训练设备 o 介绍:指定训练使用的设备,如果CUDA可用则使用'0'(第一张GPU),否则使用'cpu',这里是自动选择。 12. workers:数据加载工作线程数 o 介绍:用于数据加载的工作线程数量,这里是2。 13. optimizer:优化器 o 介绍:用于训练过程的优化器,这里是Adam。 14. lr0:初始学习率 o 介绍:训练开始时的学习率,这里是0.001。 15. lrf:最终学习率 o 介绍:余弦学习率衰减后达到的最终学习率,这里是0.00001。 16. cos_lr:是否使用余弦学习率衰减 o 介绍:是否使用余弦函数来衰减学习率,这里是True。 17. momentum:动量 o 介绍:优化器使用的动量值,这里是0.937。 18. weight_decay:权重衰减 o 介绍:正则化项,用于防止模型过拟合,这里是0.0005。 19. warmup_epochs:预热轮数 o 介绍:在初始阶段逐渐增加学习率的轮数,这里是3轮。 20. warmup_momentum:预热阶段动量 o 介绍:预热阶段使用的动量值,这里是0.8。 21. warmup_bias_lr:预热阶段偏置学习率 o 介绍:预热阶段用于偏置项的学习率,这里是0.1。 22. box:边界框损失权重 o 介绍:目标检测中边界框损失项的权重,这里是7.5。 23. cls:分类损失权重 o 介绍:目标检测中分类损失项的权重,这里是0.5。 24. dfl:距离焦点损失权重 o 介绍:目标检测中距离焦点损失项的权重,这里是1.5。 25. augment:是否进行数据增强 o 介绍:是否在训练过程中进行数据增强,这里是True。 26. hsv_h、hsv_s、hsv_v:HSV颜色空间变换参数 o 介绍:分别表示色调(H)、饱和度(S)、明度(V)的变换范围。 27. translate:平移变换比例 o 介绍:图像平移变换的比例,这里分别是0.1。 28. scale:缩放变换比例 o 介绍:图像缩放变换的比例,这里分别是0.3。 29. flipud:上下翻转概率 o 介绍:图像上下翻转的概率,这里是0.0。 30. fliplr:左右翻转概率 o 介绍:图像左右翻转的概率,这里是0.5。 31. degrees:旋转角度范围 o 介绍:图像随机旋转的角度范围,这里是5度。 32. shear:剪切变换比例 o 介绍:图像剪切变换的比例,这里是0.1。 33. perspective:透视变换强度 o 介绍:图像透视变换的强度,这里是0.0002。 34. mosaic:Mosaic数据增强概率 o 介绍:使用Mosaic数据增强的概率,这里是0.9。 35. val:是否进行验证 o 介绍:是否在训练过程中进行验证,这里是True。 36. iou:IoU阈值 o 介绍:用于评估预测框与真实框重叠度的IoU阈值,这里是0.7。 37. conf:置信度阈值 o 介绍:用于筛选预测结果的置信度阈值,这里是None(不使用)。 38. max_det:最大检测数量 o 介绍:每张图像最多检测的目标数量,这里是300。 39. project:项目保存路径 o 介绍:训练结果和项目相关文件的保存路径,这里是'runs/detect'。 40. name:训练名称 o 介绍:训练任务的名称,这里是'train'。 41. exist_ok:是否覆盖已有结果 o 介绍:如果保存路径已存在,是否覆盖已有结果,这里是False。 42. plots:是否绘制图表 o 介绍:是否绘制训练过程中的图表,这里是True。 43. label_smoothing:标签平滑 o 介绍:用于分类任务的标签平滑参数,这里是0.0。 44. nbs:混合批处理大小 o 介绍:在使用Mosaic等增强方法时,混合批处理的大小,这里是64。 45. close_mosaic:关闭Mosaic的轮数 o 介绍:在训练的最后几轮关闭Mosaic增强的轮数,这里是40。 46. single_cls:是否单类别训练 o 介绍:是否仅训练一个类别的目标检测模型,这里是False。 47. rect:是否使用矩形检测框 o 介绍:是否使用矩形而非旋转矩形作为检测框,这里是False。 2.3 检测实现 • 图像检测模块(处理流程说明) 代码:./img_per : 对给定路径的图像进行目标检测,并保存带有检测框的图像。 • 视频检测模块(帧处理逻辑) 系统概述 利用训练好的模型,对输入的视频进行逐帧处理,识别出每一帧中的手势,并通过一系列逻辑判断,将连续的手势识别结果组合成有意义的单词或短语。系统能够处理视频文件,并在处理后生成一个新的视频文件,其中包含了识别出的手势和相应的文本信息。 核心组件 1. SignLanguageProcessor类: o 初始化:接收模型路径、手势稳定帧数阈值、断开阈值、置信度阈值和多数判断比例等参数,初始化YOLO模型、手势队列和计数器等。 o process_frame方法:对输入的视频帧进行处理,使用YOLO模型进行预测,解析预测结果,更新手势队列,判断稳定手势,更新当前单词,并在视频帧上叠加识别结果和参数信息。 2. process_video函数: o 打开指定的视频文件,获取视频属性(如宽度、高度、帧率和总帧数)。 o 初始化SignLanguageProcessor实例,用于处理视频帧。 o 创建输出视频写入器,将处理后的视频帧写入新的视频文件。 o 逐帧读取视频,使用SignLanguageProcessor处理每一帧,并将处理后的帧写入输出视频。 o 显示处理进度,并在完成后释放资源。 关键技术和算法 1. YOLO目标检测:利用训练好的YOLO模型对视频帧进行目标检测,识别出手势的位置、类别和置信度。 2. 手势队列和稳定手势判断:通过维护一个手势队列,记录最近的手势识别结果,并根据多数判断比例确定稳定手势。 3. 单词构建逻辑:根据稳定手势和断开阈值,将连续的手势识别结果组合成单词或短语。 4. 视频处理和输出:逐帧处理视频,将识别结果和参数信息叠加到视频帧上,并生成新的视频文件。 实验设置和参数  模型路径:指定YOLO模型的路径。  视频路径:指定待处理的视频文件路径。  输出路径:指定处理后视频的输出路径。  置信度阈值:用于筛选YOLO模型的预测结果,只保留置信度高于该阈值的手势。  手势稳定帧数阈值:用于判断手势是否稳定,只有在队列中达到该阈值的手势才会被考虑。  断开阈值:用于判断手势识别是否中断,如果连续未识别到稳定手势的帧数超过该阈值,则认为识别中断。  多数判断比例:用于确定手势队列中多数手势的比例,只有当多数手势的比例超过该阈值时,才会认为该手势是稳定的。 视频连续手势分割识别的实现主要通过以下几个关键机制: 1. 多帧缓冲队列(gesture_queue) o 使用固定长度(gesture_threshold)的deque存储最近N帧的检测结果 o 示例:当gesture_threshold=20时,系统会持续追踪最近20帧的检测结果 2. 置信过滤机制 o 每帧只保留置信度超过conf_threshold(默认0.5)的检测结果 o 选取单帧中置信度最高的手势作为该帧的候选结果 3. 多数表决稳定判断 o 统计缓冲队列中非空手势的出现频率 o 当某个手势占比超过majority_threshold(默认55%)时,判定为稳定手势 o 示例:在20帧队列中,若"A"出现11帧及以上,则确认该手势 4. 连续断开检测 o 通过disconnect_counter计数器跟踪连续无有效手势的帧数 o 当计数器超过disconnect_threshold(默认60帧)时,触发以下操作: a. 将当前累积的手势序列输出为完整单词 b. 重置current_word准备接收新手势 5. 动态单词构建 o 有效手势会被追加到current_word列表 o 自动去重机制:仅当新手势与当前最后一个手势不同时才追加 o 实时显示构建中的单词,并添加"..."后缀表示输入进行中 时序工作流程示例: 1. 检测到连续15帧"A"(超过20帧的55%阈值) 2. current_word追加"A" 3. 随后出现5帧"B",满足新的多数表决 4. current_word追加"B"形成"AB" 5. 当60帧未检测到有效手势时,输出最终识别结果"AB" 可视化反馈机制: • 实时显示边界框和置信度 • 屏幕顶部显示构建中的单词 • 参数信息叠加显示(调试用) • "..."动态指示输入状态 这种设计通过时空双重验证(多帧时间一致性和空间置信度过滤),有效提升了连续手势分割的准确性和鲁棒性,同时保持实时处理能力。 • 实时摄像头检测 核心组件与算法与视频检测模块相同。只是将视频输入改为摄像头输入,并添加键盘控制调节参数,以方便根据需求测试最优参数。 一、 核心差异分析 维度 视频识别版本 摄像头实时检测版本 输入源 预录制的视频文件 实时摄像头流 输出方式 生成新的视频文件 实时显示窗口 处理模式 批处理(完整处理所有帧) 流式处理(按需处理最新帧) 参数调节 启动时固定参数 支持运行时动态调节置信度阈值 性能要求 允许较高延迟 必须保证实时性(>20FPS) 错误处理 可完整回放调试 需要即时容错机制 二、实时性保障机制 1. 动态帧处理优化 while True: ret, frame = cap.read() processed_frame = processor.process_frame(frame) # 单帧处理 cv2.imshow('Sign Language Recognition', processed_frame) # 即时显示 o 无队列阻塞:逐帧处理不积压 o 内存优化:仅保留当前帧和必要状态数据 o GPU加速:利用CUDA加速YOLO推理 2. 交互式性能调节 if key == ord('q'): # 按'q'键退出程序 break elif key == ord('c'): # 按'c'键增加置信度阈值 processor.conf_threshold = min(0.9, processor.conf_threshold + 0.05) elif key == ord('v'): # 按'v'键降低置信度阈值 processor.conf_threshold = max(0.1, processor.conf_threshold - 0.05) o 动态负载调节:通过置信度阈值控制检测频率 o 视觉反馈:屏幕实时显示参数状态 ________________________________________ 三、性能关键指标 指标 典型值 推理速度 25FPS+ 单帧处理时间 30-45ms 内存占用 <2300MB 手势识别延迟 3-5帧 ________________________________________ 四、实时处理流程图解 摄像头采集 │ ▼ [帧捕获] → [YOLO实时推理] → [手势稳定性判断] ▲ │ │ │ ▼ ▼ 键盘输入 ← [参数动态调节] ← [结果显示] ________________________________________ 这种设计通过硬件加速、动态参数调节和智能状态管理,在保持25FPS+处理速度的同时,实现了手势分割的实时性和可靠性。 三、模型结构分析 3.1 YOLOv8整体架构 ![输入图片说明](https://foruda.gitee.com/images/1749530956127004678/8fba11cd_13373781.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1749530959895456608/df61cc4e_13373781.png "屏幕截图") 优参数。 3.2 核心组件 1. Backbone o CSP结构(Cross Stage Partial Networks) o SPPF模块(空间金字塔池化) 2. Neck o PANet特征融合机制 3. Head o Anchor-free检测机制 o 分类与回归双分支结构 ________________________________________ 四、参数调优分析 4.1 优化器配置 将lr0 降低至0.001,训练后发现模型收敛加快。 将lrf 降低至0.0001,训练后发现模型最终损失值降低。 增加cos_lr 动态调整学习率。 4.2 数据增强策略 'scale' 可提升缩放比例以随机放大或缩小图像的尺寸,模拟不同距离的拍摄。 'mosaic' 可提升到0.9,提高模型返还能力。 'close_mosaic' 提升至40,减少mosaic数据增强。 4.4 训练策略优化 'epochs': 300, # 延长训练时间 'patience': 30, # 增大早停值 4.5 类别不平衡处理 data.yaml: weights: # 对难样本类别赋予更高权重 weights: [2.0, 1.0, 1.0, 1.0, 1.5, 1.5, 1.5, 1.5, 2.0, 1.0, 1.0, 1.0, 1.5, 1.5, 1.0, 2.0, 1.0, 1.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.5, 1.0, 2.0, 3.0] ________________________________________ 五、实验结果 5.1 性能指标 ./runs/train14 5.2 可视化结果 ![输入图片说明](https://foruda.gitee.com/images/1749530971931668837/83409d8e_13373781.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1749530976041377513/ac4a9809_13373781.png "屏幕截图") ![输入图片说明](https://foruda.gitee.com/images/1749530985582596533/4efe4277_13373781.png "屏幕截图") ________________________________________ 六、优化方向与改进方案 6.1 现存问题 1. 复杂背景下的误检问题 2. 快速动作的检测延迟 3. 小目标识别精度不足 6.2 优化方案 (1)优化器配置 参数 设置值 优化方向 optimizer SGD 收敛速度与稳定性 lr0 0.01 适当提高初始学习率. warmup_epochs 5 延长预热时间 (2)数据增强策略 'scale' 可提升缩放比例以随机放大或缩小图像的尺寸,模拟不同距离的拍摄。 'mosaic' 可提升到1.0 'close_mosaic' 可降低至20 'perspective': 0.0005, 增大透视变换强度 (3) 损失函数配置 • 三阶段损失权重: o 'box': 8.5, # 增大定位损失权重 o 'cls': 1.0, # 适度提高分类损失 o 'label_smoothing': 0.1, # 启用标签平滑 (4)训练策略优化 'epochs': 400, # 延长训练时间 'patience': 50, # 增大早停耐心值 'dropout': 0.2, # 新增dropout层 (5)类别不平衡处理 data.yaml: weights: # 对难样本类别赋予更高权重 (6)添加注意力模块 (7)增加各种视角的数据集 (8)实施建议 1. 分步调优:每次只调整1-2个参数,通过控制变量法验证效果 2. 模型集成:训练多个不同配置的模型进行集成预测