欢迎关注『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")
...
注意:
- YOLOv5Hand100.pt 是前面训练手势识别模型的权重文件 “runs/exp/weights/best.pt”,已将其另存为 “weights/YOLOv5Hand100.pt”。
- “data/images” 是保存手势测试图片的路径,也可以使用其它图片或路径。
- 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