前言

使用yolov5训练自己的数据集,首先需要了解yolov5相关源文件都有什么,
# 一、yolov5环境安装

首先在github上搜索yolov5相关的配置文件,下载相关文件

或者,使用代码下载相关依赖

$ git clone https://github.com/ultralytics/yolov5
$ cd yolov5
$ pip install -r requirements.txt

yolov5 配置 参考链接

选择自己要用的模型,修改配置文件主要有以下几种模型
在这里插入图片描述
在正式开始训练之前,可以测试一下,自己安装的环境依赖是否正确。

使用 !python detect.py测试

二、yolov5voc格式的数据集

1.自己格式的数据集转换成跟yolov5相同的格式

相关文件夹有
在这里插入图片描述
其中Annotations文件夹里边是存放的标注好的xml文件。images文件夹存放的是我们所有的原图片。ImageSets文件夹中有,Main文件夹中train.txt、val.txt、trainval.txt、test.txt四个文件,存放的的是训练集、验证集、训练集加验证集、测试集所用的图片的名称,里边内容只有图片的名称,没有后缀名。

————————————————
使用脚本生成Main文件夹中的四个txt文件

import os
import random

trainval_percent = 0.9  # 训练和验证集所占比例,剩下的0.1就是测试集的比例
train_percent = 0.8  # 训练集所占比例,可自己进行调整
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
# print(total_xml)
num = len(total_xml)
list = range(num)
# print(list)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')

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

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

运行 voc_label.py,最后会在以上相同文件夹的同级目录下生成train.txt,val.txt,test.txt,并且会在其路径下生成一个label文件夹。
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

# 这里就体现出来了咱们在上一步骤的时候我说的尽量按照那个目录名进行操作的优势,
# 在这可以剩下很多去修改名称的精力
#sets设置的就是
sets=['train', 'val', 'test']


# classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
classes = ["uninform_ok","uninform_alert","uninform_no","uninform_top_ok","uninform_top_alert",
           "fence_fibe","fence_bar","fence_iron","safetybelt_ok","ladder"]  # 修改为自己的label

def convert(size, box):
    dw = 1./(size[0])  # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dw = 1./((size[0])+0.1)
    dh = 1./(size[1])  # 有的人运行这个脚本可能报错,说不能除以0什么的,你可以变成dh = 1./((size[0])+0.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('Annotations/%s.xml'%(image_id))
    out_file = open('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))
        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('labels/'):
        os.makedirs('labels/')
    image_ids = open('ImageSets/Main/%s.txt'%(image_set))
    list_file = open('%s.txt'%(image_set), 'w')
    for image_id in image_ids:

        image_id=(image_id.strip())
        print(image_id)
        print(wd)
        list_file.write('%s/JPEGImages/%s.jpg'%(wd,image_id))
        convert_annotation(image_id)
    list_file.close()

使用以上脚本生成的txt文件是对应图片的地址,如下:
在这里插入图片描述
labels文件夹
该文件夹下面存放的.txt文件对应着所有的图片(训练+验证+测试),一个图片一个文件,并且名字都是一样的。每个文件里的存放的就是类别和坐标信息,如下:

在这里插入图片描述

三、修改相关文件

1.修改data/voc.yaml

修改data/voc.yaml 文件或者自己再创建一个.yaml文件这样可以不破环原始文件
我是自己创建了一个yaml文件如下:
train,test,val存放的是刚刚上面生成的存有图片地址的txt文件的地址
nc是自己数据的标注数量,names是自己数据集的标签,按需更改
在这里插入图片描述

2.修改models/yolov5x.yaml 文件

这里我是准备训练yolov5x,如果你想要训练其他三个模型,选择对应的配置文件即可。我们一般只需要修改第一行的nc为自己的数据集的种类数即可。
在这里插入图片描述

3.训练参数

为了方便,我们可以直接在train.py文件中进行参数修改,然后直接运行train.py即可,如下:

在这里插入图片描述

四、训练

最后以上都更改完之后,直接运行train.py文件即可


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