基于YOLOv8的手部检测(1)- 手部数据集获取(数据集下载、数据清洗、处理与增强)

news2024/11/23 5:03:29

前言

在进行手部姿态估计、手势识别时,需要先检测出手的位置。本文对网上公开的手部数据集进行获取、清洗、处理与数据增强,用于YOLO等目标检测网络的训练。

1.手部检测数据集概览

1.1 HaGRID手势识别数据集

项目地址: https://github.com/hukenovs/hagrid
下载地址: HaGRID 512px - lightweight version of the full dataset with min_side = 512p 26.4 GB

        如下图,可以用来做手势识别的数据集,共19个类别(下图18个类+1个no_gesture类)   

        原数据组成:详细介绍在项目地址里。官方提供了高清(723GB)和压缩(26.4GB)两个版本,共554,800张图片(train+val+test)。压缩版把图片较小的一边减小到512像素。       

        数据集特点:该数据集较简单,每类200张,用YOLOv8进行手势识别训练,在验证集上就可以取得99%的准确率,可以使用数据增强(马赛克增强+随机裁剪)减少训练数据量

        数据集划分:测试集每类有5000张,验证集每类有3000张。所以,用测试集9W张图片作为训练集,用验证集54000张作为测试集,这样可以简化划分,同时减少训练数据量。

        处理好后的HaGRID数据如下:

1.2 COCO-hand和TV-hand

项目地址: http://vision.cs.stonybrook.edu/~supreeth/
COCO-hand下载地址: COCO-Hand (1.2 GB)
TV-hand下载地址: TV-Hand (2.3 GB)

        原数据组成:COCO-Hand是对COCO中含人的图片进行手部标注(27000多张有标签),TV-Hand是对电影里含人的截图进行手部标注(4000多张)。       

        数据集特点:官方是用人体手腕关键点和手部关键点两个模型自动标注的,所以标注质量很低(COCO-Hand有手工标注,相对好一些),需要数据清洗(筛选+打码)

        数据集划分:COCO-hand共获取6000张图片(5000训练,1000测试),TV-hand共获取553张正样本+5000张负样本(450+4000训练,83+1000测试)。

        处理好后的COCO-Hand数据如下:

         处理好后的TV-Hand数据如下:

1.3 VOC-hand

项目地址: http://host.robots.ox.ac.uk/pascal/VOC/
下载地址: Download the training/validation data (2GB tar file)
        如下图,数据集中对人的标注包含:head、hands和feet三部分。

        原数据组成:人体含手部标注的应该有几百张。       

        数据集特点:官方样图看着标注挺好,实际标注质量还是不高,错标、漏标不少,还是需要数据清洗(筛选)

        数据集划分:共获取594张图片(训练420张,测试174张)。

         处理好后的VOC-Hand数据如下:

1.4 100_day_of_hand

项目地址: https://fouheylab.eecs.umich.edu/~dandans/projects/100DOH/
下载地址: raw.zip 下载链接(需要注册登录获取)共8.8GB
        可以用来检测手部行为、手持物品检测、分类的数据集,共分了以下12个类:

        原数据组成:详细介绍见项目地址,几乎涵盖了所有场景的手部检测。       

        数据集特点:标注质量高,只需将原标签转换成YOLO格式

        数据集划分:按原数据集划分trainval有89916张用于训练,test有9983张用于测试。

         处理好后的100_day_of_hand数据如下:

1.5 hand_det_ump

项目地址: https://www.robots.ox.ac.uk/~vgg/data/hands/index.html
下载地址:官网删了,但github和kaggle上有。
        如下图,原数据含有VOC、日常、电影截图等的手部旋转框:

        原数据组成:旋转框标注,.mat格式,且bbox点不是 (x, y),而是 (y, x),转格式需要注意。   

        数据集特点:标注质量较高(也存在漏标),而且是旋转框,标签转换后YOLO的框会略大

        数据集划分:按原数据集划分trainval有4096+738张用于训练,test有821张用于测试。

         处理好后的hand_det_ump数据如下:

1.6 hand_keypoint_26k

下载地址: https://www.kaggle.com/datasets/riondsilva21/hand-keypoint-dataset-26k
相关项目: https://sites.google.com/view/11khands
                   https://www.kaggle.com/datasets/ritikagiridhar/2000-hand-gestures
                   https://www.kaggle.com/datasets/imsparsh/gesture-recognition
 

        原数据组成:数据集组合了三个部分(v1.干净灰背景;v2.真人拍摄;v3.纯白背景)。原数据集用于手部关键点检测,也含有手部检测框。   

        数据集特点:v1简单只含手部,存在少量标注错误(需要数据清洗);v2含真人,存在约10%的标注错误(需要数据清洗);v3简单只含手部,无标注错误。同时,v1和v3方向单一,需要增加旋转,进行数据增强。

        数据集划分:训练集(v1:1544张,v1旋转:1544张,v2:10585张,v3:9487张,v3旋转:9487张),验证集(v1:171张,v1旋转:171张,v2:1186张,v3:1054张,v3旋转:1054张)

         处理好后的v1数据如下(第二行为顺时针旋转90度):

         处理好后的v2数据如下:

         处理好后的v3数据如下(第二行为顺时针旋转90度):

        注:该数据集很简单,加入训练的理由是:模型至少要学习到手部最最最基本的特征。

1.7 handpose_v2

项目地址: https://github.com/XIAN-HHappy/handpose_x
下载地址: 该项目用到的制作数据集下载地址(百度网盘 Password: ara8 )

        如下图,该数据集只有手部关键点,但是检测框bbox可以通过关键点获取。该数据集的检测框在图片中的位置是固定的(约为[0.5, 0.5, 0.6, 0.6]),所以需要进行随机裁剪,来修改检测框数值。同时,每张图片只标注了一只手,所以实在没数据时再使用。

        具体处理细节在后续手部关键点检测中给出。

2.手部检测数据集处理

2.1 HaGRID马赛克增强

        原数据集可以直接使用,但数据规模过大,训练非常耗时,而数据集本身又很简单,因此,可以使用马赛克增强。

        如下图,对图片进行拼接,因为原图至少有一边大小为512(另一边更大),因此可以按相同边进行连接后,统一缩放(减少图片压缩导致的信息丢失)。

       

        如下图红框对YOLOv8中的马赛克增强进行改进:将填充区域使用负样本图片进行填充(下图使用COCO数据集中不含人的图片填充)

        可以设置图片组合比例,如:{1:1, 2:1, 3:1, 4:1, 6:1, 8:1, 9:2, 12:5, 15:4, 16:4, 20:4, 24:4},再指定形状:{1: (1, 1), 2: (1, 2), 3: (1, 3), 4: (2, 2), 6: (2, 3), 8: (2, 4), 9: (3, 3), 12: (3, 4), 15: (3, 5), 16: (4, 4), 20: (4, 5), 24: (4, 6)}。

        将每张图片含有原始图片数的期望值控制在11,这样原本55W张图片,将生成5W张。训练、推理的数据量直接减为原始数据集的9%。这样操作,在训练时需要关闭马赛克增强,同时要增加随机裁剪的概率。

2.2 COCO-hand和TV-hand清洗与打码

        官方手部预测框生成的流程:
数据集生成方法:
1. 确定预测的手腕位置,称为“w_pred”。
2. 计算预测的手部关键点的平均值,称为“h_avg”。
3. 将“h_avg”-“w_pred”视为手的方向,确定与此方向对齐且包含预测手腕和所有手部关键点的最小边界矩形。
4. 计算与手部方向平行的矩形边的长度 L。
5. 计算预测的手腕位置 wpred 与最近的注释手腕位置 w_gt 之间的误差,E = ||w_pred − w_gt||。
6. 如果误差(相对于手的大小)大于 0.2(根据经验选择),则丢弃检测到的手 - 即,如果 E/L > 0.2,则丢弃检测。

        COCO-hand Annotation format: [image_name, xmin, xmax, ymin, ymax, x1, y1, x2, y2, x3, y3, x4, y4]

        TV-hand 逆天README: 写的是 [image_name, xmin, xmax, ymin, ymax, x1, y1, x2, y2, x3, y3, x4, y4],结果前面4个坐标实际是 [xmin, ymin, xmax, ymax]。

        原数据集标注很不准,需要手筛(工作量较大,可以先打码除去负样本,减少筛选量)。

        先对检测框大小进行分析, 检测框像素面积小于1000的,可以认为是小目标,由于数据集本身标注不准确,可以直接把这些检测框打码,并在标签文件中删除对应的bbox:

        根据上图,COCO-hand最终选定的删除检测框阈值设置为400(20像素×20像素);TV-hand删除检测框阈值设置为1600(40像素×40像素)。打码区域使用高斯噪声(上右图 红色框内)。
        先筛选再打码,可能会带来一些问题,一只手挡住另一只手,会使两只手都被打码。所以,可以先打码后筛选。问题如下图所示(极少数情况):

