基于Yolov8网络进行目标检测(二)-安装和自定义数据集

news2024/12/25 9:31:41

关于Yolov8的安装在前一个环节忽略了,其实非常简单,只需要以下两个步骤:

1、安装pytorch

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

2、安装ultralytics

pip install  ultralytics

为什么把目录结构单独拿出来扯呢?这个和训练自己的数据集息息相关。

首先我们要知道YOLOv8这次发行中带的预训练模型,是是基于COCO val2017 数据集训练的结果。

Coco2017数据集是具有80个类别的大规模数据集,其数据分为三部分:训练、验证和测试,每部分分别包含 118287, 5000 和 40670张图片,总大小约25g。其中测试数据集没有标注信息,所以注释部分只有训练和验证的

我们看一下yolo进行模型训练的方法,一种是CLI方式,一种是Python方式

CLI方式:

# Build a new model from YAML and start training from scratch
yolo detect train data=coco128.yaml model=yolov8n.yaml epochs=100 imgsz=640
# Start training from a pretrained *.pt model
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
# Build a new model from YAML, transfer pretrained weights to it and start training
yolo detect train data=coco128.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640

Python方式:

from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.yaml')  # build a new model from YAML
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights
# Train the model
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)

我们以CLI方式为例

mode: 选择是训练、验证还是预测的任务蕾西 可选['train', 'val', 'predict']

model: 选择yolov8不同的预训练模型,可选yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.pt;或选择yolov8不同的模型配置文件,可选yolov8s.yaml、yolov8m.yaml、yolov8l.yaml、yolov8x.yaml

data: 选择生成的数据集配置文件

epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。

batch:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点

其中data和model要画重点,data是要自己训练的数据集配置文件。

model一般是预训练模型,通常用yolov8n.pt、yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.pt就可以了,但如果想自己指定训练配置文件呢?这个时候,model就使用yolov8n.yaml等网络配置文件, 增加参数pretrained使用yolov8n.pt了。

这些文件在哪儿呢?

到项目所在的venv\Lib\site-packages\ultralytics目录下,看两个重要的目录cfg/datasets和cfg/models/v8

<PycharmProjectsROOT>\<ProjectName>\venv\Lib\site-packages\ultralytics>
├─assets
├─cfg
│  ├─datasets
│  ├─models
│  │  ├─rt-detr
│  │  ├─v3
│  │  ├─v5
│  │  ├─v6
│  │  └─v8

yolov8内置了以下模型配置文件

6ab5a6a5f3065ceba2f7582f09eb2ad1.png

我们看一下yolov8.yaml文件,里面包含了标签总数,yolo几种不同训练模型的Layer数量、参数量、梯度量;骨干网的结构、Head的结构。

要做的事情很简单,基于yolov8.yaml另外复制一份基于训练集命名的文件,只需要修改nc后面的标签总数即可,在训练前可以认为标签总数是已知的。

347799271c1596e562475adaeefccb30.png

数据集配置文件还内置Argoverse.yaml、coco-pose.yaml、coco.yaml、coco128-seg.yaml、coco128.yaml、coco8-pose.yaml、coco8-seg.yaml、coco8.yaml、data.yaml、DOTAv2.yaml、GlobalWheat2020.yaml、ImageNet.yaml、Objects365.yaml、open-images-v7.yaml、SKU-110K.yaml、VisDrone.yaml、VOC.yaml、xView.yaml等模板。

我们看一下coco128.yaml文件,里面包含path(数据集根目录)、train(训练集图片路径))、val(验证集图片路径)、test(测试集图片路径);标签列表清单,按照序号:标签名的方式进行枚举,最后还包括了一个Download script/URL (optional)信息,即下载脚本和路径,这个是可选项 。

8d094373d017cfdfcd6327f06e8718a8.png

要做的事情很简单,基于coco128.yaml另外复制一份基于训练集命名VOC2012.yaml(我这里是VOC2012)的文件,只需要修改path、train、val、test路径即可;同时需要修改names下的标签列表,然后把多余的download脚本剔除掉,因为假设我们已经提前下载并标注了图片。

3c2fe33eb8427ab1a3bd3ab167ae449e.png

再回过头来看一下数据集的组织,在我们的项目根目录下增加一下datasets目录,然后每个目录一个文件夹,文件夹下包括images(图片文件夹)和label(标签文件夹),images放置train、val、test等图片目录,label下一般会放在train、val等标注信息。

└─datasets
    ├─coco128
    │  ├─images
    │  │  └─train2017
    │  └─labels
    │      └─train2017
    └─VOC2012
        ├─images
        │  └─train
        └─labels
            └─train

这个目录该怎么放数据呢?按照正常的做法是先下载VOC2012数据集

