当前位置: 首页> 科技> 互联网 > 营销型网站公司排名_24小时自助下单平台网站便宜_长沙seo研究中心_网店推广有哪些

营销型网站公司排名_24小时自助下单平台网站便宜_长沙seo研究中心_网店推广有哪些

时间:2025/7/13 16:39:21来源:https://blog.csdn.net/qq_30043925/article/details/144843670 浏览次数:0次
营销型网站公司排名_24小时自助下单平台网站便宜_长沙seo研究中心_网店推广有哪些

目录

  • 摘要
  • Abstract
  • 基于Transformer的端到端目标检测
  • 研究动机
  • 创新点
  • 局限性
  • DETR 算法
    • 具体架构
    • 损失函数
  • 实验结果
  • 代码分析
  • 总结

摘要

本周主要阅读了 DETR 算法的原始论文。DETR 是将 Transformer 应用到计算机视觉领域的代表性算法,其不需要传统目标检测的 NMS 或 anchor 机制,而是直接将目标检测任务视为一个集合预测任务去输出预测集合。DETR 首先将输入图像通过一个 CNN 来提取特征并进行序列化,序列化之后的向量再输入到 encoder 中进行编码并产生包含上下文信息的向量。接下来初始化一系列包含位置信息的 object queries 向量,再将这些向量和之前编码得到的向量进行查询,最后将得到的向量通过前馈神经网络生成预测集合。实验表明了 DETR 在 COCO 数据集上的性能于 Faster R-CNN 相当,但是作为首次将 Transformer 运用到计算机视觉领域的算法,DETR 在未来的改进及研究仍然大有可为。

Abstract

This week, I primarily focused on reading the original paper of the DETR algorithm. DETR is a representative algorithm that applies Transformer to the field of computer vision. Unlike traditional object detection algorithms that require Non-Maximum Suppression (NMS) or anchor mechanisms, DETR directly treats the task of object detection as a set prediction problem, outputting a set of predictions. DETR first processes the input image through a CNN to extract features and then serializes these features into a sequence of vectors. These serialized vectors are fed into an encoder to encode them and produce vectors enriched with context information. Subsequently, a series of object queries vectors initialized with positional information are introduced. These object query vectors interact with the previously encoded vectors through a process akin to querying, and finally, the resulting vectors pass through a feed-forward neural network to generate the prediction set.Experiments have shown that DETR performs comparably to Faster R-CNN on the COCO dataset. However, as the pioneering algorithm to apply Transformer in the domain of computer vision, there is still great potential for future improvements and research on DETR.


基于Transformer的端到端目标检测

Title: End-to-End Object Detection with Transformers
Author: N Carion,F Massa,G Synnaeve,N Usunier,A Kirillov,S Zagoruyko
Source: Computer Vision – ECCV 2020
Arxiv:https://arxiv.org/abs/2005.12872?file=2005.12872


研究动机

目标检测的任务就是为每一个感兴趣的对象预测一组边界框和类别标签。当今的目标检测模型都是用一种间接的方式来完成这个目标 ,比如说生成大量的region proposals、锚框(anchor)或者利用网格中心点来解决一个回归和分类问题。

这种处理办法的坏处就是性能会受到中间步骤的显著影响。例如使用 selective search 的模型的性能会显著降低,采用大量重复的后处理(NMS)步骤以及生成锚框的模型的性能也会被这些过程严重拖累。

因此,作者提出了一种基于 Transformer 的办法来绕过这些多余的中间步骤,直接对目标进行定位并分类。这种端到端的思想已经在机器翻译和语音识别领域取得了重大的进展,而将 Transformer 运用到计算机视觉领域也是一次伟大的尝试。DETR 的出现,让研究者们意识到,Transformer 不仅能做特征提取,还可以实现一些具体的下游任务。

