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

文章目录

  • 数据集介绍
  • 下载数据集
  • 将数据集转换为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.zipunzip hagrid_dataset_512.zip

下载数据集的标注:

wget https://n-ws-620xz-pd11.s3pd11.sbercloud.ru/b-ws-620xz-pd11-jux/hagrid/hagrid_dataset_new_554800/annotations.zipunzip 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 directoriestargets:- 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 cv2txt = "/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.jpglabelfilename = 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.txt8 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: call1: dislike2: fist3: four4: like5: mute6: ok7: one8: palm9: peace10: rock11: stop12: stop_inverted13: three14: two_up15: two_up_inverted16: three217: peace_inverted18: 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.mzph.cn/news/744244.shtml

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

相关文章

户外大屏:六个必备的户外大屏推广工具助你脱颖而出-华媒舍

1. 大屏幕LED显示屏 大屏幕LED显示屏是一种常见而有效的户外推广工具。它采用LED背光源和高分辨率显示屏&#xff0c;能够在户外环境中展示鲜艳丰富的图像和视频内容。这种显示屏广泛应用于广场、商业街、体育场馆等公共场所&#xff0c;成为吸引人们目光的重要工具。 大屏幕…

释机器学习中的召回率、精确率、准确率

精确率和召回率又被叫做查准率和查全率&#xff0c;可以通过P-R图进行表示 如何理解P-R(精确率-召回率)曲线呢&#xff1f;或者说这些曲线是根据什么变化呢&#xff1f; 以逻辑回归举例&#xff0c;其输出值是0-1之间的数字。因此&#xff0c;如果我们想要判断用户的好坏&…

MySQL的索引(优缺点,二叉树,红黑数,B+Tree)【详解】

1.什么是索引 索引&#xff1a;是用于提高查询数据性能的一种数据结构。实际开发中&#xff0c;对数据的读写操作大概是10&#xff1a;1 把索引理解为目录。 构建索引的过程&#xff0c;就是构建目录的过程 构建索引的过程中会对数据进行排序 2.索引的优缺点 优点&#x…

基于逻辑回归与决策树的地质灾害预测

大家好&#xff0c;我是带我去滑雪&#xff01; 地质灾害的预测对于人们的生命财产安全、社会稳定和经济发展具有重要意义。地质灾害如地震、泥石流、山体滑坡等往往会造成严重的人员伤亡和财产损失。大规模的地质灾害往往会导致社会秩序混乱、人员流动、灾民避难等问题&#x…

pip 和conda 更换镜像源介绍

1、前言 很多深度学习的项目免不了安装库文件、配置环境等等&#xff0c;如果利用官方提供的连接&#xff0c;网速很慢&#xff0c;而且很容易download掉。 所以配置好了虚拟环境&#xff0c;将pip换源属实重要 常见的国内镜像源有清华、中科大、阿里等等... 这里建议用中科…

在亚马逊云EC2上启动PopOS

CloudEndure遇到的挑战 自从使用CloudEndure导入win11后就一发不可收拾,然后就可以尝试新的操作系统,比如system76的Pop!_OS,虽然上是基于ubuntu进行开发的,但是在使用安装CloudEndure 的时候还是遇到的了问题,可能是因为内核很新,也可能其他的一些原因. 如果说严格按照兼容性…

力扣977. 有序数组的平方

思路&#xff1a;暴力法&#xff1a;全部平方&#xff0c;然后调用排序API&#xff0c;排序算法最快是N*log(N)时间复制度。 双指针法&#xff1a;要利用好原本的数组本就是有序的数组这个条件&#xff0c; 只是有负数 导致平方后变大了&#xff0c;那么平方后的最大值就是在两…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

mineadmin 快速安装部署(docker环境)

前提条件&#xff1a;已安装docker 一、下载dnmp环境包 github地址&#xff1a;https://github.com/tomorrow-sky/dnmp gitee地址&#xff1a; https://gitee.com/chenjianchuan/dnmp 二、看一下dnmp包目录结构 三、打开docker-compose.yml 文件&#xff0c;将不需要…

Node.js入门基础—day01

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 初识node.js什…

网络工程师笔记14

VLAN原理与配置 VLAN 的功能 划分广播域&#xff0c;隔离广播域 VLAN的应用划分 VLAN配置命令

RTX4090上运行Cuda10.1报错:ValueError: Unknown CUDA arch (8.9) or GPU not supported

原因是cuda&#xff08;我这里是cuda10.1&#xff0c;改为支持7.5&#xff09;的版本不支持当前算力&#xff08;8.9&#xff09; 参考compute capability的官方表格:https://developer.nvidia.com/cuda-gpus 修改算力过程: sudo vim ~/.bashrc # 在配置文件中添加如下一行 exp…

微信怎么定时群发消息,一键群发5000好友?

对微信运营的人来说&#xff0c;群发是一件很有必要的事情&#xff0c;但是用微信群发的话&#xff0c;微信自带的群发助手只能发送文字和图片消息&#xff0c;一次只能选200个人&#xff0c;而且也无法定时群发&#xff0c;有很多不方便的地方&#xff0c;这个时候&#xff0c…

简单的思考(一):MATLAB实现心形线

今天刷B站的时候看见了&#xff1a; 于是想着自己能不能也做出来 clc;clear; % 定义x的范围 x -2:0.01:2;% 初始化图形 figure; set(gcf,position,[0,0,800,600],color,w); h1 plot(x,abs(x).^(2/3) (0.9*sqrt((3.3-x.^2))).*sin(0.1*pi*x),r,LineWidth,3); hold on xlim(…

Flutter 开发中踩坑笔记总汇

Flutter 踩坑笔记总汇 本篇主要是收集汇总开发过程中遇到的小困惑&#xff0c;都是些比较常见的问题。后续开发中遇到&#xff0c;也会持续更新在这里。 1、Flutter Packages upgrade后任务进入阻塞状态 问题&#xff1a;无法更新下载插件库。 解决&#xff1a;配置flutter官…

力扣(103、236、104)

103. 二叉树的锯齿形层序遍历 题目大意&#xff1a;将原先的层次遍历改为蛇形遍历&#xff0c;那么我们需要在102. 二叉树的层序遍历的基础上进行改进&#xff0c;首先蛇形走位&#xff08;先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层…

k8s部署InfluxDB

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器&#xff0c;89b是容器ID的前三位 cd /usr/bin #进入容器后&#xff0c;进入此文件夹…

SEO是什么?网站为什么要做SEO?#川圣SEO#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; SEO&#xff0c;即搜索引擎优化&#xff0c;是一种通过了解和利用搜索引擎的运作规则来提高网站在搜索结果中…

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。下面是 Flink 的架构概述&#xff1a; JobManager&#xff1a;JobManager 是 Flink 集群的主节点&#xff0c;负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

Tomacat下载并且手动自动部署Web项目

Tomacat下载并且手动自动部署Web项目 Tomcat的简介Tomcat的作用Tomcat的下载Tomcat 部署1、环境准备2、手动部署项目3、自动部署项目&#xff08;IDEA&#xff09; ⭐ 前言 ⭐ 本篇文章主要介绍 Tomacat下载部署Web项目的详细使用以及部分理论知识 Tomcat的简介 Tomcat 服务…