Yolov5训练自己的数据集(windows10)

Yolov5训练自己的数据集(windows10)

环境配置+训练数据集

一.Anaconda 的安装教程(图文)

  1. Anaconda下载
    下载地址:https://www.anaconda.com/download/
    我选择了64位 windows版本Yolov5训练自己的数据集(windows10)

  2. Anaconda安装
    安装位置:C盘若是固态的话,装在C盘速度会很快,但是以后的各种包都会安装在C盘,空间是个问题;我因为C盘空间位置小,装在了D盘
    环境变量:一定勾选
    Yolov5训练自己的数据集(windows10)
    最后的界面可以取消两个对勾,Finish即可
    Yolov5训练自己的数据集(windows10)

  3. Anaconda试用
    安装完成以后,开始菜单出现如下界面,其中的Anaconda Prompt就是我们以后的编辑地址,相当于cmdYolov5训练自己的数据集(windows10)

二.Yolov5环境配置

在环境配置开始之前,有一个非常好用的加速方式,就是下载各类库的过程中提速,就是使用清华源。
我们在pip的时候 在后边加上-i https://pypi.tuna.tsinghua.edu.cn/simple
例如,我们下载gevent库的时候pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,速度很快

  1. 创建虚拟环境
conda create -n yolov5 python=3.7
activate yolov5

“yolov5”是环境名,当然可以自己定义。
python版本这里指定为3.7;如果不指定,默认安装3.8的。
以后打开Anaconda Prompt后进入环境的方法为:

activate yolov5

以后所有关于yolov5的操作,均在这一个环境里边,激活环境如下操作
Yolov5训练自己的数据集(windows10) 2. 安装cuda和cudnn
此时已经在yolov5环境下了

conda install cudatoolkit==10.2.89
conda install cudnn==7.6.5

如果选择其他版本cuda,cuda版本必须和cudnn对应。此处选择cuda10.2。
3. 下载源码
https://github.com/ultralytics/yolov5
解压到文件盘中如下所示
Yolov5训练自己的数据集(windows10)
4. 下载权重文件 .pt文件
https://github.com/ultralytics/yolov5/releases/tag/v5.0
下拉,下载这四个即可,直接下载到yolov5大文件夹下
Yolov5训练自己的数据集(windows10)
直接下载到yolov5-master大文件夹下

Yolov5训练自己的数据集(windows10)
5.下载各类配置文件
进入到yolov5-master中
Yolov5训练自己的数据集(windows10)
在此之前需要安装pycocotools
这里提供百度云链接:https://pan.baidu.com/s/1gxI7a_-68-NyU67wQMIDJw
提取码:tpbj
Yolov5训练自己的数据集(windows10)
可以放在yolov5-master大文件夹下

 cd cocoapi/PythonAPI
 python setup.py build_ext install

进行安装pycocotools
接下来是其他配置文件的安装,等待即可

pip install -U -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

6.下载pytorch

登录网站https://pytorch.org/
这里使用pip下载,选用稳定版本,cuda10.2
Yolov5训练自己的数据集(windows10)

pip3 install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio===0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

环境配置结束!!!!

三.数据集训练

编译器我使用的是PyCharm
使用虚拟环境
Yolov5训练自己的数据集(windows10)
1.Labelimg 标注
得到image图片与xml文件

pip install labelImg

安装

labelImg

启动
2.文件转换
在一个文件夹中
Yolov5训练自己的数据集(windows10)
新建四个文件夹
Yolov5训练自己的数据集(windows10)Annotations 存放标注后的xml文件–需要自己置入
images 存放原图–需要自己置入
ImageSets 存放test train val trainval 的txt文件,将xml文件分类
labels 存放转化成功的txt文件,用于输入yolov5中

(1)编写makeTxt.py文件,生成txt文件于ImageSets中将Annotations中的xml文件分类

import os
import random


trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = './Annotations'
txtsavepath = './ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('./ImageSets/trainval.txt', 'w')
ftest = open('./ImageSets/test.txt', 'w')
ftrain = open('./ImageSets/train.txt', 'w')
fval = open('./ImageSets/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftest.write(name)
        else:
            fval.write(name)
    else:
        ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

运行结果
Yolov5训练自己的数据集(windows10)
(2)编写voc_label文件,按照ImageSets中将Annotations中的xml文件分类,按照 ImageSets中的test train val trainval 的txt文件 读取xml 文件,转换为txt文件,并将文件分为train val test,最后也将txt文件至于label文件夹中

#train 训练集 val训练中的测试集,是为了让你在边训练边看到训练的结果,及时判断学习状态 test就是训练模型结束后,用于评价模型结果的测试集

# xml解析包
import xml.etree.ElementTree as ET
import pickle
import os
# os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表
from os import listdir, getcwd
from os.path import join


sets = ['train', 'test', 'val']
#train 训练集 val训练中的测试集,是为了让你在边训练边看到训练的结果,及时判断学习状态
#test就是训练模型结束后,用于评价模型结果的测试集。

classes = ['red','yellow','blue']


# 进行归一化操作
def convert(size, box): # size:(原图w,原图h) , box:(xmin,xmax,ymin,ymax)
    dw = 1./size[0]     # 1/w
    dh = 1./size[1]     # 1/h
    x = (box[0] + box[1])/2.0   # 物体在图中的中心点x坐标
    y = (box[2] + box[3])/2.0   # 物体在图中的中心点y坐标
    w = box[1] - box[0]         # 物体实际像素宽度
    h = box[3] - box[2]         # 物体实际像素高度
    x = x*dw    # 物体中心点x的坐标比(相当于 x/原图w)
    w = w*dw    # 物体宽度的宽度比(相当于 w/原图w)
    y = y*dh    # 物体中心点y的坐标比(相当于 y/原图h)
    h = h*dh    # 物体宽度的宽度比(相当于 h/原图h)
    return (x, y, w, h)    # 返回 相对于原图的物体中心点的x坐标比,y坐标比,宽度比,高度比,取值范围[0-1]


# year ='2012', 对应图片的id(文件名)
def convert_annotation(image_id):
    '''
    将对应文件名的xml文件转化为label文件,xml文件包含了对应的bunding框以及图片长款大小等信息,
    通过对其解析,然后进行归一化最终读到label文件中去,也就是说
    一张图片文件对应一个xml文件,然后通过解析和归一化,能够将对应的信息保存到唯一一个label文件中去
    labal文件中的格式:calss x y w h  同时,一张图片对应的类别有多个,所以对应的bunding的信息也有多个
    '''
    # 对应的通过year 找到相应的文件夹,并且打开相应image_id的xml文件,其对应bund文件
    in_file = open('./Annotations/%s.xml' % (image_id), encoding='utf-8')
    # print(in_file.name)
    # 准备在对应的image_id 中写入对应的label,分别为
    # <object-class> <x> <y> <width> <height>
    out_file = open('./labels/%s.txt' % (image_id), 'w', encoding='utf-8')
    # print(out_file.name)
    # 解析xml文件
    tree = ET.parse(in_file)
    # 获得对应的键值对
    root = tree.getroot()
    # 获得图片的尺寸大小
    size = root.find('size')
    # 获得宽
    w = int(size.find('width').text)
    # 获得高
    h = int(size.find('height').text)
    # 遍历目标obj
    for obj in root.iter('object'):
        # 获得difficult ??
        difficult = obj.find('difficult').text
        # 获得类别 =string 类型
        cls = obj.find('name').text
        # 如果类别不是对应在我们预定好的class文件中,或difficult==1则跳过
        if cls not in classes or int(difficult) == 1:
            continue
        # 通过类别名称找到id
        cls_id = classes.index(cls)
        # 找到bndbox 对象
        xmlbox = obj.find('bndbox')
        # 获取对应的bndbox的数组 = ['xmin','xmax','ymin','ymax']
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        print(image_id, cls, b)
        # 带入进行归一化操作
        # w = 宽, h = 高, b= bndbox的数组 = ['xmin','xmax','ymin','ymax']
        bb = convert((w, h), b)
        # bb 对应的是归一化后的(x,y,w,h)
        # 生成 calss x y w h 在label文件中
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 返回当前工作目录
wd = getcwd()
print(wd)


for image_set in sets:
    '''
    对所有的文件数据集进行遍历
    做了两个工作:
    1.讲所有图片文件都遍历一遍,并且将其所有的全路径都写在对应的txt文件中去,方便定位
    2.同时对所有的图片文件进行解析和转化,将其对应的bundingbox 以及类别的信息全部解析写到label 文件中去
         最后再通过直接读取文件,就能找到对应的label 信息
    '''
    # 先找labels文件夹如果不存在则创建
    if not os.path.exists('./labels/'):
        os.makedirs('./labels/')
    # 读取在ImageSets/Main 中的train、test..等文件的内容
    # 包含对应的文件名称
    image_ids = open('./ImageSets/%s.txt' % (image_set)).read().strip().split()
    # 打开对应的2012_train.txt 文件对其进行写入准备
    list_file = open('./%s.txt' % (image_set), 'w')
    # 将对应的文件_id以及全路径写进去并换行
    for image_id in image_ids:
        list_file.write('./images/%s.jpg\n' % (image_id))
        # 调用  year = 年份  image_id = 对应的文件名_id
        convert_annotation(image_id)
    # 关闭文件
    list_file.close()

运行结果如下
Yolov5训练自己的数据集(windows10)
Yolov5训练自己的数据集(windows10)

注意分类 classes = ['red','yellow','blue'] 按照自己的来

3.yolov5中文件导入
在data/script中新建 “你自己的项目名”文件夹 我这里是FASC
Yolov5训练自己的数据集(windows10)
里边内容为
Yolov5训练自己的数据集(windows10)
分别存放原图和txt标注文件
接下来在scripts文件中创建FASC.yaml文件

# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC/
# Train command: python train.py --data voc.yaml
# Default dataset location is next to /yolov5:
#   /parent_folder
#     /VOC
#     /yolov5


# download command/URL (optional)
#download: bash data/scripts/get_voc.sh

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: E:\yolov5-master\data\scripts\FASC\images  
val: E:\yolov5-master\data\scripts\FASC\images  

# number of classes
nc: 3

# class names
names: [ 'red','yellow','blue']

其中路径为训练集和验证集的输入,这里设为同一路径,有余力可以进行细分。nc为类别数,names为类别与上文voc_label.py中的顺序对应

编辑yolov5-master下的train.py文件
Yolov5训练自己的数据集(windows10)
接着运行,如果遇到报错建议更改batch-size大小
随后得到权重文件在weight中生成pt文件
Yolov5训练自己的数据集(windows10)

最后编辑detect.py文件
Yolov5训练自己的数据集(windows10)
修改这两处,放的都是绝对路径,一个是best.pt的路径,一个是需要检测的图片路径,也可以是视频的路径,输入0直接为摄像头。
Yolov5训练自己的数据集(windows10)
指定位置查看结果!!
结束!!

谢谢观看,出现问题及时交流!!

上一篇:【深度学习】yolov5 可视化训练结果以及result.txt解析


下一篇:Yolov5系列(4)-dataloader模块