创新点

  1. 完全端到端的学习框架:没有复杂的预处理步骤或手工设计的组件,DETR 可以作为一个完整的端到端系统进行训练,所有参数都可以通过反向传播自动调整,使得整个模型更加简洁和易于维护。
  2. 消除手工设计的组件:传统的单阶段和两阶段检测器通常依赖于预定义的锚点框来生成候选区域,而 DETR
    完全摒弃了这种做法。同时,大多数检测算法需要使用 NMS 来去除冗余的检测结果。而 DETR 的输出是独立的预测,因此理论上不需要 NMS。
  3. 基于 Transformer 的架构:DETR 首次将 Transformer
    编码器-解码器结构应用于目标检测任务中。与传统的目标检测模型不同,DETR 不依赖于卷积网络中的局部特征提取,而是通过自注意力机制对整个图像进行全局建模,从而更好地捕捉对象之间的关系。

局限性

DETR 在小物体上的训练、优化和性能方面表现不好,需要结合一些多尺度方案来解决整个问题。

DETR 算法

在这里插入图片描述
在DETR中,输入图像首先通过一个卷积神经网络(CNN),这个过程可以被视为一种特征提取步骤。CNN的作用是将原始图像转换为一组更低维的特征表示,即所谓的“patch”。

因为原始图像的数据量通常很大,直接对高分辨率图像应用Transformer计算成本极高。因此,使用CNN来生成较小的特征图(patch),可以显著减少数据量,使Transformer能够更有效地工作。并且由于 Transformer 只能输入序列数据,因此将图像转换为一个个 patch 实际上也是讲图像进行序列化。

主要流程如下:

  1. 图像输入CNN中提取特征并进行序列化
  2. 将序列信息输入 Transformer 得到预测边界框集合
  3. 丢弃不存在物体的边界框

具体架构

在这里插入图片描述
DETR 的具体架构由四部分组成,分别是 backboneencoderdecoderprediction heads

  1. backbone:主要负责从输入图像中提取特征并进行序列化,将图像转化为低维特征表示。
  2. encoder:这部分实际上和原始的 Transformer 的 encoder 没什么不同,采取的是多层自注意力机制获取不同位置 patch 之间的全局上下文关系并产生一组特征向量。
  3. decoder:在这个部分中 object queries 是核心,目的是为了让它学会怎么从原始特征找到物体的位置及类别。这部分和原始的 Transformer 中的 decoder 有很大的不同,首先去掉了 mask 机制,并且 object queries 是并行出入 decoder 中进行处理的。object queries 是用0进行初始化的向量,目的是为了学习如何从 encoder 编码之后的特征中找到边界框位置和类别。
  4. prediction heads:将通过 Transformer 之后的向量通过前馈神经网络进行回归和分类得到最终预测结果。

在这里插入图片描述
从上图我们可以更加清晰地看到数据流动的过程,首先图像会分别产生Q、K和V三个矩阵,然后这三个矩阵会经过一个多头自注意力层进行互相查询得到包含上下文信息的向量,然后再经过 ADD&Norm层经过相应的处理,整个过程进行N次。而在另一部分,Object queries 向量首先用0进行初始化,然后加上位置编码作为一个查询矩阵Q,去和图像中的V和K矩阵进行注意力计算。同样,整个过程要经过M次。最后得到的向量拿去分别通过两个前馈传播网络得到分类和边界框坐标。

在这里插入图片描述
为什么要使用 encoder呢?

正如图上所示,使用 encoder 实际上是为了让机器关注图像中更值得注意的部分。encoder 可以使图像上的不同位置的 patch 进行“互相交流”得到注意力信息,可以让机器理解自己更应该关注的区域。

损失函数

