YOLOv10解析

yolov--10--目标检测模型的参数评估指标详解、概念解析 Yolov-1-TX2上用YOLOv3训练自己数据集的流程(VOC2007-TX2-GPU) Yolov--2--一文全面了解深度学习性能优化加速引擎---TensorRT Yolov--3--TensorRT中yolov3性能优化加速(基于caffe) yolov-5-目标检测:YOLOv2算法原理详解 yolov--8--Tensorflow实现YOLO v3 yolov--9--Y... 阅读详情

参考博文:

1、https://blog.youkuaiyun.com/m0_61356167/article/details/142092402

2、https://cloud.tencent.com/developer/article/2426044

3、https://blog.youkuaiyun.com/gitblog_00016/article/details/151286753

4、https://zhuanlan.zhihu.com/p/703887701(画的图特别好)

论文: https://arxiv.org/pdf/2405.14458

代码: GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection

1.概述

YOLOv10 是由清华大学研究团队于2024年在 YOLOv9 之后推出的最新实时目标检测模型。它并非YOLO官方团队(Ultralytics)的发布,但在设计和理念上带来了多项重要改进,旨在不增加推理成本的情况下提升性能。

以下是YOLOv10的整体架构图:

2.改进之处

2.1 核心架构改进:消除后处理瓶颈

YOLOv10 的一个革命性改进是无需非极大值抑制(NMS)。传统的 YOLO 模型在推理时需要依赖 NMS 来去除冗余的检测框,但这带来了额外的计算开销和延迟。

YOLOv10 通过两种策略解决了这个问题:

  1. 一致性双重分配训练

    • 问题:传统YOLO在训练时,一个目标通常分配给一个Anchor进行正样本学习,但在推理时,NMS却要处理多个Anchor预测的同一个目标,造成了训练和推理的不一致。

    • 解决方案:YOLOv10 在训练阶段,同时使用一对一(每个目标只匹配一个最佳Anchor)和一对多(每个目标匹配多个Anchor)两种标签分配策略。

    • 好处:

      • 一对一分支:学习做出果断、精确的预测,直接用于推理,从而摆脱对NMS的依赖。

      • 一对多分支:提供丰富的监督信号,帮助模型学习更全面的特征,提升性能。

    • 结果:在推理时,只需使用“一对一”分支,即可获得高质量、无冗余的预测框,实现了端到端的实时目标检测,显著降低了延迟。

  2. ** holistic(整体)模型设计**对模型的各个组件进行了效率和精度的整体优化:

    • 轻量级分类头:发现分类分支的计算成本远高于回归分支。因此,YOLOv10 使用了更浅、更窄的分类头,在几乎不影响精度的情况下减少了大量计算。

    • 空间-通道解耦下采样:传统下采样(如卷积)会同时压缩空间维度和变换通道维度,容易导致信息丢失。YOLOv10 将这个过程解耦,先进行点式卷积保持通道数并进行空间下采样,再用 1x1 卷积进行通道变换,更好地保留了信息。

    • 等级引导块设计:在构建特征金字塔网络时,不是简单地将不同尺度的特征图相加,而是引入了一种更精细的机制,根据输入特征的等级(信息层次) 来引导融合,提升了多尺度特征的表示能力。


2.2 增强特征集成与模型缩放

  1. 大核卷积

    • 在主干网络的深层,使用了 7x7 的大核深度卷积。

    • 好处:扩大了感受野,能更好地捕捉图像中更大范围的上下文信息,这对于检测大型物体尤其有利,同时保持了深度卷积的计算效率。

  2. 部分自注意力模块

    • 在 backbone 的末端引入了 PSA 模块。

    • 好处:自注意力机制能有效建模全局依赖关系,但计算量巨大。YOLOv10 巧妙地将其放在深层且经过下采样的特征图上,并采用部分机制,在引入全局信息的同时,控制了计算成本,提升了模型对复杂场景和物体关系的理解能力。

  3. 先进的模型缩放策略

    • 基于 YOLOv9 的广义高效层聚合网络(GELAN),YOLOv10 提出了一种模型缩放策略,可以生成一系列不同尺寸的模型(N, S, M, B, L, X)。

    • 这种策略能够更均衡地调整模型的深度、宽度和比例,确保在参数量、计算量和精度之间达到最佳平衡。

2.3 总结与对比

