YOLOV5(一):win10+pytorch配置yolov5网络训练数据集

本教程详细介绍了如何在Windows 10上使用Anaconda3创建环境,安装PyTorch和LabelImg,配置YOLOv5并训练数据集。从下载源码到修改配置文件,再到模型训练和数据集打标,一步步指导完成YOLOv5的训练流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

win10+pytorch配置yolov5网络训练数据集

1.软件

Win10+Anaconda3+pytorch2.0.0+python3.9.16+opencv_python4.7

1.1 安装Anaconda3

清华源安装包:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
本文选择: Anaconda3-2022.10-Linux-x86_64.sh

1.1.1 安装

麻瓜安装:“下一步”,但最后一步不要选择“添加环境变量”
***:文件夹不要设中文路径。

1.1.2 环境配置

在用户变量和系统变量的“path”中分别添加对应安装路径。
在这里插入图片描述在这里插入图片描述
添加下载源:
打开Anaconda Prompot(Anaconda)终端,输入:

conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

查看通道地址:

conda config --show channels

***:也可直接通过修改用户配置实现,也即在C:\Users\xxx.condarc文件中添加上述源。

1.1.3 检查安装

打开cmd终端,输入:

conda --version  //conda 22.9.0
conda info			

在这里插入图片描述

1.2 安装pytorch虚拟环境

该表格给出了pytorch支持的各种系统版本、安装方式、python版本以及CUDA版本(也就是NVIDIA官方的GPU加速工具驱动):https://pytorch.org/get-started/locally/
本机配置:CUDA11.8,python3.9
打开Anaconda Prompt终端

conda create -n pytorch python=3.9 
activate pytorch
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
conda install -c menpo opencv
python
import torch
x = torch.rand(5, 3)
print(x)
#tensor([[0.3380, 0.3845, 0.3217],
#        [0.8337, 0.9050, 0.2650],
#        [0.2979, 0.7141, 0.9069],
#        [0.1449, 0.1132, 0.1375],
#        [0.4675, 0.3947, 0.1426]])
import torch
torch.cuda.is_available()
***若下载速度慢,更新conda国内源
清华源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

1.3 安装LabelImg

源码下载:https://gitcode.net/mirrors/tzutalin/labelimg?utm_source=csdn_github_accelerator
打开Anaconda Prompt终端

conda create -n labelimg
activate labelimg
conda install lxml
conda install PyQt5
cd E:xxx 			#//安装包路径
Pyrcc5 -o resources.py resources.qrc #会在当前目录下生成一个resource.py的文件了,把resource.py复制到当前文件夹的libs文件夹内
python labelImg.py	#启动labelimg

1.4 VSCODE配置

①下载安装VScode
②在扩展处(ctrl+shift+X)下载python、anaconda相关库
③文件->首选项->设置->扩展->python,添加

"python.defaultInterpreterPath": "E:\\Anaconda3.5\\anaconda\\envs\\pytorch", #虚拟环境安装路径

在这里插入图片描述在这里插入图片描述
④新建文件,按下Ctrl+shift+P,在窗口输入Python:Select Interpreter,选择对应虚拟环境的解释器。
在这里插入图片描述

2 模型训练

2.1 训练官方数据集

训练效果官方建议:https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results

①下载源码:

https://github.com/ultralytics/yolov5
***解压不要设中文路径
安装模块:

pip install -r requirements.txt -i  https://pypi.tuna.tsinghua.edu.cn/simple
②进入环境:

用VSCODE打开对应文件,并选择pytorch虚拟环境。
在这里插入图片描述在这里插入图片描述

③新建终端
cd E://xxx #路径
pip install -r requirements.txt -i  https://pypi.tuna.tsinghua.edu.cn/simple
④下载数据集和权重:

首先下载预训练模型的权重数据:https://pan.baidu.com/s/1_Abpe46JFevdBzOyBwGo-A 提取码:fuoe,将下载好的yolov5s.pt文件放置在当前文件夹下。然后下载coco128数据集:https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip,下载解压以后将文件夹放置在与/yolov5同级目录下:
在这里插入图片描述

⑤打开/data/coco128.yaml文件,修改路径

在这里插入图片描述

⑥打开/models/yolov5s.yaml文件,修改种类

在这里插入图片描述

⑦训练启动方式一:
python train.py --img 640 --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt

这是使用yolov5.pt预训练模型训练了5个epochs(这里只是测试,效果不佳可以增大),其中设置的图片大小为640*640,batch(size)设为16(如果内存不足则将其设小),更多参数在train.py文件中有解释,如有需要可以设置。
训练启动方式二:修改train.py文件中parse_opt函数的参数,按F5启动程序。
在这里插入图片描述
训练的结果依次保存在./runs/exp0、./runs/exp1等路径下,后续进行的实验结果也会依序存储

⑧训练可视化:

训练过程中的losses和评价指标均被保存在了Tensorboard和./runs/exp0/results.txt日志文件中,其中results.txt会在训练结束可视化为results.png。当然我们也可以使用Tensorboard进行查看:

tensorboard --logdir=runs  

在网页中打开出现的链接即可。整个过程的最好权重best.pt和最后权重last.pt程序会保存在./runs/exp*/weigths下。

9.1 预测方式一:
python3 detect.py --source file.jpg  # image 
                           file.mp4  # video
                           ./dir  # directory
                           rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa  # rtsp stream
                           http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8  # http stream
python detect.py --source ./inference/images/ --weights ./runs/exp4/weights/best.pt
9.2 预测方式二:

修改detect.py文件中run函数的参数,按F5启动程序。
在这里插入图片描述
预测后的输出图片或数据均会自动存放在./inference/output/中。

2.2训练自己的数据集

2.2.1 打标数据集
①文件夹:
建立如图箭头两个文件夹,并准备图并放入images文件夹,Annotations用于放置标记完的数据,在pred_class文档中标明类别:

在这里插入图片描述

②启动LabelImg:

Anaconda prompt:

activate labelimg
cd E://labelimg文件夹路径
python labelImg.py

在这里插入图片描述
默认XML格式,也可直接选择yolo格式。

③划分训练集、验证集、测试集程序:
# coding:utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='F:/Object Detect/network/yolov5master/mydata/Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='F:/Object Detect/network/yolov5master/mydata/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()

运行完毕后 会生成 ImagesSets\Main 文件夹,且在其下生成 测试集、训练集、验证集,存放图片的名字(无后缀.jpg)
在这里插入图片描述

④将XML格式转换为yolo_txt格式(标注时选择yolo格式的不用)
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["fire"]   # 改成自己的类别
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:/Object Detect/network/yolov5master/mydata/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('F:/Object Detect/network/yolov5master/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
        #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:/Object Detect/network/yolov5master/mydata/labels/'):
        os.makedirs('F:/Object Detect/network/yolov5master/mydata/labels/')
    image_ids = open('F:/Object Detect/network/yolov5master/mydata/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
   
    if not os.path.exists('F:/Object Detect/network/yolov5master/mydata/dataSet_path/'):
        os.makedirs('F:/Object Detect/network/yolov5master/mydata/dataSet_path/')
     
    list_file = open('F:/Object Detect/network/yolov5master/mydata/dataSet_path/%s.txt' % (image_set), 'w')
    # 这行路径不需更改,这是相对路径
    for image_id in image_ids:
        list_file.write('F:/Object Detect/network/yolov5master/mydata/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

运行后会生成如下 labels 文件夹和 dataSet_path 文件夹:
在这里插入图片描述在这里插入图片描述
其中 labels 中为不同图像的标注文件。每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式,这种即为 yolo_txt格式。dataSet_path文件夹包含三个数据集的txt文件,train.txt等txt文件为划分后图像所在位置的路径,如train.txt就含有所有训练集图像的路径。

⑤修改配置文件:
数据集配置文件:在 yolov5 目录下的 data 文件夹下 新建一个 mydata.yaml文件(可以自定义命名),用记事本打开。内容是:训练集以及验证集(train.txt和val.txt)的路径(可以改为相对路径)以及 目标的类别数目和类别名称。
train: F:/Object Detect/network/yolov5master/mydata/dataSet_path/train.txt
val: F:/Object Detect/network/yolov5master/mydata/dataSet_path/val.txt
# number of classes
nc: 1
# class names
names: ["fire"]
模型配置文件:打开models文件夹下的yolov5s.yaml文件,修改类别(自动法获取描框)
⑥训练:
与上一节第⑦⑧⑨步一致,修改对应路径即可。

引用:
[1] https://github.com/ultralytics/yolov5/wiki/Tips-for-Best-Training-Results
[2] https://zhuanlan.zhihu.com/p/269587479
[3] https://blog.youkuaiyun.com/qq_45945548/article/details/121701492?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值