VOC2012数据集包括二十个对象类别:

Person :person

Animal :bird, cat, cow, dog, horse, sheep

Vehicle :aeroplane, bicycle, boat, bus, car, motorbike, train

Indoor :bottle, chair, dining table, potted plant, sofa, tv/monitor

VOC2012数据集的目录结构如下:

└─VOCdevkit
    └─VOC2012
        ├─Annotations
        ├─ImageSets
        │  ├─Action
        │  ├─Layout
        │  ├─Main
        │  └─Segmentation
        ├─JPEGImages
        ├─SegmentationClass
        └─SegmentationObject

其中Annotation是标注文件夹,JPEGImages是图片文件夹,基本用到这两个目录,正常情况下我们先会区分训练集、验证集和测试集,当然这次没这么做。不过可以看一下代码,后续做也可以。

import os
import random
import argparse
parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='VOCdevkit/VOC2012/Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='VOCdevkit/VOC2012/ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()
# Namespace(xml_path='VOCdevkit/VOC2012/Annotations', txt_path='VOCdevkit/VOC2012/ImageSets/Main')
# 训练+验证集一共所占的比例为0.8,剩下的0.2就是测试集
# (train+val)/(train+val+test)=80%
trainval_percent = 0.8
# (train)/(train+val)=80%
# 训练集在训练集和验证集总集合中占的比例
train_percent = 0.8
xmlfilepath = opt.xml_path
# VOCdevkit/VOC2012/Annotations
txtsavepath = opt.txt_path
# VOCdevkit/dataset/ImageSets/Main
# 获取标注文件数量
total_xml = os.listdir(xmlfilepath)
# 创建文件目录
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)
# 随机打散文件序号,生成trainval和train两个随机数组
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)
fileTrainVal = open(txtsavepath + '/trainval.txt', 'w')
fileTrain = open(txtsavepath + '/train.txt', 'w')
fileVal = open(txtsavepath + '/val.txt', 'w')
fileTest = open(txtsavepath + '/test.txt', 'w')
for i in list_index:
    # 获取文件名
    name = total_xml[i][:-4] + '\n'
    # 根据trainval,train,val,test的顺序依次写入相关文件
    if i in trainval:
        fileTrainVal.write(name)
        if i in train:
            fileTrain.write(name)
        else:
            fileVal.write(name)
    else:
        fileTest.write(name)
fileTrainVal.close()
fileTrain.close()
fileVal.close()
fileTest.close()

再次是对VOC2012的标注文件XML转换为Yolo的Txt标注格式。

