首页 > 其他分享 >使用自定义数据训练 YOLOv10

使用自定义数据训练 YOLOv10

时间:2024-06-04 23:01:37浏览次数:28  
标签:定义数据 训练 卷积 模型 weights YOLOv10 HOME

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

合集:

持续火爆!!!《AIGC 面试宝典》已圈粉无数!


在计算机视觉快速发展的世界中,YOLO(You Only Look Once)系列在实时目标检测方面一直设定了基准。最新版本YOLOv10有望进一步突破这些界限。在这篇博客文章中,我们将探讨YOLOv10的架构,重点介绍其主要特性,讨论它如何优于其前辈,并在自定义数据集上进行训练。

介绍

YOLOv10在其前代基础上进行改进,解决了后处理和模型架构中的局限性。其主要目标是提高性能和效率,使YOLOv10成为实时端到端目标检测的最先进模型。

YOLOv10提供了一系列模型规模,确保用户可以根据具体应用需求选择最佳模型。这种灵活性允许更好地适应各种现实世界场景,从移动应用的轻量级模型到高性能任务的大型模型。YOLOv10模型有六种尺寸:

  • Nano (n): 230万参数

  • Small (s): 720万参数

  • Medium (m): 1540万参数

  • Big (b): 1910万参数

  • Large (l): 2440万参数

  • Extra Large (x): 2950万参数

架构概述

图片

主干网络(Backbone):

负责特征提取,YOLOv10的主干网络使用了增强版的CSPNet(跨阶段部分网络)。这种改进促进了更好的梯度流动,减少了计算冗余,使模型更高效。

颈部(Neck):

颈部组件聚合来自不同尺度的特征并传递给头部。它包括PAN(路径聚合网络)层,旨在进行有效的多尺度特征融合,确保来自各级的特征被有效地组合以实现更好的目标检测。

一致的双重分配用于无NMS训练:

传统YOLO模型依赖于非极大值抑制(NMS)进行后处理,这会增加推理延迟。YOLOv10采用了一致的双重分配策略,在推理过程中消除对NMS的需求。该模型在训练期间采用双标签分配:多对多用于丰富监督和一对一用于高效推理。该方法协调了监督,提升了性能而不增加推理负担。

整体效率驱动设计

图片

NMS-Free训练:

传统目标检测模型通常使用NMS去除重复的边界框,但这在检测框较多时计算代价高昂。YOLOv10通过训练模型自然避免为同一对象生成多个边界框来解决这个问题。通过一致的双重分配,确保每个对象在训练和推理过程中都被分配到一个唯一的边界框。

通过消除NMS后处理步骤,YOLOv10显著减少了推理延迟、计算成本和推理时间,同时通过确保每个对象由单个高质量的边界框表示来提高准确性。

轻量级分类头:

分类头是神经网络中的最后一层,负责为检测到的对象分配标签。YOLOv10引入了设计高效的轻量级分类头,同时不牺牲准确性。通过减少分类头中的参数和操作数来实现这一点。通过简化分类头降低计算负担,同时保持性能。

空间-通道解耦下采样:

下采样在减少特征图空间维度的同时增加通道维度。使用步幅为二的3x3卷积是一种计算开销高的方法。YOLOv10通过将空间和通道操作分离来改进这一点。逐点卷积调整通道维度而不改变空间维度,深度卷积则在保持调整后的通道维度的同时减少空间维度。这种空间降维和通道变换的解耦,减少了计算成本并最大限度地保留信息。

排名引导的模块设计:

先前的YOLO模型在所有阶段都使用相同的基本构建模块,导致效率低下。YOLOv10引入了排名引导的模块设计,识别出冗余较高的阶段,降低复杂度,并用更紧凑的倒置模块(CIB)替换它们,有效去除不必要的信息并提升效率。通过内在秩分析优化不同阶段的复杂性,提高效率而不牺牲准确性。

整体准确性驱动设计

为了以最小的计算成本提升YOLOv10的性能,引入了两个关键特性:大核卷积和部分自注意力(PSA)。

大核卷积:

大核卷积扩展了感受野,增强了模型能力,特别是对于较大的对象。然而,普遍使用它们会稀释小对象的细节并增加延迟。YOLOv10通过以下方式解决了这一问题:

  • 选择性应用:仅在深层阶段使用7×7深度卷积。

  • 结构重参数化:在训练期间添加额外的3×3深度卷积分支以帮助优化,合并时不增加推理负担。

  • 模型尺度适应:主要在较小模型尺度中使用大核,以避免模型尺寸增加时的收益递减。

部分自注意力(PSA):

自注意力在全局特征建模中表现出色,但计算开销大。YOLOv10通过PSA优化这一点:

  • 特征划分:在1×1卷积后分割通道。

  • 选择性处理:仅对分割特征的一部分应用自注意力。

  • 高效融合:通过另一个1×1卷积重新组合特征。

  • 维度缩减:在MHSA中将查询和键维度减少到值的一半。

  • 优化放置:仅在第4阶段之后使用PSA,最小化计算负担。

