在计算机视觉领域,Transformer架构已经从自然语言处理成功跨界,催生出一系列突破性成果。其中,Vision Transformer(ViT)和Detection Transformer(DETR)分别代表了图像分类和目标检测两大核心任务的创新范式。本文将深入剖析这两大模型如何基于Transformer架构进行任务定制,揭示它们在模块设计、特征交互和任务适配层面的精妙差异。
Transformer最初是为序列数据设计的,如何将二维图像适配到这种架构中是首要挑战。ViT和DETR采用了截然不同的预处理策略,这些差异直接影响了后续模块的设计逻辑。
ViT采用**分块嵌入(Patch Embedding)**策略,将输入图像分割为固定大小的非重叠块(如16×16像素)。每个块被展平后通过线性投影转换为嵌入向量,这与NLP中的词嵌入过程高度相似。例如,处理224×224图像时:
python复制# ViT的典型patch处理过程
patch_size = 16
num_patches = (224 // patch_size) ** 2 # 得到196个patch
embedding_dim = 768
patches = image.unfold(1, patch_size, patch_size).unfold(2, patch_size, patch_size)
patches = patches.contiguous().view(batch_size, num_patches, -1)
projection = nn.Linear(patch_size**2 * 3, embedding_dim)
patch_embeddings = projection(patches)
相比之下,DETR保留了传统检测器的CNN特征提取前端。Backbone(如ResNet)输出的特征图通过1×1卷积降维后,与位置编码相加形成序列输入。这种设计带来三个关键特性:
下表对比两种输入处理方式的本质差异:
| 特性 | ViT | DETR |
|---|---|---|
| 输入分辨率 | 低(16×16分块) | 高(如25×34特征图) |
| 位置信息编码 | 显式添加位置嵌入 | 特征图坐标+位置编码 |
| 计算复杂度 | O(N²), N=分块数 | O(HW²), H,W=特征图尺寸 |
| 适用任务 | 全局分类 | 局部检测 |
虽然两者都使用标准Transformer模块,但在注意力机制的具体实现上存在重要调整。ViT沿用了原始Transformer的全局自注意力,每个patch都会与所有其他patch交互。这种设计适合分类任务需要全局感知的特点,但计算成本随图像尺寸平方增长:
code复制Attention(Q,K,V) = softmax(QKᵀ/√d)V
DETR则引入了空间先验约束的注意力机制。在Encoder阶段,特征图上的每个位置只需关注周围有限区域,这种稀疏注意力显著降低了计算量。更关键的是,Decoder中的**对象查询(Object Queries)**机制:
python复制# DETR的Decoder查询初始化
num_queries = 100
query_embed = nn.Embedding(num_queries, hidden_dim)
# 训练过程中学习每个查询的定位偏好
这100个可学习的查询向量通过交叉注意力与编码特征交互,每个查询逐渐专注于特定物体或背景区域。与ViT的[CLS]标记相比,DETR查询具有以下特点:
任务目标的差异导致两者在解码器设计上分道扬镳。ViT采用极简设计,仅使用[CLS]标记对应的输出进行分类:
python复制# ViT分类头典型实现
cls_token = output[:, 0] # 提取第一个位置对应[CLS]的输出
classification_head = nn.Linear(hidden_dim, num_classes)
logits = classification_head(cls_token)
DETR则需要处理更复杂的输出空间。其解码器包含两个并行预测头:
python复制# DETR预测头结构示例
class DETRHead(nn.Module):
def __init__(self, hidden_dim, num_classes):
self.bbox_head = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, 4),
nn.Sigmoid()
)
self.class_head = nn.Linear(hidden_dim, num_classes + 1)
训练时采用的二分图匹配损失是DETR的核心创新。匈牙利算法将预测框与真实框最优匹配,确保每个物体只对应一个预测:
code复制匹配成本 = λ₁·分类损失 + λ₂·L1框损失 + λ₃·GIoU损失
实际部署中,两者都需要特定技巧保证性能。ViT的关键优化点包括:
DETR则面临更严峻的训练挑战,常用解决方案有:
以下代码展示了DETR的典型训练循环片段:
python复制# 简化的DETR训练步骤
for images, targets in dataloader:
outputs = model(images)
# 计算匈牙利匹配
indices = matcher(outputs, targets)
# 计算多任务损失
loss = 0
for k in ['labels', 'boxes', 'cardinality']:
loss += weights[k] * criterion[k](outputs, targets, indices)
optimizer.zero_grad()
loss.backward()
optimizer.step()
两者的性能优化方向也反映任务差异:ViT关注如何扩大感受野和降低计算量,而DETR侧重提高小物体检测精度和训练稳定性。最新的改进模型如Swin Transformer和Deformable DETR,正是针对这些痛点进行的架构创新。