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

关于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/widthnorm_y=(ymin + ymax)/2/heightnorm_w=(xmax - xmin)/widthnorm_h=(ymax - ymin)/heightYOLO->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 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn 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 标注框类别 labelclass2、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').textif cls not in classes or int(difficult) == 1:continue# 将标注类别按照classes列表信息转换为索引IDclsId = 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 = widthif ymax > height:ymax = heightbox = (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)的图片IDimageIds = 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.hqwc.cn/news/109116.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis集群架构详解

一、集群架构搭建 1、配置 在一台机器上模拟多台机器搭建redis集群&#xff0c;一个集群代表一台物理机 集群1路径&#xff1a; /usr/local/redis/redis-cluster/cluster1/9001/redis.conf/usr/local/redis/redis-cluster/cluster1/9004/redis.conf/usr/local/redis/redis-…

CSS元素浮动

概述 浮动简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff0c;默认宽与高都是被内容撑开的&#xff08;尽可能小&#xff09;&am…

FirmAFL

FirmAFL使用并改进了Firmdyne模拟方式&#xff0c;并利用AFL对IoT固件实施高通量灰盒Fuzzing。 一、项目简介 FIRM-AFL 是 第一个针对物联网固件的高吞吐量灰盒模糊测试器。 支持mipsel、mipseb和armel三种CPU架构 &#xff0c;涵盖Firmadyne数据库中90.2%的固件。 FIRM-AFL 解…

celery app control inspect python后台控制

i tasks.app.control.inspect() # 创建inspect对象&#xff0c;可以操作tasks的队列管理 i.active(safeNone) # Return list of tasks currently executed by workers. i.reserved(safeNone) # Return list of currently reserved tasks, not including scheduled/active c…

基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. Face.APl调用1&#xff09;Face.APl介绍2&#xff09;调用API 2. 数据爬取1&#xff09;网络数据爬取步骤2&#xff09;爬虫实现 3. 模型构建4. 用户界面设计1&#xff09;需要调用的库文…

第2章_瑞萨MCU零基础入门系列教程之面向过程与面向对象

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

python 使用requests爬取百度图片并显示

爬取百度图片并显示 引言一、图片显示二、代码详解2.1 得到网页内容2.2 提取图片url2.3 图片显示 三、完整代码 引言 爬虫&#xff08;Spider&#xff09;&#xff0c;又称网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;是一种自动化程序&#xff0c;可以自动地浏览…

从0开始实现简易版vue2

文章目录 前言原理思路分析实现Observer实现Watcher实现Compile 前言 Vue.js的双向绑定原理是其最重要的特性之一&#xff0c;它使得数据模型和DOM之间的同步变得非常简单和高效。 先上个成果图来吸引各位&#xff1a; new SimpleVue({el: #app,data: {title: SimpleVue,name…

【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...

全文下载链接&#xff1a;http://tecdat.cn/?p23544 在本文中&#xff0c;长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络&#xff0c;能够学习长期依赖关系&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 本文使用降雨量数据&#xf…

ueditor百度富文本编辑器粘贴后html丢失class和style样式

问题 项目经理从123在线编辑上排版好的文章&#xff0c;粘贴到项目的编辑器上&#xff0c;样式完全乱了, 排版是这样的&#xff1a; 复制到ueditor后的格式&#xff1a; 这天差地别呀&#xff0c;于是打开代码模式&#xff0c;发现section的属性全没了 但是&#xff0c;sp…

Ubuntu22.04配置WiFi

Ubuntu22.04配置WiFi 注意&#xff1a;在/etc/netplan/​下的配置文件&#xff0c;格式一定要正确&#xff0c;否则用sudo netplan try​的时候会报错 一、查看无线网卡的名称 //choice-1 ls /sys/class/net//choice-2 ip a//choice-3 ifconfig -a‍ 二、修改配置文件 文件…

【Linux学习笔记】 - 常用指令学习及其验证(上)

前言&#xff1a;本文主要记录对Linux常用指令的使用验证。环境为阿里云服务器CentOS 7.9。关于环境如何搭建等问题&#xff0c;大家可到同平台等各大资源网进行搜索学习&#xff0c;本文不再赘述。 由于本人对Linux学习程度尚且较浅&#xff0c;本文仅介绍验证常用指令的常用…