改进方面传统 YOLO (如 v8)YOLOv10带来的好处
后处理依赖 NMSNMS-Free(端到端)降低延迟,简化部署
训练策略一对一 或 一对多一致性双重分配训练与推理一致,性能更优
分类头与回归头对称轻量级分类头减少计算量,提升效率
下采样标准卷积空间-通道解耦下采样保留更多信息,提升精度
特征融合常规FPN/PAN等级引导块设计更高效的多尺度特征融合
主干网络标准CSP/ELAN大核卷积 + 部分自注意力更大感受野,全局上下文建模
模型系列基于深度/宽度缩放先进的模型缩放不同尺寸模型性能更均衡

2.4 YOLOv10和YOLOv8结构比较图

注明:图片来自知乎 算法小乔 ,图画的真好

(1) YOLOv8网络结构

(2)YOLOv10网络结构

3.改进介绍

3.1C2fUIB介绍

1. C2fUIB只是用CIB结构替换了YOLOv8中 C2f的Bottleneck结构

2.CIB 则是将 Bottleneck 中的标准卷积用深度卷积加逐点卷积进行替换。

3x3卷积为深度卷积,1x1为逐点卷积

实现代码ultralytics/nn/modules/block.py

class CIB(nn.Module):
    """Standard bottleneck."""

    def __init__(self, c1, c2, shortcut=True, e=0.5, lk=False):
        """Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, and
        expansion.
        """
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = nn.Sequential(
            Conv(c1, c1, 3, g=c1),
            Conv(c1, 2 * c_, 1),
            Conv(2 * c_, 2 * c_, 3, g=2 * c_) if not lk else RepVGGDW(2 * c_),
            Conv(2 * c_, c2, 1),
            Conv(c2, c2, 3, g=c2),
        )

        self.add = shortcut and c1 == c2

    def forward(self, x):
        """'forward()' applies the YOLO FPN to input data."""
        return x + self.cv1(x) if self.add else self.cv1(x)

class C2fCIB(C2f):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, lk=False, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__(c1, c2, n, shortcut, g, e)
        self.m = nn.ModuleList(CIB(self.c, self.c, shortcut, e=1.0, lk=lk) for _ in range(n))
3.小模型例如yolov10n中,可以把CIB中第二个深层卷积来使用RepVGGDW代替,他有一个7*7和3*3卷积深度卷积,他可以扩大感受野,增强模型能力。
class RepVGGDW(torch.nn.Module):
    def __init__(self, ed) -> None:
        super().__init__()
        self.conv = Conv(ed, ed, 7, 1, 3, g=ed, act=False)
        self.conv1 = Conv(ed, ed, 3, 1, 1, g=ed, act=False)
        self.dim = ed
        self.act = nn.SiLU()
    
    def forward(self, x):
        return self.act(self.conv(x) + self.conv1(x))

3.2 PSA介绍(引入部分自注意力)

具体来说,在1×1卷积后将特征均匀地分为两部分,只将一部分输入到由多头自注意力模块(MHSA)和前馈网络(FFN)组成的NPSA块中。然后,两部分通过1×1卷积连接并融合。此外,遵循将查询和键的维度分配为值的一半,并用BatchNorm替换LayerNorm以实现快速推理。

      

PSA 简化版图示

论文中对这个模块并没有原理上的说明,主要是自注意力的开销比较大,所以设计了 PSA(Partial self-attention)对分辨率最低的特征的一半进行计算,将对于全局的学习能力以较小的计算成本融入 YOLO 中。

Attention 部分的具体计算方式结合下图查看:

实现代码ultralytics/nn/modules/block.py

class Attention(nn.Module):
    def __init__(self, dim, num_heads=8,
                 attn_ratio=0.5):
        super().__init__()
        self.num_heads = num_heads
        self.head_dim = dim // num_heads
        self.key_dim = int(self.head_dim * attn_ratio)
        self.scale = self.key_dim ** -0.5
        nh_kd = nh_kd = self.key_dim * num_heads
        h = dim + nh_kd * 2
        self.qkv = Conv(dim, h, 1, act=False)
        self.proj = Conv(dim, dim, 1, act=False)
        self.pe = Conv(dim, dim, 3, 1, g=dim, act=False)

    def forward(self, x):
        B, _, H, W = x.shape
        N = H * W
        qkv = self.qkv(x)
        q, k, v = qkv.view(B, self.num_heads, -1, N).split([self.key_dim, self.key_dim, self.head_dim], dim=2)

        attn = (
            (q.transpose(-2, -1) @ k) * self.scale
        )
        attn = attn.softmax(dim=-1)
        x = (v @ attn.transpose(-2, -1)).view(B, -1, H, W) + self.pe(v.reshape(B, -1, H, W))
        x = self.proj(x)
        return x