σ ^ = arg ⁡ min ⁡ σ ∈ S N ∑ i = 1 N L match ( y i , y ^ σ ( i ) ) \hat{\sigma} = \arg \min_{\sigma \in \mathfrak{S}_N} \sum_{i=1}^{N} \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\sigma(i)}) σ^=argσSNmini=1NLmatch(yi,y^σ(i))

  • y = { y i } i = 1 N y = \{y_i\}_{i=1}^{N} y={yi}i=1N: 表示 N N N 个 ground truth 的集合,其中 y i y_i yi 表示第 i i i个 ground truth。由于集合 y y y中的数量肯定是远远小于 y ^ \hat y y^,为了让两个集合大小一直,因此会在集合 y y y中使用 ∅ \varnothing 来对集合进行填充。
  • y ^ = { y ^ i } i = 1 N \hat{y} = \{\hat{y}_i\}_{i=1}^{N} y^={y^i}i=1N: 表示 N N N 个预测的集合,其中 y ^ i \hat{y}_i y^i表示第 i 个预测。
  • σ \sigma σ:是一种预测值 y ^ \hat{y} y^ 的排列方式。因为集合 y y y要与集合 y ^ \hat y y^进行一一匹配,所以只需要固定 y y y的顺序,调整 y ^ \hat y y^的排列即可。
  • S N \mathfrak{S}_N SN: 是排列 σ \sigma σ 的集合。
  • L match ( y i , y ^ σ ( i ) ) \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\sigma(i)}) Lmatch(yi,y^σ(i)): 是一种pair-wise matching cost,文中是使用匈牙利算法进行计算的。

匈牙利算法(Hungarian Algorithm),也被称为 Kuhn-Munkres 算法,是一种用于解决指派问题(Assignment
Problem)的组合优化算法。指派问题通常描述为:给定一组工人和一组任务,每个工人对每个任务都有一个关联的成本或效益值,目标是找到一种分配方式,使得所有工人都被分配到一个任务,并且总成本最小化或总效益最大化。

L match ( y i , y ^ σ ( i ) ) = − 1 { c i ≠ ∅ } p ^ σ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box ( b i , b ^ σ ( i ) ) \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\sigma(i)}) = -\mathbf{1}_{\{c_i \neq \varnothing\}} \hat{p}_{\sigma(i)}(c_i) + \mathbf{1}_{\{c_i \neq \varnothing\}} \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\sigma(i)}) Lmatch(yi,y^σ(i))=1{ci=}p^σ(i)(ci)+1{ci=}Lbox(bi,b^σ(i))

每个 ground truth y i y_i yi 都是由两部分信息组成的:类别 + 位置,也可以写成 y i = ( c i , b i ) y_i = (c_i, b_i) yi=(ci,bi),其中:

  • c i c_i ci: 表示类别信息(也有可能是空 ∅ \varnothing )。
  • b i b_i bi: 表示位置信息,是一个归一化(值都小于 1)的向量,有 4 个值,分别表示 box 中心点的坐标和宽高。

对于预测值 y ^ σ ( i ) \hat{y}_{\sigma(i)} y^σ(i),我们将类别和位置信息定义为 y ^ σ ( i ) = ( p ^ σ ( i ) ( c i ) , b ^ σ ( i ) ) \hat{y}_{\sigma(i)} = (\hat{p}_{\sigma(i)}(c_i), \hat{b}_{\sigma(i)}) y^σ(i)=(p^σ(i)(ci),b^σ(i))

  • p ^ σ ( i ) ( c i ) \hat{p}_{\sigma(i)}(c_i) p^σ(i)(ci): 我们已经知道了 ground truth 的类别信息 c i c_i ci,这个概率值是通过模型的分类器计算得出的,反映了模型对于该预测值属于类别 c i c_i ci 的确信度。

L Hungarian ( y , y ^ ) = ∑ i = 1 N [ − log ⁡ p ^ σ ^ ( i ) ( c i ) + 1 { c i ≠ ∅ } L box ( b i , b ^ σ ^ ( i ) ) ] \mathcal{L}_{\text{Hungarian}}(y, \hat{y}) = \sum_{i=1}^{N} \left[ -\log \hat{p}_{\hat{\sigma}(i)}(c_i) + 1_{\{c_i \neq \varnothing\}} \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\hat{\sigma}(i)}) \right] LHungarian(y,y^)=i=1N[logp^σ^(i)(ci)+1{ci=}Lbox(bi,b^σ^(i))]