注这里的classes顺序要和上面的VOC2012.yaml中的name保持一致,否则会出现标签名称不对应的情况。

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
sets = ['train', 'val', 'test']
classes = ["aeroplane", 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog',
           'horse', 'motorcycle', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
absPath = os.getcwd()
def convert(size, box):
    '''
    :param size: 图片size
    :param box: 标注框坐标
    :return:
    VOC->YOLO转换算法
        norm_x=(xmin + xmax)/2/width
        norm_y=(ymin + ymax)/2/height
        norm_w=(xmax - xmin)/width
        norm_h=(ymax - ymin)/height
    YOLO->VOC转换算法
        xmin=width * (norm_x - 0.5 * norm_w)
        ymin=height * (norm_y - 0.5 * norm_h)
        xmax=width * (norm_x + 0.5 * norm_w)
        ymax=height * (norm_y + 0.5 * norm_h)
    '''
    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 ConvertAnnotation(image_id):
    inputFile = open(absPath + '/VOCdevkit/VOC2012/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    outFile = open(absPath + '/VOCdevkit/VOC2012/YOLOLabels/%s.txt' % (image_id), 'w')
    '''
    VOC2012 标注格式
    <annotation>
        <folder>VOC2012</folder>
        <filename>2008_007069.jpg</filename>
        <source>
            <database>The VOC2008 Database</database>
            <annotation>PASCAL VOC2008</annotation>
            <image>flickr</image>
        </source>
        <size>
            <width>500</width>
            <height>375</height>
            <depth>3</depth>
        </size>
        <segmented>0</segmented>
        <object>
            <name>sheep</name>
            <pose>Right</pose>
            <truncated>0</truncated>
            <occluded>0</occluded>
            <bndbox>
                <xmin>411</xmin>
                <ymin>172</ymin>
                <xmax>445</xmax>
                <ymax>195</ymax>
            </bndbox>
            <difficult>0</difficult>
        </object>
        <object></object>
    </annotation>
    '''
    '''
    Yolo 标注文件格式
    labelclass xCenter yCenter width height
    每个标签有五个数据,依次代表:
    所标注内容的类别,数字与类别一一对应
    1、labelclass 标注框类别 labelclass
    2、xCenter 归一化后标注框的中心点的x轴
    3、yCenter 归一化后标注框的中心点的y轴
    4、width 归一化后目标框的宽度
    5、height 归一化后目标框的高度    
    '''
    tree = ET.parse(inputFile)
    root = tree.getroot()
    # 获取标注图片的大小
    size = root.find('size')
    width = int(size.find('width').text)
    height = 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
        # 将标注类别按照classes列表信息转换为索引ID
        clsId = classes.index(cls)
        # 获取标注框信息
        xmlBox = obj.find('bndbox')
        boundry = (float(xmlBox.find('xmin').text), float(xmlBox.find('xmax').text), float(xmlBox.find('ymin').text),
             float(xmlBox.find('ymax').text))
        xmin, xmax, ymin, ymax = boundry
        # 标注越界修正
        if xmax > width:
            xmax = width
        if ymax > height:
            ymax = height
        box = (xmin, xmax, ymin, ymax)
        transBox = convert((width, height), box)
        outFile.write(str(clsId) + " " + " ".join([str(a) for a in transBox]) + '\n')
# 判断标注转换目录是否存在
if not os.path.exists(absPath + '/VOCdevkit/VOC2012/YOLOLabels/'):
    os.makedirs(absPath + '/VOCdevkit/VOC2012/YOLOLabels/')
for imageSet in sets:
    # 获取当前文件(train/val/test)的图片ID
    imageIds = open(absPath + '/VOCdevkit/VOC2012/ImageSets/Main/%s.txt' % (imageSet)).read().strip().split()
    listFile = open(absPath + '/VOCdevkit/VOC2012/%s.txt' % (imageSet), 'w')
    for imageId in imageIds:
        # 遍历文件名列表,分别将图片文件全路径写入新的文件中
        listFile.write(absPath + '/VOCdevkit/VOC2012/JPEGImages/%s.jpg\n' % (imageId))
        # 进行文件格式转换
        ConvertAnnotation(imageId)
    listFile.close()

关于Yolov8训练自己的数据集的前序准备工作已完成,后续讲一下怎么开展训练过程。

最后欢迎关注公众号:python与大数据分析

ae8a568a141ae3280babe1311bb4ae31.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功率放大器驱动压电陶瓷有哪些应用

功率放大器在压电陶瓷材料领域的应用。首先&#xff0c;介绍了压电陶瓷的基本概念和特性。然后&#xff0c;阐述了功率放大器的基本原理和分类。接着&#xff0c;分析了功率放大器在压电陶瓷材料领域的应用&#xff0c;包括声波发生器、超声波清洗器、超声波切割器、医疗超声波…

企业架构LNMP学习笔记44

小工具&#xff1a; memcached_tool.php软件&#xff0c;可以查看memcached运行状态、key&#xff08;item&#xff09;的数量、内存使用量等。 1&#xff09;上传memcached_tool.php到web服务器上&#xff1a; 上传到虚拟机主机可以访问的目录即可。需要php的运行环境&…

C语言——指针进阶(三)

目录 一.前言摘要 二.排序函数qsort的模拟实现 三.指针和数组笔试题解析 一.前言摘要 讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现&#xff08;可以排序任意类型变量&#xff09; 二.排序函数qsort的模拟实现 目标&#xff1a;…

如何选择适合企业的SQL开发工具

在当今数字化时代&#xff0c;数据是企业的核心资产之一。随着数据规模和数据类型的不断增长&#xff0c;数据库管理变得愈发复杂和关键。许多企业用户在数据库管理方面都面临着一系列难题&#xff1a; 核心数据库被随意变更&#xff1a;核心库的波动通常会对企业核心业务产生重…

还没用熟 TypeScript 社区已经开始抛弃了

根据 rich-harris-talks-sveltekit-and-whats-next-for-svelte 这篇文章的报道&#xff0c; Svelte 计划要把代码从 TS 换到 JS 了。 The team is switching the underlying code from TypeScript to JavaScript. That and the update will then allow the team to incorporate…

Enhancer-轻量化的字节码增强组件包

一、问题描述 当我们的业务发展到一定阶段的时候&#xff0c;系统的复杂度往往会非常高&#xff0c;不再是一个简单的单体应用所能够承载的&#xff0c;随之而来的是系统架构的不断升级与演变。一般对于大型的To C的互联网企业来说&#xff0c;整个系统都是构建于微服务的架构…

金和OA GetSqlData.aspx 远程命令执行漏洞

一、漏洞简介 金和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,涉及的企业管理业务包括协同办公管理、人力资源管理、项目管理、客户关系管理、企业目标管理、费用管理等多个业务范围,从功能型的协同办公平台上升到管理型协同管理平台,并不断的更新完善…

一款自定义软件开发平台源码 支持企业应用的专业低代码开发

低代码PaaS平台源码 采用对象方式实现字段、API的字段类型&#xff0c;引入RPA实现表自动化建模&#xff1b;再使用选择方式对地段功能进行选择定义甚至可以插入代码进行自定义。 数字化转型的迫切需求 随着数字科技的发展&#xff0c;各行各业对于新技术解决方案的需求也在逐…

小节8:Python之文件操作

1、文件在哪里&#xff1f; 如果用代码对文件进行操作&#xff0c;需要先找到那个文件 MacOS/Linux&#xff1a;斜杠/ 表示根目录&#xff0c;一切的文件、目录都存放在根目录下面。 Windows系统&#xff1a;就不一样了&#xff0c;它每一个磁盘分区都有自己的根目录&#x…

算法:二分法---寻找H指数

1、题目&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff0…

港联证券:基本面分析的基本知识?

作为一种股票投资剖析办法&#xff0c;根本面剖析是用来研究一家公司在剖析期内的运营状况的一种办法&#xff0c;它重视公司的财政数据、盈余才能、市场占有率以及宏观经济要素等方面&#xff0c;为投资者供给了一个深化了解公司价值的方法。下面&#xff0c;本文将从多个视点…

C语言 —— 初步入门知识(第一个C语言程序、数据类型、变量常量、字符与注释)

本篇文章介绍C语言的基础知识&#xff0c;使读者对C语言能够有一个大概的认识. 不会细写每一个知识点, 但是能够入门C语言, 进行初步的C语言代码阅读. 首先, 什么是语言? 对于人和人之间进行交流的语言, 我们知道, 可以通过汉语, 英语, 日语等语言进行交流. 那么对于人和计算…

spring_注解笔记

spring使用注解开发 文章目录 1.前提1 Bean2 属性注入3 衍生的注解4.自动装配5 作用域 1.前提 步骤1&#xff1a; 要使用注解开发&#xff0c;就必须要保证AOP包的导入 步骤2&#xff1a; xml文件添加context约束 步骤3&#xff1a; 配置注解的支持 <context:annotation-…

【python零基础入门学习】python基础篇(基础结束篇)之数据结构类型-列表,元组,字典,集合(五)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

电商运营管理——商品活动

商品活动很大程度上决定了电商平台的用户活跃度&#xff0c;本篇文章将详细介绍商品活动的几大类目&#xff0c;并举例每一类的不同活动内容。希望本篇文章能对运营岗位的你有所帮助。 电商平台最重要的功能是运营管理&#xff0c;而运营管理中最重要的功能就是各种商品活动&am…

阿里巴巴国际数字商业24届校招大量hc,等你来拿~

阿里巴巴国际数字商业招人啦!!! 今年阿里lazada买家前端团队有大量hc, 同学们快冲啊!!! 除了前端岗,还有算法, 客户端等 图中的二维码为我的个人内推码, 直接扫码进去填写简历提交即可, 后续可以帮忙查看内推进度, 有什么疑问我会在线回复 职位要求 【必备项】 1、熟练使用各种…

程序员自由创业周记#11:商标

商标重要吗 为什么我那么重视App名字里要有一个自己的商标&#xff0c;主要防止的是被竞争对手抄袭&#xff0c;甚至连名字也起同样的&#xff0c;如果没有商标&#xff0c;很难维权&#xff0c;只能放任自由。在上上家公司&#xff0c;我们的产品起了一个与别人重复的名字&am…

MATLAB中findpeaks函数用法

目录 语法 说明 示例 在MATLAB中&#xff0c;findpeaks函数用于查找信号中的峰值&#xff08;peaks&#xff09;。以下是findpeaks函数的基本语法、说明以及示例&#xff1a; 语法 [pks,locs] findpeaks(x) [pks,locs] findpeaks(x, Name, Value)说明 参数说明 x&…

Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾

要说 的 Bug 集中地&#xff0c;当属资源管理器。 速度缓慢、卡顿、崩溃&#xff0c;不同设备、不同版本的用户都有不同的感受。 严格来说&#xff0c;这其实是 Windows 的传统艺能&#xff0c;要完美修复可不容易。 而作为小老弟的文件资源管理器&#xff0c;时不时来个无响…

web技术——HTML文档基础部分(1)

文章目录 前言壹、基本语法1.1 含义1.2 注释1.3 HTML文档的标准结构 贰、基本的文本标记2.1 段落2.2 保留空白字符2.3 标题2.4 水平线 前言 HTML是一种标记语言,这意味着它用来标记文档中的各个部分&#xff0c;已指定文档在打印件或者显示器上的显示方式。简单来说&#xff0…