【YOLO5 项目实战】(7)YOLO5 手势识别

news2024/9/21 18:31:55

欢迎关注『youcans动手学模型』系列
本专栏内容和资源同步到 GitHub/youcans
【YOLO5 项目实战】(1)YOLO5 环境配置与检测
【YOLO5 项目实战】(2)使用自己的数据集训练目标检测模型


【YOLO5 项目实战】(7)YOLO5 手势识别

    • 1. 手势识别任务
      • 1.1 任务简介
      • 1.2 手势识别数据集
      • 1.3 数据集处理
    • 2. YOLO5 模型
      • 2.1 下载 YOLOv5 预训练模型
      • 2.2 安装项目依赖
      • 2.3 下载 YOLOv5 预训练模型
      • 2.4 修改 YOLOv5 模型配置
    • 3. YOLO5 模型训练
      • 3.1 查看训练帮助文件
      • 3.2 修改训练程序 train.py
      • 3.3 命令行运行 YOLOv5 训练程序
      • 3.4 模型训练结果
    • 4. 测试应用
      • 4.1 修改推理程序 detect.py
      • 4.2 运行推理程序识别手势
    • 5. 报错处理

本节详细介绍 YOLOv5 实现手势识别。


1. 手势识别任务

1.1 任务简介

手势识别是人机交互领域的分类和检测任务,通过识别和解释人类的手势来实现与计算机系统或机器人的交互,为用户提供了自然、直观且高效的交互方式。

手势识别技术能够极大地改善人机交互体验,尤其是在虚拟现实(VR)、增强现实(AR)、智能家居、游戏控制以及无障碍技术等领域中的应用十分广泛。通过手势识别技术,用户可以以更自然的方式与机器进行交流,这不仅提升了交互的便利性和效率,极大地提高了特定用户群体(如残障人士)的生活质量。

基于视觉的手势识别方法使用摄像头捕捉手势图像或视频,通过图像处理和模式识别技术来识别手势。随着深度学习算法的发展,视觉手势识别的准确率和效率得到了显著提高。YOLOv5自发布以来,因其在速度和准确性上取得了良好的平衡,被广泛应用于多种实时物体识别任务中。

手势识别技术面临的挑战和问题,主要是手势识别在复杂背景下的准确性、不同光照条件下的稳定性、不同用户之间手势差异的适应性等。


1.2 手势识别数据集

手势识别数据集很多,用途各不相同,在此介绍几种常用的开源数据集。

(1)HaGRID手势识别数据集(约716GB)
HaGRID 包含静态手势识别和动态手势识别数据两类数据。可以用于图像分类或图像检测等任务。
大小为716GB,数据集包含552,992 个FullHD (1920 × 1080) RGB 图像,分为18类手势。
数据被分成 92% 的训练集和 8% 的测试集user_id,其中 509,323 幅图像用于训练,43,669 幅图像用于测试。
下载:HAnd Gesture Recognition Image Dataset
论文:HaGRID-HAnd Gesture Recognition Image Dataset

(2)Sahand LMC手语数据库
Sahand LMC 手语数据库由 32 个类别组成,包括 24 个美国字母(J 和 Z 被排除在外,因为它们是动态手势)和 0 到 9 的数字(6 和 w 的手势,9 和 F 的手势相同)。
每类数据库包含 2000 个样本,数据库采用结构格式。
下载:Sahand LMC Sign Language Dataset

(3)Sebastien Marcel Static Hand Posture Database
Jochen Triesch静态手势数据库,10个手势 (a, b, c, d, g, h, i, l, v, y),24 个人,3种背景 (light, dark, complex).
Sebastien Marcel静态手势数据集,包含6个手势(a,b,c,点,五个,v),大约10人。
Peipa动态手势数据集,包含1个视频序列(50个单独的pgm图像)。
Sebastien Marcel动态手势数据集,包含4个手势(Clic,Rotate,Stop-Grasp-Ok,No)的图像序列。
下载:Sébastien Marcel - Hand Posture and Gesture Datasets

