使用YOLOV5进行手势识别(详细教程)

yolov5的配置相对简单,但是网上大部分博客都没有仔细介绍具体步骤,本文将详细介绍YOLOv5在windows10系统下的环境配置的全过程,以及yolov5使用的一些细节,以及如何制作和训练自己的数据集

目录

一.搭建环境

二.安装配置

1.安装anconda3

2.安装pytorch

3.安装pycharm

4.下载yolov5资源包

 三.制作训练自己的数据集

1.准备工作

2.训练自己的数据集

3.测试

4.手势识别



一.搭建环境

1.本项目所需环境为:pycharm+anconda3+pytorch

2.版本要求:YOLOV5官方要求Python>=3.7;pytorch>=1.6

                   CUDA:10.2(可在cmd下查询自己电脑的cuda版本)

       写作之前新手必看:

    CUDA

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构ISA)以及GPU内部的并行计算引擎。 开发人员可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序可以在支持CUDA™的处理器上以超高性能运行。CUDA3.0已经开始支持C++FORTRAN

   PyTorch

PyTorch是一个开源Python机器学习库,基于Torch,用于自然语言处理等应用程序。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。

二.安装配置

1.安装anconda3

       清华源下载,如图所示蓝色区域

下载完成后进行安装,安装过程将conda环境添加到系统环境中。

在conda中create Python3.7

2.安装pytorch

进入pytorch官网(PyTorch)选择适配自己电脑的下载链接

打开 anconda prompt,我们用conda指令创建一个虚拟环境叫做:pytorch

指令如下:

                conda create -n pytorch python=3.7

因为我创建过了所以他提示我是否打开,没有创建过的等他创建好后再打开。

输入指令:conda activate pytorch进入(pytorch)C:\Users\zhiyao>环境(根据自己创建的pytorch屋子所在地址),然后输入在pytorch官网复制的下载链接:

conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch

,等待安装完成即可。

 安装完成打开pycharm配置YOLOv5的项目环境。

3.安装pycharm

      下载Community版本的pycharm,然后进行安装,pycharm的安装教程网上有很多自行安装吧。

4.下载yolov5资源包

    下载地址如下:

GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

   下载zip文件并完成解压

 在pycharm中打开yolov5文件设置项目的Python解释器为我们conda环境下创建虚拟环境的pytorch(可以在anconda安装地址中找到)

5.安装labelImg

参考文章:Windows下深度学习标注工具LabelImg安装和使用指南 - 云+社区 - 腾讯云 (tencent.com)

 三.制作训练自己的数据集

1.准备工作

(1)安装项目所需要的packages,在项目终端下输入指令:pip install -r requirements.txt

其中,如果pycocotools安装失败我们可以安装 visual studio installer。下载链接:Microsoft C++ 生成工具 - Visual Studio

安装完成后我们继续在pycharm项目终端中输入指令:pip install pycocotools,即可解决问题。

我们还可以利用python库镜像下载:pip install pycocotools -i https://pypi.tuna.tsinghua.edu.cn/simple

(2)模型下载

官方链接:Releases · ultralytics/yolov5 · GitHub
yolov5l.pt
yolov5s.pt
yolov5x.pt
yolov5m.pt
将权重文件放入yolov5/weights文件夹下

(3)在yolov5目录下创建mydata文件夹(名字可以自定义),目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下
mydata
--images # 存放图片
--Annotations # 存放图片对应的xml文件
--ImageSets/Main #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练/存放train.txt/val.txt/test.txt/trainval.txt文件。

例如:

 建立my_test.py文件(用于在ImageSets/Main下生成.txt文件):

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行代码后在Main文件夹生成四个txt文档:

将数据集格式转换为yolo_txt格式,同时生成label标签 ,创建my_label.py文件。

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["A","B","C","D"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h

def convert_annotation(image_id):
    in_file = open('F:\web\yolov5-master\mydata\Annotations\%s.xml' % (image_id), encoding='UTF-8') #改成自己数据存放的地址
    out_file = open('F:\web\yolov5-master\mydata\labels\%s.txt' % (image_id), 'w')     #同上
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()
for image_set in sets:
    if not os.path.exists('F:\web\yolov5-master\mydata\labels'):    #同上
        os.makedirs('F:\web\yolov5-master\mydata\labels')   #同上
    image_ids = open('F:\web\yolov5-master\mydata\ImageSets\Main\%s.txt' % (image_set)).read().strip().split() #同上
    list_file = open('F:\web\yolov5-master\mydata\%s.txt' % (image_set), 'w')  #同上
    for image_id in image_ids:
        list_file.write(abs_path + 'F:\web\yolov5-master\mydata\images\%s.jpg\n' % (image_id))  #同上
        convert_annotation(image_id)
    list_file.close()

运行后在mydata文件夹下生成labels文件夹和txt文件,labels中为不同图像的标注文件,

 

 (4)配置文件

在mydata文件夹下创建ABCD.yaml(名字可自定义)文件。

2.训练自己的数据集

 在train.py进行以下几个修改:

 以上参数解释如下:
epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。
batch-size:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点。
cfg:存储模型结构的配置文件
data:存储训练、测试数据的文件
img-size:输入图片宽高,显卡不行你就调小点。
rect:进行矩形训练
resume:恢复最近保存的模型开始训练
nosave:仅保存最终checkpoint
notest:仅测试最后的epoch
evolve:进化超参数
bucket:gsutil bucket
cache-images:缓存图像以加快训练速度
weights:权重文件路径
name: 重命名results.txt to results_name.txt
device:cuda device, i.e. 0 or 0,1,2,3 or cpu
adam:使用adam优化
multi-scale:多尺度训练,img-size +/- 50%
single-cls:单类别的训练集
原文链接:https://blog.csdn.net/qq_36756866/article/details/109111065

 训练结束会在yolov5目录下生成一个runs文件,所以训练结果都放在runs\train文件中。

3.测试

参考链接:https://blog.csdn.net/qq_36756866/article/details/109111065

4.手势识别

(1)收集你所需的手势照片放在文件夹mydata\images中,使用labelImg对照片进行打标签,保存在文件夹mydata\Annotations(XML文件)中;

(2)在pycharm中运行my_label.py生成TXT文件并保存在文件夹mydata\labels中;

(3)这样我们就可运行train.py文件进行训练,完成后我们在终端输入指令:python F:/yolov5/yolov5-master/detect.py --source 0 --weight="F:/yolov5/yolov5-master/runs/train/exp6/weights/best.pt"调用电脑摄像头,基本可以实现你所打标签的手势识别。

  • 19
    点赞
  • 288
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值