class PSA(nn.Module):

    def __init__(self, c1, c2, e=0.5):
        super().__init__()
        assert(c1 == c2)
        self.c = int(c1 * e)
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv(2 * self.c, c1, 1)
        
        self.attn = Attention(self.c, attn_ratio=0.5, num_heads=self.c // 64)
        self.ffn = nn.Sequential(
            Conv(self.c, self.c*2, 1),
            Conv(self.c*2, self.c, 1, act=False)
        )
        
    def forward(self, x):
        a, b = self.cv1(x).split((self.c, self.c), dim=1)
        b = b + self.attn(b)
        b = b + self.ffn(b)
        return self.cv2(torch.cat((a, b), 1))

3.3 SCDown(空间通道解耦下采样)

  • 与v8中的卷积不同,v8使用一个标准卷积同时实现空间下采样 h , w → h / 2 , w / 2 ,h,w→ h/2, w/2h,w→h/2,w/2 和通道变化 c → 2c ,计算成本高。
  • SCDown(Spatial-channel decoupled downsampling)将上面两个操作——空间和通道解耦。先通过 1 × 1 的逐点卷积调节通道数,再通过 3 × 3 的深度卷积做空间下采样,在降低计算成本的同时最大限度保留信息。

参数量和计算量计算过程:

v8:

使用一个标准卷积同时实现空间下采样 h , w → h / 2 , w / 2 ,h,w→ h/2, w/2h,w→h/2,w/2 和通道变化 c → 2c

v10:

SCDown:先通过 1 × 1 的逐点卷积调节通道数,再通过 3 × 3 的深度卷积做空间下采样,降低计算成本同时保持竞争力的性能:

总参数量:CBS+CB=2C^{2}+18C

总计算量:CBS+CB=2HWC^{2}+\frac{9}{2}*C*H*W

实现代码ultralytics/nn/modules/block.py

class SCDown(nn.Module):
    def __init__(self, c1, c2, k, s):
        super().__init__()
        self.cv1 = Conv(c1, c2, 1, 1)
        self.cv2 = Conv(c2, c2, k=k, s=s, g=c2, act=False)

    def forward(self, x):
        return self.cv2(self.cv1(x))

4.代码解析

4.1源码整体架构

YOLOv10作为一款实时端到端目标检测算法,其源码采用了模块化设计,结构清晰,易于扩展。以下是YOLOv10的整体架构图:

YOLOv10的源码主要包含以下几个核心目录:

目录名

主要功能

核心文件

ultralytics/models/yolov10

YOLOv10模型定义

model.py, train.py, predict.py

ultralytics/engine

训练、推理、验证等引擎

trainer.py, predictor.py, validator.py

ultralytics/data

数据加载与预处理

dataset.py, loaders.py, augment.py

ultralytics/nn

神经网络组件

layers.py, loss.py, activations.py

ultralytics/utils

工具函数

general.py, metrics.py, plotting.py

ultralytics/cfg

配置文件

default.yaml, models/

4.2 核心模块详细解析

1. 模型模块 (models/yolov10) 

该模块包含了YOLOv10模型的核心定义,是二次开发中最常需要修改的部分。

model.py
class YOLOv10:
    def __init__(self, model="yolov10n.pt", task=None, verbose=False, names=None):
        """初始化YOLOv10模型"""
        # 模型初始化代码
        
    def train(self, **kwargs):
        """训练模型"""
        # 训练逻辑代码
        
    def predict(self, source, **kwargs):
        """推理预测"""
        # 推理逻辑代码
        
    def val(self, **kwargs):
        """验证模型"""
        # 验证逻辑代码
        
    def export(self, **kwargs):
        """导出模型"""
        # 模型导出代码
train.py

该文件包含了YOLOv10的训练逻辑,关键函数有:

def get_validator(self):
    """获取验证器"""
    # 代码实现
    
def get_model(self, cfg=None, weights=None, verbose=True):
    """获取模型"""
    # 代码实现
predict.py

该文件包含了推理预测相关的代码,核心函数为:

def postprocess(self, preds, img, orig_imgs):
    """后处理预测结果"""
    # 代码实现
2. 引擎模块 (engine)

引擎模块是YOLOv10的核心驱动部分,负责协调各个组件完成训练、推理等任务。

trainer.py

训练引擎的核心类,负责整个训练过程的调度:

class Trainer:
    def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
        """初始化训练器"""
        # 初始化代码
        
    def train(self):
        """开始训练"""
        # 训练主逻辑
        
    def setup_model(self):
        """设置模型"""
        # 模型设置代码
        
    def get_dataloader(self, dataset_path, batch_size=16, rank=0, mode="train"):
        """获取数据加载器"""
        # 数据加载器代码
        
    def validate(self):
        """验证模型"""
        # 验证代码
predictor.py

推理预测引擎,负责处理输入数据并生成预测结果:

class Predictor:
    def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
        """初始化预测器"""
        # 初始化代码
        
    def preprocess(self, im):
        """预处理输入图像"""
        # 预处理代码
        
    def inference(self, im, *args, **kwargs):
        """执行推理"""
        # 推理代码
        
    def postprocess(self, preds, img, orig_imgs):
        """后处理预测结果"""
        # 后处理代码
validator.py

验证引擎,用于评估模型性能:

class Validator:
    def __init__(self, dataloader=None, save_dir=None, pbar=None, args=None, _callbacks=None):
        """初始化验证器"""
        # 初始化代码
        
    def __call__(self, trainer=None, model=None):
        """执行验证"""
        # 验证代码
        
    def update_metrics(self, preds, batch):
        """更新评估指标"""
        # 指标更新代码
        
    def finalize_metrics(self, *args, **kwargs):
        """最终化评估指标"""
        # 指标计算代码
3. 数据处理模块 (data)

数据处理模块负责数据的加载、增强和预处理,为模型训练和推理提供高质量的数据。

dataset.py

定义了数据集类,负责数据的加载和预处理:

class YOLODataset:
    def __init__(self, img_path, imgsz=640, cache=False, augment=True, hyp=DEFAULT_CFG, prefix="", rect=False, batch_size=16, stride=32, pad=0.5, single_cls=False, classes=None, fraction=1.0):
        """初始化数据集"""
        # 初始化代码
        
    def __getitem__(self, index):
        """获取数据项"""
        # 获取数据代码
        
    def __len__(self):
        """获取数据集大小"""
        # 返回数据集大小
augment.py

提供了丰富的数据增强方法:

class Albumentations:
    def __init__(self) -> None:
        """初始化数据增强器"""
        # 初始化代码
        
    def __call__(self, labels):
        """应用数据增强"""
        # 数据增强代码
        
class MixUp:
    def __init__(self, dataset, pre_transform=None, p=0.0) -> None:
        """初始化MixUp增强器"""
        # 初始化代码
        
    def __call__(self, labels):
        """应用MixUp增强"""
        # MixUp代码
4. 神经网络模块 (nn)

神经网络模块包含了YOLOv10的网络结构定义,包括各种层、块和损失函数。

blocks.py

定义了YOLOv10中使用的各种网络块:

class CSPDarknetBlock(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        """初始化CSPDarknet块"""
        # 初始化代码
        
    def forward(self, x):
        """前向传播"""
        # 前向传播代码
        
class SPPF(nn.Module):
    def __init__(self, c1, c2, k=5):
        """初始化SPPF块"""
        # 初始化代码
        
    def forward(self, x):
        """前向传播"""
        # 前向传播代码
head.py

定义了YOLOv10的检测头:

class Detect(nn.Module):
    def __init__(self, nc=80, ch=()):
        """初始化检测头"""
        # 初始化代码
        
    def forward(self, x):
        """前向传播"""
        # 前向传播代码
loss.py

定义了YOLOv10的损失函数:

class ComputeLoss:
    def __init__(self, model, tal_topk=10):
        """初始化损失计算器"""
        # 初始化代码
        
    def __call__(self, preds, batch):
        """计算损失"""
        # 损失计算代码
5. 工具函数模块 (utils)

工具函数模块提供了各种辅助功能,包括指标计算、可视化、文件操作等。

metrics.py

提供了各种评估指标的计算方法:

def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7):
    """计算边界框IOU"""
    # IOU计算代码
    
def ap_per_class(tp, conf, pred_cls, target_cls, plot=False, on_plot=None, save_dir=Path(), names=(), eps=1e-16, prefix=""):
    """计算每个类别的AP"""
    # AP计算代码
    plotting.py

    提供了可视化功能:

    def plot_images(images, batch_idx, cls, bboxes=np.zeros(0, dtype=np.float32), confs=None, masks=np.zeros(0, dtype=np.uint8), kpts=np.zeros((0, 51), dtype=np.float32), paths=None, fname="images.jpg", names=None, on_plot=None, max_subplots=16, save=True, conf_thres=0.25):
        """绘制图像及预测结果"""
        # 绘图代码
        
    def plot_results(file="path/to/results.csv", dir="", segment=False, pose=False, classify=False, on_plot=None):
        """绘制训练结果"""
        # 绘图代码

    4.3 核心模块交互流程

    训练流程

    推理流程

    5. 二次开发实战示例

    示例1:修改损失函数

    要修改YOLOv10的损失函数,可以按照以下步骤进行:

    1. 在ultralytics/nn/loss.py中定义新的损失类:

    class NewComputeLoss:
        def __init__(self, model):
            """初始化新的损失计算器"""
            # 初始化代码
            
        def __call__(self, preds, batch):
            """计算新的损失"""
            # 新的损失计算逻辑

    2.在训练器中使用新的损失函数:

    # 在trainer.py中
    from ultralytics.nn.loss import NewComputeLoss
     
    class Trainer:
        def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
            # ... 其他初始化代码
            self.loss_fn = NewComputeLoss(self.model)

    示例2:添加新的数据增强方法

    要添加新的数据增强方法,可以在ultralytics/data/augment.py中添加:

    class NewAugmentation:
        def __init__(self, p=0.5):
            """初始化新的数据增强器"""
            self.p = p
            
        def __call__(self, labels):
            """应用新的数据增强"""
            if random.random() < self.p:
                # 新的数据增强逻辑
            return labels

    然后在数据集类中使用新的增强方法:

    class YOLODataset:
        def __init__(self, img_path, imgsz=640, cache=False, augment=True, hyp=DEFAULT_CFG, prefix="", rect=False, batch_size=16, stride=32, pad=0.5, single_cls=False, classes=None, fraction=1.0):
            # ... 其他初始化代码
            self.augmentations = Albumentations()
            self.augmentations.append(NewAugmentation(p=0.5))

    常见二次开发场景及解决方案

    场景1:修改模型结构

    如果你想修改YOLOv10的网络结构,可以按照以下步骤进行:

    在ultralytics/nn/blocks.py中定义新的网络块
    在ultralytics/cfg/models/v10目录下修改对应的yaml配置文件
    在ultralytics/models/yolov10/model.py中加载新的配置文件

    场景2:添加新的评估指标

    如果你想添加新的评估指标,可以在ultralytics/utils/metrics.py中添加相应的计算函数,并在ultralytics/engine/validator.py的finalize_metrics方法中调用新的指标计算函数。

    场景3:自定义数据加载

    如果你需要加载自定义格式的数据,可以继承ultralytics/data/base.py中的BaseDataset类,并重写__getitem__方法。

    YOLOv10的网络架构解析 YOLOv10作为YOLO系列的最新成员,在网络架构、优化策略和数据增强等方面进行了全面改进。其NMS-free训练的一致双重分配策略、整体效率-准确性驱动的模型设计以及探索大核卷积和部分自注意力模块等技术亮点,使得YOLOv10在实时目标检测领域取得了显著进展 阅读详情

    相关推荐

    【win10-cpu-Yolov7】 windows10上YoloV7批量分析图片及常用参数解析

    yolov7基本参数

    GH51475720的博客 1211

    YOLO V10安装、使用、训练大全

    YoloV10

    青啊青斯博客 2万+

    YOLOv10通俗易懂!手把手教大家利用yolov10训练自己的数据集(环境搭建,YOLOv10网络结构解读 、yolov10.yaml配置文件详细解读与说明、模型训练参数详细解析)

    YOLOv10入门必看系列!弄懂YOLOv10模型,看这一篇文章就够了,通俗易懂! | 手把手教大家利用yolov10训练自己的数据集(环境搭建,YOLOv10网络结构解读 、yolov10.yaml配置文件详细解读与说明、模型训练参数详细解析)

    Ai缝合怪、助力小伙伴高效发论文 3万+

    Yolov10:详解、部署、应用一站式齐全!

    。点击蓝字关注我们关注并星标从此不迷路计算机视觉研究院公众号ID|计算机视觉研究院学习群|扫码在主页获取加入方式标题:YOLOv10: Real-Time End-to-End Object Detection论文:https://arxiv.org/pdf/2405.14458源码:https://github.com/THU-MIG/yolov10计算机视觉研究院专栏Column of Com...

    gzq0723的博客 9391

    YOLOv10 | 手把手教你利用yolov10训练自己数据集(含环境搭建、参数解析 、数据集查找、模型训练、推理、导出)

    本文内含YOLOv10网络结构图 + 各个创新模块手撕结构图 + 训练教程 + 推理教程 + 参数解析 + 环境搭建 + 数据集获取等一些有关YOLOv10的内容!目录一、前言二、整体网络结构图三、空间-通道分离下采样3.1 SCDown介绍3.2 C2fUIB介绍3.3 PSA介绍四、环境搭建五、数据集获取六、模型获取七、模型训练7.1 训练的三种方式7.1.1 方式一7.1.2 方式二(推荐)7.1.3 方式三八、模型验证/测试九、模型推理十、模型输出官方论文地址点击此处即可跳转。

    Snu77的博客 3万+

    YOLOv10 源码解析 (YOLOv10 Source Code Analysis)

    PyTorch 框架的灵活性和简洁性使得 YOLOv10 的代码相对易读。我们将从项目结构入手,逐步深入到模型构建、损失函数、数据处理以及训练和推理流程的关键代码模块。首先,让我们 YOLOv10 的官方仓库(假设其结构与 Ultralytics 的 YOLOv8 类似,因为它很可能基于此框架进行开发):Bash 打开项目目录,你通常会看到以下核心文件和文件夹: 核心关注点:我们将按照数据流和模型构建的顺序进行解析。YOLOv10 的模型定义通常位于 中,而组成模型的各种基础模块则在 中。 -

    u012133341的博客 1021

    YOLOv10 解析与地平线 征程 6 模型量化

    为了实现整体效率 - 准确率驱动的模型设计,研究团队从效率、准确率两方面分别提出改进方法。为了提高效率,该研究提出了轻量级分类 head、空间通道(spatial-channel)解耦下采样和排序指导的块设计,以减少明显的计算冗余并实现更高效的架构。为了提高准确率,研究团队探索了大核卷积并提出了有效的部分自注意力(partial self-attention,PSA)模块来增强模型能力,在低成本下挖掘性能改进的潜力。

    地平线开发者 1157

    YOLOv10 原理深入解析 (Deep Dive into YOLOv10 Principles)

    YOLOv10 的出现标志着 YOLO 系列在。

    u012133341的博客 977

    二次开发必备:YOLOv10源码结构解析

    你是否在二次开发YOLOv10时遇到过以下问题:想修改损失函数却找不到对应代码位置?优化模型结构时不知从何下手?本文将带你全面剖析YOLOv10的源码架构,掌握各模块的功能与交互逻辑,让你的二次开发之路不再迷茫。读完本文,你将能够: - 清晰理解YOLOv10的整体架构与模块划分 - 快速定位各功能模块的代码位置 - 掌握核心类与函数的使用方法 - 学会如何基于现有架构进行功能扩展 ## YO...

    gitblog_00016的博客 844

    微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

    本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

    j0k1l2m3n的博客 455

    七、永磁同步电机矢量控制(FOC)—MTPA控制及Simulink仿真

    前面几节的内容已经完成Id=0控制策略的理论和仿真以及双闭环PI参数整定。在接下来几节中,将陆续讲解MTPA、弱磁控制等内容。

    weixin_45182459的博客 8186

    YOLOv10代码路径说明:/root/yolov10目录结构解析

    本文介绍了基于星图GPU平台自动化部署YOLOv10官版镜像的完整流程,涵盖目录结构解析与核心功能应用。该镜像预置PyTorch与TensorRT环境,支持在星图GPU上快速实现模型微调、目标检测训练及端到端推理部署,适用于智能监控、工业质检等场景,显著提升AI开发效率。

    weixin_42466857的博客 339

    项目实训(四)——SAM模型的学习与部署

    这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。

    yyyyyyyx_的博客 1420

    YOLOv10 超详细解析 | 网络结构、训练策略、论文解读

    网络结构按 YOLOv10m 绘制,不同 scale 的模型在结构上略有不同,而不是像 YOLOv8 一样仅调整 depth 和 width。Head 有部分后续计算与 YOLOv8 完全相同,上图省略,具体请看。YOLOv10 整体的网络结构与 YOLOv8 相同,在一些细节模块上有所改进,查看具体的模块计算方式、优化策略跳转部分。

    秋山丶雪绪的博客 3万+

    OnlyOffice Docker部署踩坑实录:解决Nginx反向代理导致的editor.bin下载失败

    本文详细解析了在Docker中部署OnlyOffice时,因Nginx反向代理配置不当导致editor.bin下载失败的常见问题。通过分析问题根源,提供了从Nginx代理配置、Docker网络设置到OnlyOffice容器内部调整的完整解决方案,并分享了实战调试技巧与性能优化建议,帮助用户彻底解决这一部署难题。

    wine的专栏 523

    深入解析Carry4的内部结构与工作原理

    本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

    n4o5p6q7r的博客 501

    重磅!YOLOv10性能全面超越YOLOv8:技术解析与实测对比

    当工业质检产线因检测延迟导致次品率上升,当无人机巡检因模型过重错失关键帧,当边缘设备因算力不足无法部署先进算法——YOLOv10的出现彻底改变了这一局面。作为2024年 NeurIPS 收录的最新成果,YOLOv10通过**端到端NMS-free架构**和** holistic效率优化**,在精度、速度、参数量三个维度全面超越YOLOv8。本文将从技术原理、性能实测、部署实践三方面,带你系统掌握这...

    gitblog_00686的博客 1262

    【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection

    文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500

    轻舟的万重重山 1万+

    YOLOv10s训练代码解析10:图像测试1

    YOLOv10s训练代码解析10:图像测试1

    BestSongC的博客 756

    基础矩阵、本质矩阵、单应矩阵

    基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

    Gloamirror的博客 1327

    11、CUDA 内存优化:平铺矩阵乘法技术解析

    本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。

    peace的博客 69

    为什么选择 jameslahm/yolov10n:终极YOLOv10轻量级模型深度解析

    jameslahm/yolov10n是一款基于YOLOv10架构的轻量级目标检测模型,专为实时场景优化设计。作为HuggingFace镜像仓库中的明星项目,它完美平衡了检测精度与计算效率,让开发者和普通用户都能轻松部署高性能的物体识别系统。 ## 🚀 核心优势:为什么选择轻量级YOLOv10n? ### 1. 极致轻量化,速度提升30% yolov10n采用优化的网络结构设计,模型文件[mo

    gitblog_00705的博客 915

    IDEA的使用指南

    IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

    YOLOv10 目标检测算法深度解析

    YOLOv10延续了YOLO系列标志性的一阶段检测框架,通过单次前向传播直接输出目标位置与类别信息。相较于传统二阶段算法(如Faster R-CNN),其核心优势在于: 架构简化:摒弃区域提议网络(RPN),将特征提取、候选框生成与分类整合为统一网络 速度突破:在T4 GPU上实现实时推理,YOLOv10-N版本达到1200+ FPS(640×640输入) 精度提升:COCO test-dev数据集上取得54.2% AP(YOLOv10-X),较YOLOv9提升2.3%

    sinat_34897952的博客 2403

    深度学习工具包 DeepLearningToolbox

    深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

    VC中sqlite的使用

    在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

    yolov8/yolov10 损失函数代码解析

    yolov10损失函数代码分析

    hhl_work的博客 840

    VB摄像头监控

    该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

    YOLOv10s训练代码解析3:模型构建

    YOLOv10s训练代码解析3:模型构建

    BestSongC的博客 1301

    YOLOv10解析:保姆级解读和使用教程

    YOLOv10是清华大学的Ao Wang, HuiChen, LihaoLiu等人于 2024年5月发布的,是一种新的实时端到端目标检测器,也是YOLO系列最新的算法。code。

    weixin_45303602的博客 6769
    上一篇: [转载]Real-Time Object Detection Meets DINOv3
    下一篇: 解读:OracleNet: enhancing OBS recognition with Adaptive Deformation and Texture-Structure Decoupling
    wuling129
    博客等级 码龄23年 486粉丝 263原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值