2.3 VOC-hand 预处理

       如下图,原标签为.xml,hand存在在person下的part里的hand,直接解析成字典再转换就行。

        原数据集标注不准,需要手筛(就几百张,工作量不大,不需要打码)。

2.4 100_day_of_hand 直接使用

        标注准确,直接把标签的JSON文件转成YOLO格式即可。

2.5 hand_det_ump 坐标转换

        读取.mat文件如下,每一个点坐标为(y, x)。但这里是旋转框,用最大最小作为xmax、xmin和ymax、ymin,以获取bbox的xyxy,然后转成YOLO格式:
boxes: [[array([[(array([[277.17641528, 392.31264669]]), 
                  array([[296.94449976, 410.70348234]]),
                  array([[316.85334049, 389.30371276]]), 
                  array([[297.08525601, 370.9128771 ]]), 
                  array(['L'], dtype='<U1'), array([], shape=(0, 0), dtype=uint8))]], 
                  dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O'), 
                  ('handtype', 'O'), ('truncated', 'O')])
         array([[(array([[172.31843252, 216.90699639]]), 
                  array([[166.50836487, 232.88332619]]), 
                  array([[189.7926786 , 241.35106813]]), 
                  array([[195.60274624, 225.37473832]]), 
                  array(['R'], dtype='<U1'), array([], shape=(0, 0), dtype=uint8))]],
                  dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O'), 
                  ('handtype', 'O'), ('truncated', 'O')])  

2.6 hand_keypoint_26k 筛选和旋转

        v2只需要进行筛选,一万多张筛起来,工作量有点大。v3只需要旋转。v2需要筛选(错误标注图片较少)和旋转。

        v1和v3进行旋转,如下图,顺时针旋转90度,只需将原归一化的xy坐标修改为(y, 1-x)。同理,逆时针90度为(1-y,x),旋转180度为(1-y, 1-x)。也可以旋转其他角度, 但计算起来很麻烦,还会使检测框变大(假设原本检测框刚好有目标区域,框的增大会导致无效信息的增加),所以没必要,旋转一次90度就好。

2.7 handpose_v2 预处理

        手部关键点处理中补充。

3.获取负样本数据集

3.1 不含人的图片        

        如下图,像COCO中不含人的图片作为负样本。

3.2 HaGRID打码

        HaGRID数据集比较干净,且标注准确,直接在训练集上随机抽取几万张图片打码来作为负样本。如下图,使用高斯噪声覆盖检测框区域,相比于纯色,高斯噪声更容易产生一定梯度。

3.3 无标签图片打码

        已经有yolov8-pose姿态预训练模型和手部检测模型。

        步骤1:对全图使用手部检测,对检测结果打码。

        步骤2:用yolov8-pose获取腕关节和手臂关键点,两点反向延长获取手部框,然后打码。同时,对人体检测框内进行手部检测,然后打码。

        获取的负样本图如下:

4.最终用于训练的数据集

        训练集总共36W张(224793张正样本,135208张负样本);

        验证集总共80754张(69865张正样本,10889张负样本):

        YOLOv8的data.yaml:

# path: /path/to/datasets
train: ["./datasets/hagrid/yolo_det/test/images",
        "./datasets/hand_detection/COCO_hand_det/train/images",
        "./datasets/hand_detection/TV_hand_det/train/images",
        "./datasets/hand_detection/TV_hand_det/train/images_neg",
        "./datasets/VOC/yolo_hand_det/train/images",
        "./datasets/hand_detection/100_day_of_hand/yolo_det/trainval/images",
        "./datasets/hand_detection/hand_det_ump/train/images",
        "./datasets/hand_detection/hand_det_ump/val/images",
        "./datasets/hand_keypoint_26k/yolo_det/train/images",
        "./datasets/hand_detection/hand_08_08/train/images",
        "./datasets/negative_dataset/neg_hand/train"]