(4)Hand Gesture Recognition Object Detection Dataset by Lebanese University
包含用于对象检测的 5 个手势类的 839 张图像:1,2,3,4,5,图像大小为 224x224
下载:Hand Gesture Recognition Object Detection Dataset (v6, 2023-03-18 4:44pm) by Lebanese University


1.3 数据集处理

由于 Lebanese University 数据集规模较小,我们用来进行学习和实验。

从 Roboflow 下载 Lebanese University 手势识别数据集:Hand Gesture Recognition Object Detection Dataset (v6, 2023-03-18 4:44pm) by Lebanese University

Roboflow 提供了多种下载格式,主要是数据集组织和标注格式的区别。注意要以YOLOv5 Pytorch格式导出,如图所示。

在这里插入图片描述

手势识别数据集设有 test,train,valid 三个文件夹,分别用作测试、训练和检验,每个文件夹下设有 images,labels 两个文件夹,分别保存图像文件和标注文件。
将数据集保存在与 YOLOv5 同一级的文件目录路径中。结构如下。

# parent
# ├── yolov5_Hand
# └── DataSetHand
#     └── dataHandGesture.yaml
#     └── test
#         └── images
#         └── labels
#     └── train
#         └── images
#         └── labels
#     └── val
#         └── images
#         └── labels

图像文件保存为 .jpeg 格式,图像大小已裁剪为 224x224。
每个标注文件只有 1 行,表示一个手势目标。每行有 5个参数,第 1 列是类别标签(Yes/No),后 4个参数是 BoundingBox 的坐标位置。

2 0.39732142857142855 0.5178571428571429 0.5915178571428571 0.5022321428571429

创建或修改数据集配置文件 dataHandGesture.yaml,定义(1)数据集根目录路径和训练/val/test图像目录的相对路径,(2)类名字典。具体内容如下:

# Dataset configuration file
# Path of dataset
train: ../DataSetHand/train/images
val: ../DataSetHand/val/images
test: ../DataSetHand/test/images
# dictionary of classes name
nc: 5
names: ['five', 'four', 'one', 'three', 'two']

注意,“nc:5” 表示类别数为 5,是由数据集的标注内容决定的,不能自行修改。


2. YOLO5 模型

2.1 下载 YOLOv5 预训练模型

YOLOv5 开源网址:GitHub - ultralytics/yolov5

克隆 repo。

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

或者直接从 GitHub 网页下载压缩文件,如下图所示。解压到 Python 项目文件夹,如"C:\Python|PythonProjects\YOLOv5_Hand"。

在下载的 YOLOv5 项目中,包括了项目说明文档:英文版 Readme.md 和中文版 Readme.zh-CN.md 。


2.2 安装项目依赖

本项目中的 requirements.txt 文件已经详细列出了所需的库及版本。

选择/激活 Python 环境。在所选择的 Python 环境下,安装项目所需的依赖(安装项目所需的库)。

可以在 Pycharm 的控制台(terminal),输入脚本指令来安装所需的库。也可以通过 Anaconda 或 Miniconda 来安装,注意要安装到所选择的 Python 环境。例如:

(base) C:\Users\Administrator>conda activate torch

(torch) C:\Users\Administrator>pip3 install -r .\requirements.txt

如果下载太慢,可以指定下载源,例如:

(base) C:\Users\Administrator>conda activate torch

(torch) C:\Users\Administrator>pip install -r .\requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
...

2.3 下载 YOLOv5 预训练模型

推荐从 YOLOv5 release下载 YOLOv5 预训练模型。本文选择 YOLOv5s,参数约 7.2M。
将下载的预训练模型文件 yolov5s.pt 放在 YOLOv5_Hand 项目的 weights 目录下,例如:“C:\Python|PythonProjects\YOLOv5_Hand\weights\yolov5s.pt”。


2.4 修改 YOLOv5 模型配置

