当前位置: 首页 > news >正文

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

欢迎关注『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_SIZEtotal 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 1trainHand: 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.0Transferred 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       Size0/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       Size0/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.0068Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size1/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       Size99/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.6100 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.3MBValidating runs\train\exp2\weights\best.pt...
Fusing layers... 
YOLOv5sHand summary: 157 layers, 7023610 parameters, 0 gradients, 15.8 GFLOPsClass     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.634five        167         77      0.777      0.766       0.84       0.64four        167         21      0.745      0.697      0.779      0.617one        167         19      0.792      0.842      0.808      0.626three        167         27      0.713      0.704       0.78      0.656two        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                               # webcamimg.jpg                         # imagevid.mp4                         # videoscreen                          # screenshotpath/                           # directorylist.txt                        # list of imageslist.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 URLsource=ROOT / "data/images",  # file/dir/URL/glob/screen/0(webcam)data=ROOT / "data/dataHandGesture.yaml",  # dataset.yaml pathimgsz=(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 GFLOPsimage 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


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 45+用户占比近30%,网文产业如何赋能IP长链?
  • 如何使用gewe开发微信机器人
  • 010 OSS文件上传
  • 自动化开发流程:使用 GitHub Actions 进行 CI/CD
  • 使用 Dify 和 AI 大模型理解视频内容:Qwen 2 VL 72B
  • React+Vis.js(05):vis.js的节点的点击事件
  • 主机安全-网络攻击监测
  • 观测云对接 Pinpoint 最佳实践
  • 设备运维故障排查与修复技巧
  • 宝塔面板配置node/npm/yarn/pm2....相关全局变量 npm/node/XXX: command not found
  • Kafka的基本概念
  • 适用于 Windows 10 的最佳数据恢复免费软件是什么?
  • [JAVA] 什么是Java线程同步机制?
  • BIO,NIO,AIO编程实战
  • 游戏开发设计模式之责任链模式
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 78. Subsets
  • java小心机(3)| 浅析finalize()
  • js ES6 求数组的交集,并集,还有差集
  • JS题目及答案整理
  • MySQL几个简单SQL的优化
  • Python利用正则抓取网页内容保存到本地
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 第2章 网络文档
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 入门到放弃node系列之Hello Word篇
  • 入门级的git使用指北
  • 王永庆:技术创新改变教育未来
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • $L^p$ 调和函数恒为零
  • (1)bark-ml
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (C++)八皇后问题
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(下)
  • (区间dp) (经典例题) 石子合并
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)VirtualBox安装增强功能
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .java 9 找不到符号_java找不到符号
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net 调用海康SDK以及常见的坑解释
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)