val: ["./datasets/hagrid/yolo_det/val/images",
      "./datasets/hand_detection/COCO_hand_det/val/images",
      "./datasets/hand_detection/TV_hand_det/val/images",
      "./datasets/hand_detection/TV_hand_det/val/images_neg",
      "./datasets/VOC/yolo_hand_det/val/images",
      "./datasets/hand_detection/100_day_of_hand/yolo_det/test/images",
      "./datasets/hand_detection/hand_det_ump/test/images",
      "./datasets/hand_keypoint_26k/yolo_det/val/images",
      "./datasets/hand_detection/hand_08_08/val/images",
      "./datasets/negative_dataset/neg_hand/val"]

# Add negative image ----------------------------------------------------------
negative_setting:
  neg_ratio: 0    # 小于等于0时,按原始官方配置训练,大于0时,控制正负样本。
  use_extra_neg: True
  extra_neg_sources: {"./datasets/hagrid/yolo_pose_neg/train/images": 42413,
                      # "./datasets/negative_dataset/neg_hand/train": 50000
                      }
  fix_dataset_length: 0    # 是否自定义每轮参与训练的图片数量

# number of classes -----------------------------------------------------------
nc: 1

# Classes ---------------------------------------------------------------------
names:
  0: hand

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++] STL (multi)map/(multi)set简介

标题&#xff1a;[C] STL (multi)map/(multi)set简介 水墨不写bug 目录 前言&#xff1a; 一、set简介 1.set简介 2.set的常见用法 二、map简介 1.map简介 2.map使用 三、multiset简介 1.multiset简介 2.multiset使用 四、multimap简介 1.multimap简介 2.multim…

DVWA-IDS测试(特殊版本)

起因 浏览DVWA历史更新记录发现有版本带有IDS插件&#xff0c;可以用于平时没有相关设备等场景演示用&#xff0c;所以开启本次测试。 下载 官方最新版本是移除了IDS插件&#xff0c;原因是“从不使用”&#xff0c;所以需要下载移除该插件之前的版本。 https://github.com/…

【QuikGraph】图算法之Prim最小生成树求解

介绍 最小生成树概念与算法介绍 QuikGraph的PrimMinimumSpanningTreeAlgorithm的API地址 示例 测试代码&#xff1a; using Microsoft.VisualStudio.TestTools.UnitTesting; using QuikGraph; using QuikGraph.Algorithms.MinimumSpanningTree; using QuikGraph.Algorithm…

【Python 滑块图片复原】将steam蒸汽平台混乱的滑块背景图复原

文章日期&#xff1a;2024.08.16 使用工具&#xff1a;Python 文章类型&#xff1a;复原steam蒸汽平台里的滑块图片 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js…

【ElementUI】el-table值相同时合并行

效果图&#xff1a; 大致思路&#xff1a;el-table里添加合并行或列的计算方法span-method <el-table :data"tableList" :span-method"objectSpanMethod"> // 在获取到列表数据tableData后调用此方法 handleTableData(tableData) {let rowSpanArr …

探索JUnit源码:揭秘编程高手的秘密武器

摘要 本文将带领读者深入探索JUnit测试框架的源码&#xff0c;揭示其中蕴含的编程智慧和技巧。通过分析JUnit的实现原理&#xff0c;我们将学习到如何编写高质量、可维护的代码&#xff0c;并掌握一些高级编程技巧。 引言 在软件开发的世界里&#xff0c;测试是保证代码质量…

使用electron-vite创建桌面应用

使用electron-vite创建桌面应用 一、框架搭建二、项目目录三、preload.js解读 一、框架搭建 官网地址https://cn.electron-vite.org npm create quick-start/electronlatest按步骤操作即可 二、项目目录 1、main 主进程窗口&#xff1a;存放窗口代码 2、preload 预加载模块…

项目代码全自动国际化翻译工具