其中 σ ^ \hat{\sigma} σ^ 是最优的排列,也就是使得整体 cost 最小的 y ^ \hat{y} y^ 排列。

这里存在一个问题,为什么上面的 − 1 { c i ≠ ∅ } p ^ σ ^ ( i ) ( c i ) -\mathbf{1}_{\{c_i \neq \varnothing\}} \hat{p}_{\hat{\sigma}(i)}(c_i) 1{ci=}p^σ^(i)(ci) 在这里就变成了 − log ⁡ p ^ σ ^ ( i ) ( c i ) -\log \hat{p}_{\hat{\sigma}(i)}(c_i) logp^σ^(i)(ci)。原因是 ∅ \varnothing 与预测值 ( y ^ \hat{y} y^) 的 L match ( y i , y ^ σ ^ ( i ) ) \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\hat{\sigma}(i)}) Lmatch(yi,y^σ^(i)) 匹配代价实际上并不取决于预测值,因为 c i = ∅ c_i = \varnothing ci= 的时候,因为指示函数的关系, L match ( y i , y ^ σ ^ ( i ) ) = 0 \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\hat{\sigma}(i)}) = 0 Lmatch(yi,y^σ^(i))=0,也就是一个常数。在计算匹配代价中的类别代价时,我们使用概率而不是对数概率,因为实际效果更好。

上面的公式是为了求解最优的排列 σ ^ \hat{\sigma} σ^,而这里根据最优的排列 σ ^ \hat{\sigma} σ^ 来求解损失。一般来说,为了解决类间不平衡问题,会在 c i = ∅ c_i = \varnothing ci= 对数概率项前乘以 1 / 10 1/10 1/10 来降低权重。

L box ( b i , b ^ σ ^ ( i ) ) = λ giou L giou ( b i , b ^ σ ^ ( i ) ) + λ L1 ∥ b i − b ^ σ ^ ( i ) ∥ 1 \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\hat{\sigma}(i)}) = \lambda_{\text{giou}} \mathcal{L}_{\text{giou}}(b_i, \hat{b}_{\hat{\sigma}(i)}) + \lambda_{\text{L1}} \| b_i - \hat{b}_{\hat{\sigma}(i)} \|_1 Lbox(bi,b^σ^(i))=λgiouLgiou(bi,b^σ^(i))+λL1bib^σ^(i)1

为什么直接使用 L1 损失:因为 L1 损失是计算绝对值,但是在目标检测中,大目标和小目标,即便是有着相同的相对误差(relative error),其绝对误差,也就是 L1 损失值都会有很大差异,对尺度的支持比较差。所以为了缓解 L1 损失的尺度不变性比较差的问题,我们引入了 GIOU(广义IOU)。

广义IOU的定义如下:
L i o u ( b σ ( i ) , b ^ i ) = 1 − ( ∣ b σ ( i ) ∩ b ^ i ∣ ∣ b σ ( i ) ∪ b ^ i ∣ − ∣ B ( b σ ( i ) , b ^ i ) ∖ b σ ( i ) ∪ b ^ i ∣ ∣ B ( b σ ( i ) , b ^ i ) ∣ ) \mathcal{L}_{iou}(b_{\sigma(i)}, \hat{b}_i) = 1 - \left( \frac{|b_{\sigma(i)} \cap \hat{b}_i|}{|b_{\sigma(i)} \cup \hat{b}_i|} - \frac{|B(b_{\sigma(i)}, \hat{b}_i) \setminus b_{\sigma(i)} \cup \hat{b}_i|}{|B(b_{\sigma(i)}, \hat{b}_i)|} \right) Liou(bσ(i),b^i)=1(bσ(i)b^ibσ(i)b^iB(bσ(i),b^i)B(bσ(i),b^i)bσ(i)b^i)

