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