项目代码全自动国际化翻译工具 在当今全球化的时代&#xff0c;软件的国际化已不再是可选项&#xff0c;而是必需品。为了使软件能够覆盖更广泛的用户群体&#xff0c;支持多语言已成为每个开发团队的重要目标之一。然而&#xff0c;处理项目中的国际化问题并非易事&#xff0…

基于深度学习的图像特征优化识别复杂环境中的果蔬【多种模型切换】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍图像特征优化方法模型原理及实验对比模型训练每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 基于深度学习的图像识别技术广泛应…

企业发展与数字化转型:创新驱动未来增长的关键策略

引言 在当今全球化和信息化高度融合的时代&#xff0c;数字化转型已经成为企业寻求增长和保持竞争优势的关键战略。随着技术的飞速进步&#xff0c;数字化不仅改变了商业模式和市场格局&#xff0c;还深刻影响了企业的内部运作和外部生态系统。大数据、人工智能、物联网等新兴技…

【免费】企业级大模型应用推荐:星环科技无涯·问知

无涯问知是星环科技发布的大模型应用系统&#xff0c;那么我们先简单了解下星环科技吧&#xff01; 星环科技&#xff08;股票代码&#xff1a;688031&#xff09;致力于打造企业级大数据和人工智能基础软件&#xff0c;围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…

【保姆级教程】用pycharm连接远程数据库,并用sql语句进行增添语句

1.远程连接 检查是否连接成功 然后就能连接成功了。 2.可视化 双击&#xff0c;即可查看该表&#xff0c;左侧应该显示详细信息&#xff0c;类似navicat 3.增删改查&#xff08;前提&#xff1a;你有权限&#xff09; 3.1.非语句版 双击进行修改 点击箭头保存提交 3.2 sql语…

4.2 数据定义语言(DDL)

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

spring data:spring-data-jdbc spring-data-relational 源码解析 (2)

文章目录 简介项目特点解决的主要问题关联的项目如何引入到项目工程中源码分析框架 最近这几年在做数据中台相关的项目&#xff0c;有个技术点就是要支持多款数据库&#xff0c;尤其是一些国产数据库&#xff0c; sql 语法多样&#xff0c;如何做统一就是一个我们面临的一个难题…

采购oled全透明显示屏需要注意什么

采购OLED全透明显示屏时&#xff0c;需要注意以下几个方面以确保选择到符合需求的高品质产品&#xff1a; 一、明确需求与预算 应用场景&#xff1a;首先明确OLED全透明显示屏将用于何种场景&#xff0c;如零售展示、展览展示、智能家居、车载显示等&#xff0c;以便选择合适的…

前端新手必看:掌握CSS样式优先级和!important,让你的样式不再冲突!(CSS优先级和!important的用法)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 CSS样式优先级 📒📝 CSS样式优先级基础📝 选择器的特异性(Specificity)📝 源(Source)顺序🚀 !important的使用📝 使用!important的场景📝 如何使用!important🚧 注意事项与最佳实践📝 替代方法⚓️ 相关链…

【最新CUDA安装教程2024】手把手教你安装/更新cuda(2024版)

【最新CUDA安装教程2024】手把手教你安装/更新cuda(2024版) 需要更新的看这里(如果单纯安装的话请跳过)查看电脑的cuda版本与其支持的cuda版本删除旧版本需要安装的看这里进入官网cudnn安装测试一下配置一下设备:Legion Y9000P IAH7H系统:Win11CPU:12th Gen Intel Core™…

Android 实现动态换行显示的 TextView 列表

在开发 Android 应用程序时&#xff0c;我们经常需要在标题栏中显示多个 TextView&#xff0c;而这些 TextView 的内容长度可能不一致。如果一行内容过长&#xff0c;我们希望它们能自动换行&#xff1b;如果一行占不满屏幕宽度&#xff0c;则保持在一行内。本文将带我们一步步…

springBoot+ druid配置多数据源

springBoot druid配置多数据源 1.在yml加&#xff1a; spring:#1.JDBC数据源datasource:druid:first:username: PYpassword: ral2024url: jdbc:mysql://localhost:3306/mysql?serverTimezoneUTC&characterEncodingutf8&useUnicodetrue&useSSLfalsedriver-class-n…