手势识别数据集标注为 5类(nc:5),需要修改 YOLOv5 的模型配置文件 yolov5s.yaml。

在 YOLOv5_Hand/models/ 目录下,打开模型配置文件 yolov5s.yaml,把文件中的类别数改为 5 ,另存为 /models/yolov5sHand.yaml。

# Parameters
nc: 5 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
  - [10, 13, 16, 30, 33, 23] # P3/8
  - [30, 61, 62, 45, 59, 119] # P4/16
  - [116, 90, 156, 198, 373, 326] # P5/32
...  

3. YOLO5 模型训练

3.1 查看训练帮助文件

从 PyCharm 命令行输入“ python train.py -h” 可以查看帮助,也可以检查程序是否有错误。

python train.py -h

(torch) PS C:\Python\PythonProjects\YOLOv5_PCB> python train.py -h
usage: 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]

optional arguments:
  -h, --help            show this help message and exit
  --weights WEIGHTS     initial weights path
  --cfg CFG             model.yaml path
  --data DATA           dataset.yaml path
  --hyp HYP             hyperparameters path
  --epochs EPOCHS       total training epochs
  --batch-size BATCH_SIZE
                        total batch size for all GPUs, -1 for autobatch
  --device DEVICE       cuda device, i.e. 0 or 0,1,2,3 or cpu
...

运行 train.py 需要注意以下参数:

  • weight,先选用官方的 yolov5s.pt 权重
  • cfg,选择 model 目录下的 yolov5sHand.yaml 模型配置文件
  • data,选择自己编写的数据集配置文件 dataHandGesture.yaml
  • epoch,指整个数据集被训练次数,根据计算机性能和需要确定,新手练习时可以设为 2
  • batch_size,每次读入的样本数量,根据计算机性能和需要确定,新手练习时可以设为 2

3.2 修改训练程序 train.py

对于新手,通过命令行直接输入模型训练参数比较麻烦,也可以直接对 YOLOv5 训练程序进行修改,设置模型训练的参数。

在 train.py 中对 weight,cfg,data 参数进行修改,另存为 trainHand.py:

    parser = argparse.ArgumentParser()
    parser.add_argument("--weights", type=str, default=ROOT / "weights/yolov5s.pt", help="initial weights path")
    parser.add_argument("--cfg", type=str, default=ROOT / "models/yolov5sHand.yaml", help="model.yaml path")
    parser.add_argument("--data", type=str, default=ROOT / "data/dataHandGesture.yaml", help="dataset.yaml path")
    parser.add_argument("--hyp", type=str, default=ROOT / "data/hyps/hyp.scratch-low.yaml", help="hyperparameters path")
    parser.add_argument("--epochs", type=int, default=2, help="total training epochs")
    parser.add_argument("--batch-size", type=int, default=2, help="total batch size for all GPUs, -1 for autobatch")
    parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=224, help="train, val image size (pixels)")
    ...

3.3 命令行运行 YOLOv5 训练程序

通过命令行就可以运行 YOLOv5 训练程序 trainHand.py 。

如果计算机性能资源不足,可以设置较小的训练参数以便学习,例如:

python trainHand.py --weights weights/yolov5s.pt --cfg models/yolov5sHand.yaml --data …/DataSetHand/dataHandGesture.yaml --epoch 2 --batch-size 4

本文设置的遍历次数 epoch=100,批次数 batch-size=16,使用 GPU 训练。

python trainHand.py --weights weights/yolov5s.pt --cfg models/yolov5sHand.yaml --data …/DataSetHand/dataHandGesture.yaml --epoch 100 --batch-size 16 --device 1

经过50 epochs的训练,结果如下:

(torch) PS C:\Python\PythonProjects\YOLOv5_Hand> python trainHand.py --weights weights/yolov5s.pt  --cfg models/yolov5sHand.yaml --data ../DataSetHand/dataHandGesture.yaml --epoch 100 --batch-size 16 --device 1