关键亮点和改进

图片

提升的效率:

YOLOv10的架构改进在各个模型规模上显著减少了参数、FLOPs(浮点运算次数)和延迟。例如,YOLOv10-S的速度是RT-DETR-R18的1.8倍,平均精度(AP)相似,而YOLOv10-B的延迟减少了46%,参数减少了25%。

卓越的准确性:

模型在不同基准测试中实现了最先进的性能,相比之前的YOLO版本有显著提升。YOLOv10-L在参数减少1.8倍的情况下,AP比YOLOv8-L高出0.3,展示了高效的参数利用。

性能:

速度:YOLOv10以惊人的速度处理图像,每张图像在分辨率为(1, 3, 384, 640)时,预处理耗时2.0ms,推理耗时13.4ms,后处理耗时1.3ms。这种快速的处理时间使YOLOv10非常适合需要快速准确目标检测的应用,同时保持高准确性。最小尺寸的模型每张图像处理仅需1毫秒(1000fps),使其成为边缘设备上实时视频处理的理想选择。在CPU上具有高速度!

入门

要在自定义数据集上训练YOLOv10,需遵循以下步骤:

  • 环境设置

  • 下载YOLOv10预训练模型权重

  • 安装Supervision和Ultralytics包

  • 从Roboflow下载数据集并训练模型

  • 可视化和分析

  • 获取检测结果

环境设置

需要一个Google账户来访问Google Colab,这是一项免费的云服务,提供深度学习任务所需的计算资源,包括最高16 GB的GPU和TPU。

检查GPU状态

首先,确保GPU的可用性和准备状态以处理和运行YOLOv10模型。

nvidia-smi

图片

挂载Google Drive

接下来,需要导航到存储数据集的文件夹,如果已经下载了数据集,或者可以直接使用Roboflow加载数据集。

from google.colab import drive
drive.mount('/content/drive')

显示当前目录

将当前工作目录的路径存储在HOME变量中以供参考。

import os
HOME = os.getcwd()
print(HOME)

安装YOLOv10和Supervision依赖

为了设置运行YOLOv10模型的环境,需要安装supervision库并克隆YOLOv10仓库。这些安装对于确保模型正常运行所需的所有工具和库非常重要。

!pip install -q supervision
!pip install -q git+https://github.com/THU-MIG/yolov10.git

下载YOLOv10预训练权重

这一步包括创建一个目录用于存储模型权重,并下载不同尺寸YOLOv10模型的预训练权重。这些权重对于初始化模型至关重要,可用于推理和微调。

!mkdir -p {HOME}/weights
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10n.pt
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10s.pt
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10m.pt
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10b.pt
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10x.pt
!wget -P {HOME}/weights -q https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10l.pt
!ls -lh {HOME}/weights

使用预训练权重加载YOLOv10模型

在这一步中,我们使用之前下载的预训练权重加载YOLOv10模型。这使我们能够利用预训练模型进行推理或进一步训练。此过程由ultralytics库提供支持。

from ultralytics import YOLOv10
model = YOLOv10(f'{HOME}/weights/yolov10n.pt')

使用YOLOv10进行推理并注释图像

此步骤演示了如何使用YOLOv10模型对输入图像进行推理。然后处理结果以提取检测信息,用于在图像上添加边界框和标签。supervision库有助于处理注释并显示结果。

import cv2
import supervision as sv
from ultralytics import YOLOv10

model = YOLOv10(f'{HOME}/weights/yolov10n.pt')
image = cv2.imread(f'{HOME}/data/dog.jpeg')
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)

bounding_box_annotator = sv.BoundingBoxAnnotator()
label_annotator = sv.LabelAnnotator()

annotated_image = bounding_box_annotator.annotate(
    scene=image, detections=detections)
annotated_image = label_annotator.annotate(
    scene=annotated_image, detections=detections)

sv.plot_image(annotated_image)

使用Roboflow下载和准备数据集

此步骤设置数据集准备环境。它创建数据集目录,安装Roboflow库,并使用它下载YOLOv10的特定数据集。该数据集将用于训练和评估。项目使用了来自Roboflow的RF100 Vehicles Road-Traffic-4数据集。

!mkdir {HOME}/datasets
%cd {HOME}/datasets

!pip install -q roboflow

from google.colab import userdata
from roboflow import Roboflow


rf = Roboflow(api_key="YOUR API KEY")
project = rf.workspace("roboflow-100").project("road-traffic")
version = project.version(4)
dataset = version.download("yolov8")

在自定义数据集上训练YOLOv10模型

此步骤启动使用从Roboflow下载的自定义数据集训练YOLOv10模型。模型在指定数量的周期内以给定的批量大小进行训练。

%cd {HOME}

!yolo task=detect mode=train epochs=25 batch=32 plots=True \
model={HOME}/weights/yolov10n.pt \
data = /content/datasets/road-traffic-4/data.yaml

显示YOLOv10训练的混淆矩阵

在训练YOLOv10模型后,评估其性能非常重要。此步骤显示训练过程中生成的混淆矩阵。混淆矩阵有助于通过展示模型预测的准确性来可视化其性能。

%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train/confusion_matrix_normalized.png', width=600)

图片

显示YOLOv10训练结果

此步骤显示YOLOv10训练过程生成的训练结果图像。该图像提供了模型性能指标和训练进展的摘要,有助于可视化训练效果。

%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train10/results.png', width=600)

图片

显示YOLOv10训练的验证预测

此步骤显示来自验证集的图像,帮助可视化YOLOv10模型在验证数据上的表现。

%cd {HOME}
Image(filename=f'{HOME}/runs/detect/train10/val_batch0_pred.jpg', width=600)

图片

结论

希望本指南能提供对YOLOv10架构、其创新特性以及在自定义数据集上训练过程的全面概述。通过利用Roboflow的道路交通数据集,我们演示了如何使YOLOv10进行高级目标检测任务。本文旨在突出YOLOv10在实际场景中的应用和潜力。

标签:定义数据,训练,卷积,模型,weights,YOLOv10,HOME
From: https://blog.csdn.net/2401_84033492/article/details/139455494

相关文章

  • 代码随想录算法训练营第四天 |节点交换、删除倒数n个节点、交叉链表、环形链表
    24题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/24题代码随想录讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#思路19题链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/19题代码随想录:https://programmerca......
  • 使用yolov10源码对图片进行目标检测的步骤讲解(windows环境、PyCharm软件、预测阶段)
            本文只讲解yolov10的预测阶段,即如何使用代码调用yolov10模型,对图片进行目标检测,并不涉及训练、验证等阶段。步骤:一、下载yolov10源码        1、打开源码地址。yolov10源码链接:https://github.com/THU-MIG/yolov10    注意:如果网页加载不......
  • acwing329 围栏障碍训练场 题解
    考试压轴题,意识到这题是线段树优化\(dp\)时追悔莫及。为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。想到设\(dp_{i,j}\)表示在第\(i\)层,奶牛们在\(j\)列时的最小移动范围,则转移方程为(设输入为\(l,r\)):\[\begin{cases}dp_{i,j}=dp_{......
  • 代码随想录算法训练营day14(二叉树)
    代码随想录算法训练营day14(二叉树):学习内容:今天学习二叉树。二叉树节点标准写法(当前节点值,左右子节点,有点像链表节点的定义):structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};二......
  • 代码随想录算法训练营第四十六天|动态规划:完全背包理论基础、518.零钱兑换II、377. 组
    动态规划:完全背包理论基础文档讲解:代码随想录题目链接:52.携带研究材料(第七期模拟笔试)完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总......
  • 代码随想录算法训练营第四十九天| 139.单词拆分、多重背包
    139.单词拆分文档讲解:代码随想录题目链接:.-力扣(LeetCode)第一想法: 非空字符串s:背包非空单词的列表wordDict:物品每个物品可以使用多次,是一个完全背包问题看到这道题目的时候,大家应该回想起我们之前讲解回溯法专题的时候,讲过的一道题目回溯算法:分割回文串 (opens......
  • 代码随想录算法训练营第四十八天| 70. 爬楼梯(进阶版)、322. 零钱兑换、 279.完全平方数
     70.爬楼梯(进阶版)文档讲解:代码随想录题目链接:57.爬楼梯(第八期模拟笔试)我们之前做的爬楼梯是只能至多爬两个台阶。这次改为:一步一个台阶,两个台阶,三个台阶,.......,直到m个台阶。问有多少种不同的方法可以爬到楼顶呢?这又有难度了,这其实是一个完全背包问题。1阶,2阶,.........
  • 【C语言训练题库】扫雷->简单小游戏!
     ......
  • 正念冥想经典训练法-觉察想法
    觉察想法可以让我与我的想法之间保持一些距离。--比尔盖茨觉察想法练习是正念冥想中经典的训练方法之一。比尔盖茨也比较喜欢的这个冥想练习,他说觉察想法可以帮他与他的想法之间保持一些距离。觉察想法想法那么多,如何不要被想法绑架?我们的大......
  • 【TPAMI-2024】EfficientTrain++帮你降低网络训练的成本
    写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除!文章目录前言论文更容易学习的模式:频域易于学习的模式:空间域统一的训练课程EFFICIENTTRAIN++计算约束的顺序搜索高效低频下采样EfficientTrain++的实现技术实验......