Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Yolov8网络进行目标检测(二)-安装和自定义数据集

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

作者头像
python与大数据分析
发布于 2023-09-18 07:02:24
发布于 2023-09-18 07:02:24
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

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

1、安装pytorch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

2、安装ultralytics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install  ultralytics

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

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

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

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

CLI方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
  1. <PycharmProjectsROOT>\<ProjectName>\venv\Lib\site-packages\ultralytics>
  2. ├─assets
  3. ├─cfg
  4. ├─datasets
  5. ├─models
  6. ├─rt-detr
  7. ├─v3
  8. ├─v5
  9. ├─v6
  10. └─v8

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

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

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

数据集配置文件还内置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)信息,即下载脚本和路径,这个是可选项 。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
  1. └─datasets
  2. ├─coco128
  3. ├─images
  4. └─train2017
  5. └─labels
  6. └─train2017
  7. └─VOC2012
  8. ├─images
  9. └─train
  10. └─labels
  11. └─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数据集的目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
└─VOCdevkit
 
 └─VOC2012
 
 ├─Annotations
 
 ├─ImageSets
 
 │ ├─Action
 
 │ ├─Layout
 
 │ ├─Main
 
 │ └─Segmentation
 
 ├─JPEGImages
 
 ├─SegmentationClass
 
 └─SegmentationObject

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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保持一致,否则会出现标签名称不对应的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-15 00:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Yolov8网络进行目标检测(三)-训练自己的数据集
前一篇文章详细了讲解了如何构造自己的数据集,以及如何修改模型配置文件和数据集配置文件,本篇主要是如何训练自己的数据集,并且如何验证。
python与大数据分析
2023/09/18
2.6K0
基于Yolov8网络进行目标检测(三)-训练自己的数据集
基于YOLOv8的遥感SAR舰船小目标识别
本文摘要:基于YOLOv8的遥感SAR舰船小目标,阐述了整个数据制作和训练可视化过程
AI小怪兽
2024/01/12
1.4K2
基于YOLOv8的摄像头下铁路工人安全作业检测(工人、反光背心和安全帽)系统
💡💡💡本文摘要:基于YOLOv8的铁路工人安全作业检测系统,属于小目标检测范畴,并阐述了整个数据制作和训练可视化过程​
AI小怪兽
2024/04/15
8400
【目标检测数据集】一、PASCAL VOC数据集简介
PASCAL VOC数据集是目标检测领域比较知名的数据集,该数据集分为VOC2007和VOC2012两个子集,其官方下载地址如下:
AI那点小事
2022/01/21
4.6K0
【目标检测数据集】一、PASCAL VOC数据集简介
Labelme 数据集转换和基于 DAMODEL 的 YOLOv8 模型训练指南
本教程介绍了如何将 Labelme 数据集转换为 YOLOv8 格式,并在 DAMODEL 平台上进行模型训练。
Skrrapper
2024/09/25
4970
Labelme 数据集转换和基于 DAMODEL 的 YOLOv8 模型训练指南
PyTorch版YOLOv4更新了,不仅适用于自定义数据集,还集成了注意力和MobileNet
从今年4月YOLOv4发布后,对于这个目标检测框架,问的最多的问题或许就是:「有没有同学复现YOLOv4的, 可以交流一下么」。由于原版YOLO使用C语言进行编程,光凭这一点就让不少同学望而却步。网上有很多基于TF/Keras和Caffe等的复现版本,但不少项目只给了代码,并没有给出模型在COCO、PASCAL VOC数据集上的训练结果。
计算机视觉研究院
2020/10/19
6580
PyTorch版YOLOv4更新了,不仅适用于自定义数据集,还集成了注意力和MobileNet
手把手入门教程:YOLOv8如何训练自己的数据集,交通信号灯识别
Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的(SOTA)模型,它建立在先前YOLO成功基础上,并引入了新功能和改进,以进一步提升性能和灵活性。它可以在大型数据集上进行训练,并且能够在各种硬件平台上运行,从CPU到GPU。
AI小怪兽
2023/11/03
7.3K0
手把手教你实现基于丹摩智算的YoloV8自定义数据集的训练、测试
DAMODEL(丹摩智算)是专为AI打造的智算云,致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。
AI浩
2024/10/22
2340
手把手教你实现基于丹摩智算的YoloV8自定义数据集的训练、测试
【pytorch-ssd目标检测】制作类似pascal voc格式的目标检测数据集
pascal voc或yolo格式的数据可以使用labelimg进行标注:下载地址:
西西嘛呦
2020/08/26
9180
【pytorch-ssd目标检测】制作类似pascal voc格式的目标检测数据集
目标检测 | 常用数据集标注格式及生成脚本
目标检测是计算机视觉任务中的一个重要研究方向,其用于解决对数码图像中特定种类的可视目标实例的检测问题。目标检测作为计算机视觉的根本性问题之一,是其他诸多计算机视觉任务,例如图像描述生成,实例分割和目标跟踪的基础以及前提。而在解决此类问题时,我们常常需要使用自己的脚本或者利用标注工具生成数据集,数据集格式往往会多种多样,因此对于目标检测任务而言,为了更好地兼容训练,大多数目标检测模型框架会默认支持几种常用的数据集标注格式,常见的分别是COCO,Pascal VOC,YOLO等等。本文主要介绍上述几种数据集格式以及我写的Python脚本(一般需要根据实际情况再改改)。
Justlovesmile
2021/12/14
5K0
目标检测 | 常用数据集标注格式及生成脚本
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
2020年6月10日,Ultralytics在github上正式发布了YOLOv5。YOLO系列可以说是单机目标检测框架中的潮流前线了,YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s(最小)、YOLOv5m、YOLOv5l、YOLOv5x(最大)。目前v6.0版本又新增一层YOLOv5n模型,代替YOLOv5s成为最小模型,在所有模型中速度更快但精度也更低。
全栈程序员站长
2022/07/01
5.1K0
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
pascal voc数据集下载_目标检测分类
VOC2007 train_val_test & VOC2012 train_val 百度云下载链接,提取码: jz27
全栈程序员站长
2022/11/09
1.9K0
pascal voc数据集下载_目标检测分类
yolov8训练自定义目标检测模型
首先得准备好数据集,你的数据集至少包含images和labels,严格来说你的images应该包含训练集train、验证集val和测试集test,不过为了简单说明使用步骤,其中test可以不要,val和train可以用同一个,因此我这里只用了一个images
叶茂林
2023/10/19
1.9K0
yolov8训练自定义目标检测模型
从零开始带你一步一步使用YOLOv3训练自己的数据
YOLOv3是比较常见和常用的深度学习目标检测(Object Dection)算法。今天给大家介绍一下如何一步一步使用YOLOv3训练自己的数据集。
红色石头
2022/01/10
2.5K1
从零开始带你一步一步使用YOLOv3训练自己的数据
基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)
💡💡💡本文主要内容:详细介绍了摄像头下吸烟行为检测系统,在介绍算法原理的同时,给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别,可进行置信度、Iou阈值设定,结果可视化等。
AI小怪兽
2024/01/29
1.6K5
【目标检测】SSD目标检测
场景文字识别 目标检测任务的目标是给定一张图像或是视频帧,让计算机找出其中所有目标的位置,并给出每个目标的具体类别。对于人类来说,目标检测是一个非常简单的任务。然而,计算机能够“看到”的仅有一些值为0 ~ 255的矩阵,很难解图像或是视频帧中出现了人或是物体这样的高层语义概念,也就更加难以定位目标出现在图像中哪个区域。与此同时,由于目标会出现在图像或是视频帧中的任何位置,目标的形态千变万化,图像或是视频帧的背景千差万别,诸多因素都使得目标检测对计算机来说是一个具有挑战性的问题。 【目标检测】 SSD目标
用户1386409
2018/04/02
4.4K1
【目标检测】SSD目标检测
《我的PaddlePaddle学习之路》笔记九——使用VOC数据集的实现目标检测
目标检测的使用范围很广,比如我们使用相机拍照时,要正确检测人脸的位置,从而做进一步处理,比如美颜等等。在目标检测的深度学习领域上,从2014年到2016年,先后出现了R-CNN,Fast R-CNN, Faster R-CNN, ION, HyperNet, SDP-CRC, YOLO,G-CNN, SSD等神经网络模型,使得目标检测不管是在准确度上,还是速度上都有很大提高,几乎可以达到实时检测。
夜雨飘零
2020/05/06
1.2K0
《我的PaddlePaddle学习之路》笔记九——使用VOC数据集的实现目标检测
YOLOv9如何训练自己的数据集(NEU-DET为案列)
💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!
AI小怪兽
2024/03/26
1.1K0
YOLOV3目标检测模型训练实例
从零开始学习使用keras-yolov3进行图片的目标检测,比较详细地记录了准备以及训练过程,提供一个信号灯的目标检测模型训练实例,并提供相关代码与训练集。
WindRunnerMax
2020/08/27
1.2K0
YOLOV3目标检测模型训练实例
paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
(1)进入到https://aistudio.baidu.com/aistudio/projectoverview/public
西西嘛呦
2020/08/26
7890
paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
推荐阅读
相关推荐
基于Yolov8网络进行目标检测(三)-训练自己的数据集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验