trainHand: weights=weights/yolov5s.pt, cfg=models/yolov5sHand.yaml, data=../DataSetHand/dataHandGesture.yaml, hyp=data\hyps\hyp.scratch-low.yaml, epochs=100, batch_size=16, imgsz=224, rect=False, resume=False, nosave=False, nova
l=False, noautoanchor=False, noplots=False, evolve=None, evolve_population=data\hyps, resume_evolve=None, bucket=, cache=None, image_weights=False, device=1, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, wor
kers=8, project=runs\train, name=exp, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest, ndjson_console=False, ndjson_file=False
YOLOv5  2024-7-29 Python-3.8.19 torch-2.3.1+cu121 CUDA:1 (NVIDIA GeForce RTX 3060, 12288MiB)

hyperparameters: lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0

Transferred 342/349 items from weights\yolov5s.pt
AMP: checks passed 
optimizer: SGD(lr=0.01) with parameter groups 57 weight(decay=0.0), 60 weight(decay=0.0005), 60 bias
train: Scanning C:\Python\PythonProjects\DataSetHand\train\labels.cache... 587 images, 0 backgrounds, 0 corrupt: 100%|██████████| 587/587 [00:00<?, ?it/s]
val: Scanning C:\Python\PythonProjects\DataSetHand\val\labels.cache... 167 images, 0 backgrounds, 0 corrupt: 100%|██████████| 167/167 [00:00<?, ?it/s]

AutoAnchor: 5.26 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset
Plotting labels to runs\train\exp2\labels.jpg... 
Image sizes 224 train, 224 val
Using 8 dataloader workers
Logging results to runs\train\exp2
Starting training for 100 epochs...

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       0/99     0.489G    0.09574     0.0175    0.04958         16        224: 100%|██████████| 37/37 [00:04<00:00,  8.70it/s]


