yolov5训练数据

YOLOv5是一种基于深度学习的目标检测算法,可以用于识别图像或视频中的物体。为了训练一个高质量的YOLOv5模型,需要进行以下步骤:

  1. 数据采集:收集包含要检测的物体的图像和视频数据集。这些数据应该具有多样性,包括不同的光照条件、背景和角度等。

  2. 数据预处理:对数据进行预处理,如调整大小、裁剪、旋转、翻转等,以增加数据集的多样性和数量。

  3. 标注数据:对数据进行标注,即在图像中标记出要检测的物体位置和类别。可以使用各种工具来完成这项任务,如LabelImg、CVAT等。

  4. 数据划分:将数据集分成训练集、验证集和测试集。通常使用80%的数据作为训练集,10%作为验证集,10%作为测试集。

  5. 模型选择:选择适合的YOLOv5模型,如YOLOv5s、YOLOv5m、YOLOv5l或YOLOv5x,根据数据集的大小和复杂程度来选择。

  6. 模型训练:使用训练集对模型进行训练,调整模型参数以提高准确性和召回率。可以使用开源框架如PyTorch或TensorFlow进行训练。

  7. 模型评估:使用验证集对模型进行评估,计算准确率、召回率、F1分数等指标,以确定模型的性能。

  8. 模型优化:根据评估结果对模型进行优化,可尝试调整模型参数、增加数据集、改变数据预处理方式等。

  9. 模型测试:使用测试集对模型进行测试,评估其在新数据上的表现。

总之,YOLOv5的数据采集和训练需要仔细规划和执行,以获得高质量的目标检测模型。

今天就讲讲怎么在自己的数据集上对模型进行训练。


采集数据以及标注

在开始前得准备好自己需要的数据图片,然后将要标注的图片存放在yolov5的data文件夹的images文件夹中(在这里我准备的是农夫山泉矿泉水的图片)如下图所示:

接着在data文件夹下新建两个文件,一个是dataset、一个是labels, dataset用来储存标注好的图片数据,labels用来存放数据标签。

一切准备好就可以标注图片了,我是用labelimg这个标图工具进行标注(labeling可自行在终端下载:pip install labelimg),下载后完成后在终端输入labelimg按回车启动labelimg,会弹出一个界面如图所示:

出现此界面

先勾选自动保存

点击选择文件夹后就会出现图片就可以进行标注了

标完后就可以在dataset文件夹中看到和图片一一对应的xml.文件,这就是已经打好的标签。


数据预处理和源代码的修改

在工程文件下新建一个split的python程序

split代码如图所示,运行此代码

import os
import random
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--xml_path', default='data/dataset', type=str, help='input xml label path')
parser.add_argument('--txt_path', default='data/labels', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1.0
train_percent = 0.8   #训练集
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()

再在python文件下创建名为xml_to_txt的python文件

xml_to_txt代码如图所示,在运行此代码之前需要修改classes的内容,这里我之前标注的图片的名称名为“water” ,所以得改为classes = [ 'water' ],再运行

import xml.etree.ElementTree as ET
from tqdm import tqdm
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ['water']  # 这里改为你要训练的标签,否则会报错。比如你要识别“hand”,那这里就改为hand


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):
    # try:
    in_file = open('data/dataset/%s.xml' % (image_id), encoding='utf-8')
    out_file = open('data/labels/%s.txt' % (image_id), 'w', encoding='utf-8')
    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')


# except Exception as e:
#     print(e, image_id)

wd = getcwd()
for image_set in sets:
    if not os.path.exists('data/labels/'):
        os.makedirs('data/labels/')
    image_ids = open('data/labels/%s.txt' %
                     (image_set)).read().strip().split()
    list_file = open('data/%s.txt' % (image_set), 'w')
    for image_id in tqdm(image_ids):
        list_file.write('data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

以上步骤全部完成后再新建一个名为myvoc的yaml文件,具体步骤找到data文件右键单击点击New再点击File创建完成。点开这个yaml文件,输入以下代码,同时在names: [ 'water' ]也要输入训练的标签water,nc为训练几个标签类别就输入几个,这里我只要训练一个标签就输1。

注:在train,val,nc,names冒号后面一定要空一格

train: data/train.txt
val: data/val.txt

# number of classes
nc: 1

#class names
names: ['water']

最后一步需要修改的是models下的yolov5s.yaml文件


训练数据

打开终端进入到自己yolov5的工程目录下,输入命令:python train.py --epoch 300 --batch 4 --data ./data/myvoc.yaml --cfg ./models/yolov5s.yaml --weight ./weights/yolov5s.pt --workers 0 开始训练。

看到以下界面就是已经开始训练了

训练完成后找到runs文件下最新的exp文件下的的last.pt文件(如图所示,训练结束后会显示文件路径地址,找到即可),将last.pt文件复制粘贴到weights文件下

以上就是全部内容,希望对你们有帮助。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要下载yolov5训练数据,您可以使用Visdrone数据集。该数据集包含了训练好的YOLOv5s-visdrone.pt和yolov5m-visdrone.pt两个模型,以及各种训练曲线和相关场景测试视频。此外,您还可以在yolov5-5.0的源代码中找到相关的训练代码。您可以在终端中输入以下命令来进行训练:python train.py --img 640 --batch 16 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt。运行train.py文件后,训练将开始,并在完成后生成runs/train/exp11文件夹,其中包含训练好的权重数据和其他参数文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Visdrone数据YOLOv5训练权重 yolov5-5.0-visdrone.zip](https://download.csdn.net/download/weixin_51154380/76852338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [YOLOV5环境搭建以及训练COCO128数据集](https://blog.csdn.net/weixin_44692055/article/details/128611604)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [YOLOv5训练目标检测数据集(小白)](https://blog.csdn.net/weixin_46288319/article/details/125702231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值