【深度学习实践】HaGRID,YOLOv5,手势识别项目,目标检测实践项目

news2024/11/17 17:39:16

文章目录

  • 数据集介绍
  • 下载数据集
  • 将数据集转换为yolo
  • 绘制几张图片看看数据样子
  • 思考类别是否转换
  • 下载yolov5
  • 修改数据集样式以符合yolov5
  • 创建 dataset.yaml
  • 训练参数
  • 开始训练
  • 训练分析
  • 推理
  • 模型转换onnx
  • 重训一个yolov5s
  • 后记

数据集介绍

https://github.com/hukenovs/hagrid

HaGRID(HAnd Gesture Recognition Image Dataset)的大型图像数据集,用于手势识别系统。这个数据集非常适合用于图像分类或图像检测任务,并且可以帮助构建用于视频会议服务、家庭自动化系统、汽车行业等领域的手势识别系统。

HaGRID数据集的规模达到了723GB,包含554,800张FullHD RGB图像,被分为18类手势。此外,一些图像中还包含no_gesture类,用于表示图像中存在第二只空闲手的情况。这个额外的类别包含了120,105个样本。数据集根据主题用户ID进行了划分,分为训练集(74%)、验证集(10%)和测试集(16%),其中训练集包含410,800张图像,验证集包含54,000张图像,测试集包含90,000张图像。

数据集中包含了37,583位独特的人物以及至少这么多个独特的场景。被试者的年龄跨度从18岁到65岁不等。数据集主要在室内收集,光照条件有较大的变化,包括人工光和自然光。此外,数据集还包括了在极端条件下拍摄的图像,例如面对窗户或背对窗户。被试者需要在距离相机0.5到4米的范围内展示手势。

下载数据集

创建数据集环境:

git clone https://github.com/hukenovs/hagrid.git
# or mirror link:
cd hagrid
# Create virtual env by conda or venv
conda create -n gestures python=3.11 -y
conda activate gestures
# Install requirements
pip install -r requirements.txt

下载小的数据集解压:

wget https://n-ws-620xz-pd11.s3pd11.sbercloud.ru/b-ws-620xz-pd11-jux/hagrid/hagrid_dataset_new_554800/hagrid_dataset_512.zip

unzip hagrid_dataset_512.zip

下载数据集的标注:

wget https://n-ws-620xz-pd11.s3pd11.sbercloud.ru/b-ws-620xz-pd11-jux/hagrid/hagrid_dataset_new_554800/annotations.zip

unzip annotations.zip

整体目录结构:

# tree -L 2
.
├── annotations
│   ├── test
│   ├── train
│   └── val
├── annotations.zip
├── hagrid
│   ├── configs
│   ├── constants.py
│   ├── converters
│   ├── custom_utils
│   ├── dataset
│   ├── ddp_run.sh
│   ├── demo_ff.py
│   ├── demo.py
│   ├── download.py
│   ├── images
│   ├── license
│   ├── models
│   ├── pyproject.toml
│   ├── README.md
│   ├── requirements.txt
│   └── run.py
├── hagrid_dataset_512
│   ├── call
│   ├── dislike
│   ├── fist
│   ├── four
│   ├── like
│   ├── mute
│   ├── ok
│   ├── one
│   ├── palm
│   ├── peace
│   ├── peace_inverted
│   ├── rock
│   ├── stop
│   ├── stop_inverted
│   ├── three
│   ├── three2
│   ├── two_up
│   └── two_up_inverted
├── hagrid_dataset_512.tar
└── hagrid_dataset_512.zip

标注 含义:

在这里插入图片描述
标注给的框都是0到1,所以我们下载的原尺寸图片和缩小的图片尺寸的图片都是可以使用的:
在这里插入图片描述

将数据集转换为yolo

转换方式:
在这里插入图片描述

转换参数:
vim converters/hagrid_to_yolo.py
在这里插入图片描述
修改配置文件:
vim converters/converter_config.yaml
改为:

dataset:
  dataset_annotations: '/ssd/xiedong/hagrid/annotations/'
  dataset_folder: '/ssd/xiedong/hagrid/hagrid_dataset_512/'
  phases: [train, test, val] #names of annotation directories
  targets:
    - call
    - dislike
    - fist
    - four
    - like
    - mute
    - ok
    - one
    - palm
    - peace
    - rock
    - stop
    - stop_inverted
    - three
    - two_up
    - two_up_inverted
    - three2
    - peace_inverted
    - no_gesture

开始转换标记:

python -m converters.hagrid_to_yolo --cfg ‘/ssd/xiedong/hagrid/hagrid/converters/converter_config.yaml’

