详解DETR和Transformer

本文探讨Transformer如何从NLP领域跨越到CV领域,应用于端到端目标检测和图像分类。介绍了Transformer的模型结构,重点讲解了DETR和Deformable-DETR的改进,以及相关论文列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Transformer在视觉领域的应用

前言

在机器翻译, NLP领域, 基于attention机制的transformer模型取得了很好的结果, 目前有许多工作把Transformer用到CV领域, 实现端到端的目标检测和图片分类。 在这篇博客中, 我们会从Attention机制开始回顾, 之后解释Transformer的结构, 最后讲解三篇把transformer应用到计算机视觉任务的模型。

Attention机制

Attention机制起源于自然语言处理中的seq2seq模型, 这个模型是一个RNN的结构, 输入一个句子, 输出机器翻译后的句子, 或者是这个句子的下一段话。

image-20201214105209842

对于这种模型而言, 很大的一个问题就是每一层传给下一层的向量长度是固定的, 很难用固定长度的向量表达前面的全部信息, 因此在句子很长的时候,模型效果不是很好。

比如

image-20201214105504305

这个时候应该回答That’s why I like apple, 但是因为中间插入了N个词, 信息太多了, 模型忘记了前面的apple。

解决这个问题的办法就是attention</

### DETR架构详解 DETR (End-to-End Object Detection with Transformers) 是一种基于 Transformer 的端到端目标检测方法,它摒弃了传统的目标检测流程中的许多复杂组件,例如非极大值抑制(NMS)[^1] 手工设计的锚框(anchor boxes),从而简化了整个检测过程。 #### 原理概述 DETR 将目标检测视为一个集合预测问题(set prediction problem)。具体来说,模型通过输入图像并将其编码为特征图(feature map),随后利用 Transformer 编码器-解码器结构来生成一组固定数量的对象边界框(object bounding box predictions) 及其对应的类别标签(class labels)[^2]。 以下是 DETR 架构的核心组成部分: #### 图像编码阶段 在这一部分中,卷积神经网络(CNN) 被用来提取图像的空间特征表示。通常采用 ResNet 作为骨干网络(backbone network),并将最后一层的特征图送入后续模块处理。这些特征会被展平(flatten) 并转换成一系列一维向量序列(sequence of vectors)[^3]。 #### Transformer 结构 Transformer 主要由两大部分构成:编码器(encoder) 解码器(decoder)。 - **编码器**: 接收来自 CNN 提取的特征序列,并对其进行自注意力(self-attention) 计算以捕捉全局上下文关系(global context information)。 - **解码器**: 使用多头交叉注意力(multi-head cross attention mechanism) 来关联编码后的特征与可学习的位置嵌入(learnable positional embeddings),最终输出 N 个对象查询(object queries) 对应的结果[^4]。 #### 集合匹配损失函数(Set Matching Loss Function) 为了训练该模型,定义了一种特殊的二分图匹配算法(bipartite matching algorithm),用于计算预测结果真实标注之间的最佳对应关系(best correspondence)。这种策略可以有效解决排列不变性(permutation invariance) 问题,在不依赖于特定顺序的情况下优化整体性能指标[^5]。 ```python import torch.nn as nn class DETR(nn.Module): def __init__(self, backbone, transformer, num_classes): super(DETR, self).__init__() self.backbone = backbone self.transformer = transformer hidden_dim = transformer.d_model self.class_embed = nn.Linear(hidden_dim, num_classes + 1) self.bbox_embed = MLP(hidden_dim, hidden_dim, 4, 3) def forward(self, samples: NestedTensor): features, pos = self.backbone(samples) src, mask = features[-1].decompose() assert mask is not None hs = self.transformer(src, mask, pos[-1])[0] outputs_class = self.class_embed(hs) outputs_coord = self.bbox_embed(hs).sigmoid() out = {'pred_logits': outputs_class[-1], 'pred_boxes': outputs_coord[-1]} return out ``` 上述代码展示了如何构建基本的 DETR 模型框架,其中包含了主要的功能模块及其相互作用方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值