实验结果

在这里插入图片描述
作者使用 AdamW 来训练DETR,将初始 Transformer 的学习率设置为10−4主干的学习率设置为10−5,,权重 decay 为10−4。所有 Transformer 的权重都是用Xavier 初始化的,骨干网络是用ImageNet 预训练的ResNet模型。

作者在实验中中采用了不同层数的骨干网络,分别是ResNet-50和ResNet-101,相应的模型分别称为DETR和DETR- R101。

并且作者还通过在骨干网络的最后一阶段添加膨胀(dilation)并移除该阶段第一个卷积中的步幅来增加特征分辨率。对应的模型分别被称为DETR-DC5和DETR-DC5-R101(膨胀的C5阶段)。

这一修改使得分辨率提升了两倍,从而改善了小目标的性能,但代价是编码器的自注意力计算成本提高了16倍,导致整体计算成本增加了两倍。

代码分析

下面的代码是原始论文中附带的代码:

# 导入相关包
import torch
from torch import nn
from torchvision.models import resnet50# 定义了继承自 nn.Module 的类
class DETR(nn.Module):def __init__(self, num_classes, hidden_dim, nheads, num_encoder_layers, num_decoder_layers):super().__init__()# We take only convolutional layers from ResNet-50 modelself.backbone = nn.Sequential(*list(resnet50(pretrained=True).children())[:-2])  # 去除了最后两层(全局平均池化层和全连接层)self.conv = nn.Conv2d(2048, hidden_dim, 1)  # 1x1 卷积层转换通道,将ResNet50输出的通道数从2048转换为hidden_dimself.transformer = nn.Transfor,mer(hidden_dim, nheads, num_encoder_layers, num_decoder_layers)  # 初始化 Transformer 模块self.linear_class = nn.Linear(hidden_dim, num_classes + 1)self.linear_bbox = nn.Linear(hidden_dim, 4)# 初始化 object queries 参数self.query_pos = nn.Parameter(torch.rand(100, hidden_dim))  # 位置编码self.row_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))self.col_embed = nn.Parameter(torch.rand(50, hidden_dim // 2))def forward(self, inputs):x = self.backbone(inputs)h = self.conv(x)H, W = h.shape[-2:]pos = torch.cat([self.col_embed[:W].unsqueeze(0).repeat(H, 1, 1),self.row_embed[:H].unsqueeze(1).repeat(1, W, 1),], dim=-1).flatten(0, 1).unsqueeze(1)h = self.transformer(pos + h.flatten(2).permute(2, 0, 1), self.query_pos.unsqueeze(1))return self.linear_class(h), self.linear_bbox(h).sigmoid()detr = DETR(num_classes=91, hidden_dim=256, nheads=8, num_encoder_layers=6, num_decoder_layers=6) # 实例化
detr.eval()
inputs = torch.randn(1, 3, 800, 1200)
logits, bboxes = detr(inputs)

总结

DETR(Detection Transformer)是一种创新的目标检测模型,它摒弃了传统目标检测中使用的复杂手工设计组件,如锚框(anchor)和非极大值抑制(NMS),转而采用基于Transformer架构的编码-解码器结构来进行端到端的目标检测。通过将检测任务视为直接集合预测问题,DETR利用自注意力机制处理全局上下文信息,并结合位置编码来保持空间结构,从而实现了对图像中对象的分类和定位。尽管其初始性能可能不及一些成熟的两阶段检测器,但DETR为计算机视觉领域引入了一种全新的视角,并且在简化模型的同时提供了强大的扩展性和改进潜力,特别是在处理大规模目标方面表现优异。

关键字:营销型网站公司排名_24小时自助下单平台网站便宜_长沙seo研究中心_网店推广有哪些

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: