节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。
针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
合集:
在计算机视觉快速发展的世界中,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