转换完成后,结果默认在hagrid_yolo_format/目录中。

在这里插入图片描述
转换完成后,这个目录中是一个标准的YOLO数据集的样子。
train.txt是图片绝对路径。
train/中是图片数据。
train_labels/是图片对应的yolo标记。

在这里插入图片描述

绘制几张图片看看数据样子

画图代码:

import os
import cv2

txt = "/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/train.txt"
# 取前5行
lines_five = []
with open(txt, 'r') as f:
    for i in range(5):
        lines_five.append(f.readline().strip())
print(lines_five)
# 取对应标记画框和类别号,保存到新路径
dstpath = "/ssd/xiedong/hagrid/hagrid/output_five"
os.makedirs(dstpath, exist_ok=True)
for imgname in lines_five:
    # /ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/train/call/fff0de6d-e13a-46fc-b4da-b6cc30b64193.jpg
    labelfilename = imgname.replace(".jpg", ".txt").replace("train/", "train_labels/")
    with open(labelfilename, 'r') as f:
        lb_lines = f.read().splitlines()
    # 0 0.5 0.5 0.5 0.5
    # 画框 写类别
    img = cv2.imread(imgname)
    for lb in lb_lines:
        lb = lb.split()
        x, y, w, h = map(float, lb[1:])
        x1, y1, x2, y2 = int((x - w / 2) * img.shape[1]), int((y - h / 2) * img.shape[0]), int(
            (x + w / 2) * img.shape[1]), int((y + h / 2) * img.shape[0])
        cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(img, lb[0], (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    # 保存
    cv2.imwrite(os.path.join(dstpath, os.path.basename(imgname)), img)

画图的结果在/ssd/xiedong/hagrid/hagrid/output_five/中,其中一张:

在这里插入图片描述

在这里插入图片描述

思考类别是否转换

目前有19个类别=18个有用类别+1个no_gesture类别负样本。

即使我们最终想要的只有5个类别:one、peace、frist、palm、ok。 我们还是选择用19个类别,这样模型可以看到更多的手势差异,便于模型学习辨认,而我们只是提高了一点分类ce softmax的计算量。我们需求的5个类别可以从19个类别中拿,从功能上也没缺什么。

targets:
- call
- dislike
- fist
- four
- like
- mute
- ok
- one
- palm
- peace
- rock
- stop
- stop_inverted
- three
- two_up
- two_up_inverted
- three2
- peace_inverted
- no_gesture

下载yolov5

下载yolov5

git clone https://github.com/ultralytics/yolov5.git
cd yolov5/

创建环境:

conda create -n py310_yolov5 python=3.10 -y
conda activate py310_yolov5

装一个可以用的torch:


# CUDA 11.8
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=11.8 -c pytorch -c nvidia

取消这2个:
在这里插入图片描述

然后安装一些别的包:

pip install -r requirements.txt  # install

随后更多内容参考官网这里的训练指导:

https://docs.ultralytics.com/zh/yolov5/tutorials/train_custom_data/#before-you-start

修改数据集样式以符合yolov5

这样移动:

cd /ssd/xiedong/hagrid/hagrid/hagrid_yolo_format
mkdir images
mv test/ train/ val/ images/
mkdir labels
mv test_labels/ train_labels/ val_labels/ labels/

mv  labels/test_labels labels/test
mv  labels/train_labels labels/train
mv  labels/val_labels labels/val

此时的文件目录:

# tree -L 2
.
├── images
│   ├── test
│   ├── train
│   └── val
├── labels
│   ├── test
│   ├── train
│   └── val
├── test.txt
├── train.txt
└── val.txt

8 directories, 3 files

为了增加一个路径 images:

这个命令中的-i选项表示直接在文件中进行替换操作,s|old|new|g表示将每一行中的old替换为new,最后的g表示全局替换(即一行中可能出现多次替换):

sed -i 's|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/images/|g' train.txt
sed -i 's|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/images/|g' test.txt
sed -i 's|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/|/ssd/xiedong/hagrid/hagrid/hagrid_yolo_format/images/|g' val.txt

创建 dataset.yaml

创建文件:

cd yolov5/data
cp coco.yaml hagrid.yaml

将hagrid.yaml修改为这样:

path: /ssd/xiedong/hagrid/hagrid/hagrid_yolo_format
train: train.txt
val: val.txt
test: test.txt

# Classes
names:
  0: call
  1: dislike
  2: fist
  3: four
  4: like
  5: mute
  6: ok
  7: one
  8: palm
  9: peace
  10: rock
  11: stop
  12: stop_inverted
  13: three
  14: two_up
  15: two_up_inverted
  16: three2
  17: peace_inverted
  18: no_gesture

训练参数

使用python train.py --help查看训练参数:

# python train.py --help
警告 ⚠️ Ultralytics 设置已重置为默认值。这可能是由于您的设置存在问题或最近 Ultralytics 包更新导致的。
使用 'yolo settings' 命令或查看 '/home/xiedong/.config/Ultralytics/settings.yaml' 文件来查看设置。
使用 'yolo settings key=value' 命令来更新设置,例如 'yolo settings runs_dir=path/to/dir'。更多帮助请参考 https://docs.ultralytics.com/quickstart/#ultralytics-settings。
用法: train.py [-h] [--weights WEIGHTS] [--cfg CFG] [--data DATA] [--hyp HYP] [--epochs EPOCHS] [--batch-size BATCH_SIZE] [--imgsz IMGSZ] [--rect] [--resume [RESUME]]
                [--nosave] [--noval] [--noautoanchor] [--noplots] [--evolve [EVOLVE]] [--evolve_population EVOLVE_POPULATION] [--resume_evolve RESUME_EVOLVE]
                [--bucket BUCKET] [--cache [CACHE]] [--image-weights] [--device DEVICE] [--multi-scale] [--single-cls] [--optimizer {SGD,Adam,AdamW}] [--sync-bn]
                [--workers WORKERS] [--project PROJECT] [--name NAME] [--exist-ok] [--quad] [--cos-lr] [--label-smoothing LABEL_SMOOTHING] [--patience PATIENCE]
                [--freeze FREEZE [FREEZE ...]] [--save-period SAVE_PERIOD] [--seed SEED] [--local_rank LOCAL_RANK] [--entity ENTITY] [--upload_dataset [UPLOAD_DATASET]]
                [--bbox_interval BBOX_INTERVAL] [--artifact_alias ARTIFACT_ALIAS] [--ndjson-console] [--ndjson-file]

选项:
  -h, --help            显示帮助信息并退出
  --weights WEIGHTS     初始权重路径
  --cfg CFG             模型配置文件路径
  --data DATA           数据集配置文件路径
  --hyp HYP             超参数路径
  --epochs EPOCHS       总训练轮数
  --batch-size BATCH_SIZE
                        所有 GPU 的总批量大小,-1 表示自动批处理
  --imgsz IMGSZ, --img IMGSZ, --img-size IMGSZ
                        训练、验证图像大小(像素)
  --rect                矩形训练
  --resume [RESUME]     恢复最近的训练
  --nosave              仅保存最终检查点
  --noval               仅验证最终轮次
  --noautoanchor        禁用 AutoAnchor
  --noplots             不保存绘图文件
  --evolve [EVOLVE]     为 x 代演进超参数
  --evolve_population EVOLVE_POPULATION
                        加载种群的位置
  --resume_evolve RESUME_EVOLVE
                        从上一代演进恢复
  --bucket BUCKET       gsutil 存储桶
  --cache [CACHE]       图像缓存 ram/disk
  --image-weights       在训练时使用加权图像选择
  --device DEVICE       cuda 设备,例如 00,1,2,3 或 cpu
  --multi-scale         图像大小变化范围为 +/- 50%
  --single-cls          将多类数据作为单类训练
  --optimizer {SGD,Adam,AdamW}
                        优化器
  --sync-bn             使用 SyncBatchNorm,仅在 DDP 模式下可用
  --workers WORKERS     最大数据加载器工作进程数(每个 DDP 模式中的 RANK)
  --project PROJECT     保存到项目/名称
  --name NAME           保存到项目/名称
  --exist-ok            存在的项目/名称正常,不增加
  --quad                四通道数据加载器
  --cos-lr              余弦学习率调度器
  --label-smoothing LABEL_SMOOTHING
                        标签平滑 epsilon
  --patience PATIENCE   EarlyStopping 耐心(未改善的轮次)
  --freeze FREEZE [FREEZE ...]
                        冻结层:backbone=10, first3=0 1 2
  --save-period SAVE_PERIOD
                        每 x 轮保存检查点(如果 < 1 则禁用)
  --seed SEED           全局训练种子
  --local_rank LOCAL_RANK
                        自动 DDP 多 GPU 参数,不要修改
  --entity ENTITY       实体
  --upload_dataset [UPLOAD_DATASET]
                        上传数据,"val" 选项
  --bbox_interval BBOX_INTERVAL
                        设置边界框图像记录间隔
  --artifact_alias ARTIFACT_ALIAS
                        要使用的数据集 artifact 版本
  --ndjson-console      将 ndjson 记录到控制台
  --ndjson-file         将 ndjson 记录到文件

开始训练

多卡训练:

 python -m torch.distributed.run --nproc_per_node 3 train.py --weights yolov5m.pt --data hagrid.yaml --batch-size 90  --epochs 150 --img 640 --sync-bn --name hagrid_0312 --cos-lr --device 0,2,3

正常启动训练:
在这里插入图片描述
在这里插入图片描述

训练分析

第一轮完成后就是非常收敛的表现。数据量太大,收敛得太好,看来不用训练150轮。

在这里插入图片描述
调整到训练20轮结束:

python -m torch.distributed.run --nproc_per_node 3 train.py --weights /ssd/xiedong/hagrid/yolov5/runs/train/hagrid_03129/weights/last.pt --data hagrid.yaml --batch-size 102  --epochs 20 --img 640 --sync-bn --name hagrid_0312_epoch10x --cos-lr --device 0,2,3 --noval 

推理

推理:

python detect.py --weights /ssd/xiedong/hagrid/yolov5/runs/train/hagrid_03129/weights/last.pt --source /ssd/xiedong/hagrid/yolov5/demov.mp4

模型转换onnx

先装环境:

pip install onnx onnx-simplifier onnxruntime-gpu # gpu版本
pip install onnx onnx-simplifier onnxruntime # cpu版本

导出:

python export.py --weights /ssd/xiedong/hagrid/yolov5/runs/train/hagrid_03129/weights/last.pt --include onnx

成功:
在这里插入图片描述
推理:

python detect.py --weights /ssd/xiedong/hagrid/yolov5/runs/train/hagrid_03129/weights/last.onnx --source /ssd/xiedong/hagrid/yolov5/demov.mp4

重训一个yolov5s

训练40轮:

python -m torch.distributed.run --nproc_per_node 3 train.py --weights yolov5s.pt --data hagrid.yaml --batch-size 192  --epochs 40 --img 640 --sync-bn --name hagrid_0313_yolov5sx --cos-lr --device 3,2,0 --noval 

在这里插入图片描述
在这里插入图片描述

后记

需要训练、数据、代码、指导,请私信。

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

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

相关文章

ElementUI Message 消息提示,多个显示被覆盖的问题

现象截图&#xff1a; 代码&#xff1a;主要是在this.$message 方法外层加上 setTimeout 方法 <script> export default {name: "HelloWorld",props: {msg: String,},methods: {showMessage() {for (let i 0; i < 10; i) {setTimeout(() > {this.$mess…

windows ffmpeg 编译环境搭建

编译ffmpeg https://www.msys2.org/ https://www.ffmpeg.org/platform.html#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows 1.安装msys2 2.安装yasm或者nasm 打开VC 本地环境命令行 唤醒msys2界面 配置编译环境变量参数 export PATH"/d/vs…

Net Core 使用Mongodb操作文件(上传,下载)

Net Core 使用Mongodb操作文件&#xff08;上传&#xff0c;下载&#xff09; 1.Mongodb GridFS 文件操作帮助类。 GridFS 介绍 https://baike.baidu.com/item/GridFS/6342715?fraladdin DLL源码&#xff1a;https://gitee.com/chenjianhua1985/mongodb-client-encapsulati…

Vue3基础速成

Vue常用语法 {{ }} 变量、表达式渲染 {{ }} 用于输出对象属性和函数返回值 <div id"hello-vue" class"demo">{{ message }} </div><script>const HelloVueApp {data() {return {message: Hello Vue!!}}}Vue.createApp(HelloVueApp).…

码头船只出行和货柜管理系统的设计与实现

针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理&#xff0c;路线管理&#xff0c;新闻管理&#…

使用Julia及R语言生成正态分布的随机数字并写入CSV文件

在操作之前需要先下载Julia的Distributions包&#xff0c;这个包用于进行相关概率分布的函数调用。 在输入 ] 进入Julia包管理模式后输入&#xff1a; add Distributions 这里我使用我们自己实验室的实测数据 &#xff0c;平均值0.67&#xff0c;方差0.11&#xff0c;数据分…

Devin,第一位AI软件工程师

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

LeetCode.2864. 最大二进制奇数

题目 2864. 最大二进制奇数 分析 这道题目其实我们只需要保证最后一位是1&#xff0c;其余的1都放在最前面&#xff0c;这样得到的就是最大二进制奇数。 所以&#xff0c;我们先统计给定的字符串有多少个 1&#xff0c;多少个 0&#xff0c;把其中一个 1 放在最后一位&…

【C#】【SAP2000】读取SAP2000中所有Frame对象的应力比到Grasshopper中

if (build true) {// 连接到正在运行的 SAP2000// 使用 System.Runtime.InteropServices.Marshal.GetActiveObject 方法获取正在运行的 SAP2000 实例cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject"…

趣学前端 | 平平无奇的JavaScript函数

背景 最近睡前习惯翻会书&#xff0c;重温了《JavaScript权威指南》。这本书&#xff0c;文字小&#xff0c;内容多。两年了&#xff0c;我才翻到第十章。因为书太厚&#xff0c;平时都充当电脑支架。 JavaScript函数 读这章之前&#xff0c;我感觉我三十年开发功力&#xf…

构建社区服务平台的智慧架构

社区服务平台作为连接社区居民与各类服务资源的桥梁&#xff0c;承载着提升居民生活品质、促进社区发展的重要使命。本文将深入探讨社区服务平台的架构设计理念、核心功能和发展前景&#xff0c;助力读者了解如何构建智慧化、便捷化的社区服务平台&#xff0c;为社区居民提供更…

SpringBoot+Vue项目报错(问题已解决)

1、错误日志 2、分析原因&#xff1a; JWT strings must contain exactly 2 period characters. Found: 0 JWT字符串必须包含2个句号字符。发现:0 分析&#xff1a;可以判断出大概可能是token格式出现了问题 3、参考 http://t.csdnimg.cn/hfEiY 4、检查后端代码是否出现问…

VR数字展厅在企业中应用的优势有哪些?

随着VR全景技术的成熟&#xff0c;VR数字展厅逐渐成为了企业展示形象和产品的重要手段之一。VR企业数字展厅是一种通过VR技术、3D建模技术展示企业形象和产品的创新方式&#xff0c;将企业线下的展厅搬到线上&#xff0c;为企业品牌形象带来了很多优势。 VR数字展厅在企业中应用…

数学实验_Matlab使用2_简单绘图

简单使用 x -pi * 2 : .1 : pi*2;y sin(x);plot(x, y); % 绘制普通图像plot(x, y, k-.*); % 绘制2维图像&#xff0c;线为实线&#xff0c;*为每个点&#xff08;Matlab的画图比较原始&#xff0c;就是简单的秒点画图&#xff09;grid on; % 打开网状格式% grid off; % 关闭…

php中 0 == ‘’(0等于任意字符串) 判断是否成立 返回true

php中不同类型变量之间比较大小 一、背景二、探究0是为什么&#xff1f;三、探究 0all是为什么&#xff1f;四、程序中如何判断0是否等于指定字符串 一、背景 最近在项目实际开发中&#xff0c;我需要判断前端传来的参数值是否等于一个字符串&#xff1b;然后发现当参数值是0时…

每天五分钟计算机视觉:如何构造分类定位任务的算法模型?

本文重点 本节课程我们将学习分类定位的问题,也就是说不仅要完成图片分类任务,然后还要完成定位任务。如下所示,我们不仅要用算法判断图片中是不是一辆车,还要在图片中标记出它的位置,用边框对象圈起来,这就是分类定位问题。 一般可能会有一张图片对应多个对象,本节课我…

你《时间贫困》么?

今天我要为大家分享的书叫《时间贫困》 这本书出版于2023年12月 “时间贫困”这个名字是什么意思呢&#xff1f; 它指的是一种没有自己的时间的感受 这种感受我相信大家都不陌生 现代人早晨被闹钟叫醒后就忙着洗漱、吃早饭、上班 下班后经过漫长的通勤回到家 可能还要处理各种琐…

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…

数据结构入门篇 之 【双链表】的实现讲解(附完整实现代码及顺序表与线性表的优缺点对比)

一日读书一日功&#xff0c;一日不读十日空 书中自有颜如玉&#xff0c;书中自有黄金屋 一、双链表 1、双链表的结构 2、双链表的实现 1&#xff09;、双向链表中节点的结构定义 2&#xff09;、初始化函数 LTInit 3&#xff09;、尾插函数 LTPushBack 4&#xff09;、头…

04_拖动文件渲染在页面中

新建一个文件夹&#xff0c;跟之前一样&#xff0c;在 Vscode 终端里输入 yarn create electron-app Drag。 在 index.html 添加以下代码&#xff0c;JS 文件夹和 render.js 都是新创建的&#xff1a; 首先&#xff0c;css 文件一般和 html 结合使用&#xff0c;相当于 html 是…