AutoAnchor: 3.75 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset
Plotting labels to runs\train\exp5\labels.jpg... 
Image sizes 640 train, 640 val
Using 8 dataloader workers
Logging results to runs\train\exp5
Starting training for 100 epochs...

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       0/99     0.489G    0.09574     0.0175    0.04958         16        224: 100%|██████████| 37/37 [00:04<00:00,  8.70it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [00:01<00:00,  5.85it/s]
                   all        167        167      0.254     0.0269     0.0257     0.0068

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       1/99      0.61G    0.06785    0.02045    0.04451         24        224: 100%|██████████| 37/37 [00:02<00:00, 18.41it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [00:00<00:00,  6.75it/s]
                   all        167        167     0.0665      0.394      0.127     0.0414

...

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
      99/99      0.61G    0.01818   0.008722    0.01276         19        224: 100%|██████████| 37/37 [00:01<00:00, 19.50it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [00:00<00:00,  6.73it/s]
                   all        167        167      0.763      0.797      0.763        0.6

100 epochs completed in 0.088 hours.
Optimizer stripped from runs\train\exp2\weights\last.pt, 14.3MB
Optimizer stripped from runs\train\exp2\weights\best.pt, 14.3MB

Validating runs\train\exp2\weights\best.pt...
Fusing layers... 
YOLOv5sHand summary: 157 layers, 7023610 parameters, 0 gradients, 15.8 GFLOPs
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [00:01<00:00,  4.03it/s]
                   all        167        167      0.761      0.758      0.803      0.634
                  five        167         77      0.777      0.766       0.84       0.64
                  four        167         21      0.745      0.697      0.779      0.617
                   one        167         19      0.792      0.842      0.808      0.626
                 three        167         27      0.713      0.704       0.78      0.656
                   two        167         23      0.778      0.783      0.807      0.632
Results saved to runs\train\exp2

其中,Epoch 为遍历次数,GPU_mem 为占用的显卡内存,box_loss 为边界框损失值,obj_loss为置信度损失值,cls_loss 为分类损失值,Instances 为实例个数(矩形框个数),Size 为输入图像大小。Class 为类别名称,Images 为训练图像数量,Instances 为实例个数,P 为准确率,R为召回率,mAP50为IoU阈值0.5的平均精度均值,maP50-95表示在不同IoU阈值(0.5~0.95)的平均精度均值。

训练好的模型,保存在路径:“runs/exp/weights”,best.pt 是最好结果,last.pt 是最后结果。可以使用该文件进行模型推理。

3.4 模型训练结果

经过 100 轮遍历训练,训练过程及结果文件保存在目录 “runs”,如下图所示:

(1)损失函数下降曲线
YOLOv5 中定义的损失函数包括:

  • 边界框定位损失(box_loss):计算预测边界框与标注边界框之间的误差(GIoU)
  • 分类损失(cls_loss):计算预测类别与对应的标注类别是否正确
  • 动态特征损失(dfl_loss):计算回归预测框与目标框之间距离的损失函数

请添加图片描述

在训练集上,这 3 个损失指标随着迭代次数的增加不断下降,这表明模型在逐渐学习如何更准确地预测边界框位置、类别以及目标存在的置信度。在经过一定数量的训练周期后,这些损失值开始趋于稳定,这通常表示模型接近收敛。

在验证集上,损失指标随着迭代次数的增加不断下降,随后逐渐趋于平稳。recall 保持较高水平,而 precision则有所波动。这可能表明模型在识别出所有手势的同时,有时也会出现误报的情况。

(2)置信度曲线
置信度指标包括精度和召回率,以及mAP(平均精度均值)在不同的IOU(交并比)阈值下的值。

  • F1 置信曲线,F1得分随着置信度阈值的变化。F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。
  • 精确度置信曲线,模型预测的精确度随着置信度阈值的变化。精确度是模型预测正确正例与预测为正例总数的比值。
  • 精确度召回曲线(PR曲线),模型的精确度与召回率之间的关系。理想情况下,模型应在精确度和召回率之间保持良好的平衡。
  • 召回置信度曲线,模型的召回率随置信度阈值的变化。召回率是模型正确预测的正例与实际正例总数的比值。

在这里插入图片描述

从图中可见,精度和召回率都在迅速提高,并在经过一定次数的迭代后达到高水平。这意味着模型不仅能够正确识别手势,而且能够识别出绝大多数的手势实例。mAP值提供了一个整体性能的度量,而在高IOU阈值下的mAP值则更为严格。我们看到在这两个指标上,模型均表现出色,特别是在mAP50中,即使在较高的IOU阈值(例如mAP50-95)下,模型性能也相当不错

PR曲线显示了对所有类别的整体评估。曲线上的每个点代表不同的阈值设置,曲线越靠近图像的右上角,表明模型的精确度和召回率都很高。


4. 测试应用

4.1 修改推理程序 detect.py

detect.py 程序使用PyTorch加载预训练的YOLOv5模型。程序解析从命令行传入的参数,这些参数包括输入文件的路径(可以是图像、视频或目录)、预训练模型的路径、输出文件的路径、置信度阈值等。具体用法如下:

Usage - sources:
    $ python detect.py --weights yolov5s.pt --source 0                               # webcam
                                                     img.jpg                         # image
                                                     vid.mp4                         # video
                                                     screen                          # screenshot
                                                     path/                           # directory
                                                     list.txt                        # list of images
                                                     list.streams                    # list of streams
                                                     'path/*.jpg'                    # glob
                                                     'https://youtu.be/LNwODJXcvt4'  # YouTube
                                                     'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

detect.py 程序默认读取 data\images 路径的图片,结果默认保存到 runs/detect 文件夹中。

我们根据项目的配置,要对推理程序 detect.py 进行如下修改(也可以直接通过命令行参数设置):

def run(
    weights=ROOT / "weights/YOLOv5Hand100.pt",  # model path or triton URL
    source=ROOT / "data/images",  # file/dir/URL/glob/screen/0(webcam)
    data=ROOT / "data/dataHandGesture.yaml",  # dataset.yaml path
    imgsz=(224, 224),  # inference size (height, width)
def parse_opt():
    parser = argparse.ArgumentParser()
    parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "weights/YOLOv5Hand100.pt", help="model path or triton URL")
    parser.add_argument("--source", type=str, default=ROOT / "data/images", help="file/dir/URL/glob/screen/0(webcam)")
    parser.add_argument("--data", type=str, default=ROOT / "data/dataHandGesture.yaml", help="(optional) dataset.yaml path")
    parser.add_argument("--imgsz", "--img", "--img-size", nargs="+", type=int, default=[224], help="inference size h,w")
...

注意:

  1. YOLOv5Hand100.pt 是前面训练手势识别模型的权重文件 “runs/exp/weights/best.pt”,已将其另存为 “weights/YOLOv5Hand100.pt”。
  2. “data/images” 是保存手势测试图片的路径,也可以使用其它图片或路径。
  3. dataHandGesture.yaml 是前面修改的数据集配置文件,已另存为 “data/dataHandGesture.yaml”。

4.2 运行推理程序识别手势

打开并运行 YOLOv5 项目中的 detect.py 程序,使用训练的手势识别模型 “weights/YOLOv5Hand100.pt” 进行手势识别。

python detect.py

运行输出如下:

(torch) PS C:\Python\PythonProjects\YOLOv5_Hand> python detect.py                                                                                                                                                 
detect: weights=weights\YOLOv5Hand100.pt, source=data\images, data=data\dataHandGesture.yaml, imgsz=[224, 224], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_csv=False, save_conf=Fa
lse, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1
YOLOv5  2024-7-29 Python-3.8.19 torch-2.3.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060, 12288MiB)

Fusing layers... 
YOLOv5sHand summary: 157 layers, 7023610 parameters, 0 gradients, 15.8 GFLOPs

image 1/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG-20230312-WA0505_jpg.rf.129631f5579ecb89f26ff58f1e091fca.jpg: 224x224 1 five, 3.0ms
image 2/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG-20230312-WA0766_jpg.rf.7ac000f4ca478fd2f831b5c3226cc609.jpg: 224x224 1 one, 4.0ms
image 3/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG-20230313-WA0074_jpg.rf.b045426186550c236f2ac69444aa989b.jpg: 224x224 1 five, 3.0ms
image 4/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG-20230313-WA0084_jpg.rf.8bf2ac36998803f68c84780f95581a3c.jpg: 224x224 1 five, 5.2ms
image 5/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG-20230313-WA0216_jpg.rf.0e83e198a52c599ee0102e669978437e.jpg: 224x224 1 two, 6.0ms
image 6/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG_20230312_164511_jpg.rf.c283b8aba127db9ab83ebc38d0c86e03.jpg: 224x224 1 two, 5.1ms
image 7/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG_20230312_174810_jpg.rf.6a984e7e90de4a188a1fcbac6750230b.jpg: 224x224 1 four, 5.0ms
image 8/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\IMG_20230312_174812_jpg.rf.a5252fe95facf280b2f7327d318b75d2.jpg: 224x224 1 five, 6.0ms
image 9/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\Screenshot-2023-03-14-212025_png.rf.11873f0fe71997366d5680d4244e292d.jpg: 224x224 1 five, 5.0ms
image 10/10 C:\Python\PythonProjects\YOLOv5_Hand\data\images\Screenshot-2023-03-14-212814_png.rf.30ed4799fe4e7dc01589841b2de41be6.jpg: 224x224 1 five, 4.1ms
Speed: 0.4ms pre-process, 4.6ms inference, 1.0ms NMS per image at shape (1, 3, 224, 224)
Results saved to runs\detect\exp

检测结果保存在 “runs\detect\exp”,结果如下。
总的来说,建立的 YOLO5 手势识别模型是有效的,但也存在一些分类错误,这与训练数据集较小和训练轮次较少有关。

在这里插入图片描述


5. 报错处理

(1)Pytorch没有下载成功:
报错内容:Module Not Found Error: No module named ‘torch’
解决方法:通过 Anaconda 或 miniconda 重新下载安装 Pytorch。

(2)PyYaml 版本错误:
报错内容:AttributeError: ‘yaml’ has no attribute ‘FullLoader’
解决方法:卸载高版本 PyYaml,安装 PyYaml 5.3 版本:

pip install pyyaml==5.3

(3)Git 执行发生错误
报错内容:ImportError: Bad git executable.
解决方法:按照报错信息找到git下的cmd文件,添加下方代码:

import os
os.environ["GIT_PYTHON_REFRESH"] = "quiet"

(4)Numpy 版本问题
报错内容:AttributeError: module ‘numpy’ has no attribute ‘float’.
解决方法:不再使用 np.float ,需要将其修改为 np.float64 。

报错内容:AttributeError: module ‘numpy’ has no attribute ‘int’.
解决方法:不再使用 np.in ,需要将其修改为 np.int32 。

【本节完】


版权声明:
欢迎关注『youcans动手学模型』系列
转发请注明原文链接:
【YOLO5 项目实战】(7)YOLO5 手势识别
Copyright 2024 youcans, XUPT
Crated:2024-08-24


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

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

相关文章

langchain入门系列之一 初识langchain

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它使得应用程序能够&#xff1a; 具有上下文感知能力&#xff1a;将语言模型连接到上下文来源&#xff08;提示指令&#xff0c;少量的示例&#xff0c;需要回应的内容等&#xff09; 具有推理能力&#xff1a;依赖语…

黑猫带你学NandFlash第8篇:NAND的供电情况详解

本文依据不同型号NandFlash spec及个人工作经验整理而成,如有错误请留言。 文章为付费内容,已加入原创侵权保护,禁止私自转载及抄袭,违者必纠。 文章所在专栏:《黑猫带你学:NandFlash详解》 1 nand有几路power pin? 1.1 典型电压值 推荐的直流电压: - 相关要求 1、…

VBA技术资料MF191:将源文件夹所有文件移动到目标文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

暑期算法训练

目录 A.糖果&#xff08;Candy) B.小红的数组重排 C.牛牛与LCM D.子串 E.勤奋的杨老师 F.清楚姐姐跳格子 G.方块 I H.PUBG A.糖果&#xff08;Candy) 思路 &#xff1a;贪心&#xff0c;为了使操作数最少&#xff0c;我们要尽可能的先吃第二个盒子里的糖果&#x…

MySQL 中间件 MySQL-Router

目录 1 MySQL-Router 的介绍 2 MySQL-Router 负载均衡 2.1 设计目的&#xff1a; 2.2 HAProxy 与 Nginx 和 MySQL-Router 之间的区别 2.3 MySQL-Router 的优势 3 MySQL-Router 的获取 3 MySQL-Router 的使用 3.1 实验环境 3.2 MySQL-Router 部署 3.3 MySQL-Router 配置 3.4 测…

java后端请求与响应总结

get 请求&#xff1a;将参数写在请求路径中&#xff08;请求路径跟一个&#xff1f;后面跟参数多个参数之间用&连接&#xff09; post 请求&#xff1a;将参数写在请求体中中 一、请求 1.简单参数 如 传一个或两个字符串、整数等 例如串一个用户名和密码 如果传入的数…

完成课题ssrf实现.SSH未创建写shell,同时完成其他漏洞复现

一、SSRF (Server-Side Request Forgery) 是一种网络安全漏洞&#xff0c;发生在服务器端应用程序中&#xff0c;允许攻击者通过服务器向任意网络资源发送请求&#xff0c;而无需用户直接参与。这种漏洞通常源于程序设计错误&#xff0c;例如当应用程序使用用户的输入作为URL请…

C++入门基础知识31

成长路上不孤单&#x1f60a;【14后男生&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&…

论文辅助笔记:Large Language Models are Zero-Shot Next LocationPredictors

论文理论部分&#xff1a;论文笔记&#xff1a;lunLarge Language Models are Zero-Shot Next LocationPredictors-CSDN博客 2 Data 2.1 Dataset类 2.2 下载文件 2.3 get_dataset 2.4 get_trajectories trajectory_split暂时略去 # save the test dictionary and the true l…

【Qt】常用控件QCalendarWidget

常用控件QCalendarWidget的使用 QCalendarWidget表示一个日历 核心属性 属性说明 selectDate 当前选中的⽇期 minimumDate 最⼩⽇期 maximumDate 最⼤⽇期 firstDayOfWeek 每周的第⼀天(也就是⽇历的第⼀列) 是周⼏. gridVisible 是否显⽰表格的边框 selectionMode…

Python酷库之旅-第三方库Pandas(097)

目录 一、用法精讲 416、pandas.DataFrame.memory_usage方法 416-1、语法 416-2、参数 416-3、功能 416-4、返回值 416-5、说明 416-6、用法 416-6-1、数据准备 416-6-2、代码示例 416-6-3、结果输出 417、pandas.DataFrame.empty属性 417-1、语法 417-2、参数 …

AI大模型日报#0825:10行代码让大模型数学提升20%、文心日均调用超6亿

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

Reinforcement-Learning 1.fundamental concept

1.首先用一个网格世界来理解 机器人在网格世界行走有四种形式&#xff0c;Accessible/forbidden/target cells, boundary. 提出一个任务&#xff0c;找到一个good的方式去到target 什么是good&#xff0c;不碰到boundary不进入forbidden最短的道路进入target 2.state State…

UE基础 —— 打包项目

目录 设置游戏的默认地图 创建打包文件 发布 签名和加密 内容烘焙 优化加载时间 使用事件驱动加载器&#xff08;Event Driven Loader&#xff0c;EDL&#xff09;和异步加载线程&#xff08;Asynchronous Loading Thread&#xff0c;ALT&#xff09; 压缩.pak文件 对…

PG数据库导致断电/重启无法正常启动

一、问题 数据库断电后&#xff0c;启动PG数据库后无法正常启动&#xff0c;报”psql: could not connect to server: No such file or directory”的错误&#xff0c;错误图片如下&#xff1a; 二、背景分析 数据库是单机版&#xff0c;使用k8s进行部署运行在指定节点&#…

华为OD机试-找座位(C++ Java Python)

题目描述: 在一个大型体育场内举办了一场大型活动&#xff0c;由于疫情防控的需要&#xff0c;要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位 分布图&#xff0c;座位中存在已落座的观众&#xff0c;请计算出&#xff0c;在不移动现有观众座位的情况下&…

正则表达式匹配——力扣困难题解

力扣链接&#xff1a;正则表达式匹配 题目描述&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 …

GUI界面开发之tkinter(三) 按钮类组件和选择列表类组件

大家好&#xff01;我是码银儿~&#xff0c;欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银公众号&#xff1a;码银学编程 一、按钮类组件 按钮类组件顾名思义就是按钮&#xff0c;跟平时大家看见的按钮没啥区别&#xff0c;允许用户通过点击执行操作。以下是三种…

Awesome-LLMs-for-Video-Understanding - 基于大型语言模型的视频理解研究

Awesome-LLMs-for-Video-Understanding 是 基于大型语言模型的视频理解研究 github : https://github.com/yunlong10/Awesome-LLMs-for-Video-Understandingpaper&#xff1a;Video Understanding with Large Language Models: A Survey https://arxiv.org/pdf/2312.17432 视频…

五、前后端分离通用权限系统(5)

&#x1f33b;&#x1f33b; 目录 一、前端框架1.1、vue-element-admin1.1.1、Vue 概述1.1.2、Element-ui 概述1.1.3、ES6 概述 1.2、vue-admin-template1.2.1、简介1.2.2、下载1.2.3、安装1.2.4、源码目录结构&#xff08;了解&#xff09;1.2.5、改造登录&退出功能1.2.5.…