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、包含自动求导系统的深度神经网络。
清华源下载,如图所示蓝色区域
下载完成后进行安装,安装过程将conda环境添加到系统环境中。
在conda中create Python3.7
进入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
,等待安装完成即可。
下载Community版本的pycharm,然后进行安装,pycharm的安装教程网上有很多自行安装吧。
下载地址如下:
GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > TFLite
下载zip文件并完成解压
在pycharm中打开yolov5文件设置项目的Python解释器为我们conda环境下创建虚拟环境的pytorch(可以在anconda安装地址中找到)
5.安装labelImg
参考文章:Windows下深度学习标注工具LabelImg安装和使用指南 - 云+社区 - 腾讯云 (tencent.com)
(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(名字可自定义)文件。
在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文件中。
参考链接:https://blog.csdn.net/qq_36756866/article/details/109111065
(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"调用电脑摄像头,基本可以实现你所打标签的手势识别。