OSTrack:Joint Feature Learning and Relation Modeling for Tracking: A One-Stream Framework

Abstract

问题:

传统的双流跟踪框架对目标提取的特征不够具体。

特征提取和关系建模是分开进行的,导致算法在区分目标和背景方面的能力有限。

两流、两阶段框架容易受到性能-速度困境的影响。

解决:

提出一种新的单流跟踪框架,OSTrack通过桥接具有双向信息流的模板搜索图像来统一特征学习和关系建模。

提出了一种基于单流框架中计算的强相似先验的网络内候选早期消除模块。

双流/单流

双流框架:

①Track-by-detection:检测流+关联流

②光流:光流流+特征流

③Anchor-free&re-ID:Anchor-free+re-ID

单流框架:单个模型同时检测和目标关联

本文创新点

①结合特征提取和关系建模,提出一种单流、单阶段跟踪框架。

②利用早期获得的目标与搜索区域各部分之间的相似性得分的先验性,提出了一种网络内早期候选消除模块,以减少推理时间。

Introduction

根据特征融合模块的计算量,通常采用两种不同的双流策略

双流两阶段轻关系跟踪框架:

举例:

孪生网络(Siamese networks)跟踪器

判别式(discriminative)跟踪器

过程:

①通过 CNN 主干网分别提取具有相同的结构和参数的模板和搜索区域特征

②采用单个算子,如互相关或判别相关滤波器融合特征用于状态估计

缺点:

效率高,但简单的线性运算导致判别信息丢失,效果差

无信息交互

双流两阶段重关系跟踪框架:

举例:

TransT:堆叠自注意力和交叉注意力层以进行迭代特征融合

STARK:将预先提取的模板和搜索区域特征连接输入自注意力层

缺点:

解决非线性交互造成的信息丢失问题(Transformer),但大量参数和使用迭代细化,效率低。

单流一阶段跟踪框架:

核心思想:

将模板和搜索区域连接,并将它们送到堆叠的自关注层中(Vision Transformer, ViT),生成的搜索区域特征直接用于目标分类和回归,而无需进一步匹配。

stacked self-attention layers:

堆叠多个自注意力层,每个自注意力层对输入序列处理,将输出传给下一个自注意力层。

模板会指导搜索区域的特征提取(让它更加关注目标),而搜索区域的信息也会反过来调整模板特征的表示。

优点:

在性能和速度之间取得了很好的平衡

单流框架提供了目标与搜索区域(即候选区域)的相似性的强先验

如图所示,该模型即使在早期阶段也可以识别背景区域,促使网络内早期候选淘汰模块放入提出。

Method

模型流程:

①输入图像对,包括目标初始框和搜索区域图像

# x:骨干网络的输出特征
# aux_dict:辅助字典,包含中间层特征或注意力权重
x, aux_dict = self.backbone(z=template, x=search,
                                    ce_template_mask=ce_template_mask,
                                    ce_keep_rate=ce_keep_rate,
                                    return_last_attn=return_last_attn, )  
# 跳转到 vit_ce.py---191  x Tensor:(4,320,768)

②将输入的图像送入ViT backbone预处理,切分图像块,将图像展平为一维向量

x = self.patch_embed(x)
z = self.patch_embed(z)

 ③线性投影到高维

    def forward(self, x):
        x = self.proj(x)  
        if self.flatten:
            x = x.flatten(2).transpose(1, 2) 
        x = self.norm(x) 
        return x

 ④模型为每个包括图块特征和搜索区域的图块特征添加位置嵌入,特征包含图块嵌入和位置编码

# 展平完加token
        if self.add_cls_token:
            cls_tokens = self.cls_token.expand(B, -1, -1)
            cls_tokens = cls_tokens + self.cls_pos_embed

        # 加位置编码
        z += self.pos_embed_z
        x += self.pos_embed_x

⑤将图像嵌入连接并馈送到Transformer编码器层中,以进行联合特征提取和关系建模;

        # 拼接
        x = combine_tokens(z, x, mode=self.cat_mode)
        if self.add_cls_token:
            x = torch.cat([cls_tokens, x], dim=1)

模型可以包含多个编码器层,每个层都可能包含一个早期淘汰模块

# 前向
        for i, blk in enumerate(self.blocks):
            x = blk(x)  # vit 12个layer层

### 关于 Relation Network 的 Few-Shot Learning 复现 #### 使用 PyTorch 实现 Relation Network 以下是基于 PyTorch 的 Relation Network 实现代码示例: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import transforms, datasets class CNNEncoder(nn.Module): """CNN Encoder""" def __init__(self): super(CNNEncoder, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, padding=0), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2)) self.layer2 = nn.Sequential( nn.Conv2d(64, 64, kernel_size=3, padding=0), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2)) self.layer3 = nn.Sequential( nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU()) self.layer4 = nn.Sequential( nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU()) def forward(self, x): out = self.layer1(x) out = self.layer2(out) out = self.layer3(out) out = self.layer4(out) return out.view(out.size(0), -1) class RelationNetwork(nn.Module): """Relation Network""" def __init__(self, input_size, hidden_size): super(RelationNetwork, self).__init__() self.fc1 = nn.Linear(input_size*2, hidden_size) self.fc2 = nn.Linear(hidden_size, 1) def forward(self, x): out = torch.relu(self.fc1(x)) out = torch.sigmoid(self.fc2(out)) return out def train(model_encoder, model_relation, optimizer, criterion, support_set, query_set, device='cpu'): model_encoder.train() model_relation.train() support_features = model_encoder(support_set.to(device)) # Extract features from the support set query_features = model_encoder(query_set.to(device)) # Extract features from the query set relations = [] for i in range(len(support_features)): pair_feature = torch.cat([support_features[i], query_features], dim=-1) # Concatenate pairs of features relation_score = model_relation(pair_feature).view(-1) # Compute similarity score relations.append(relation_score) output = torch.stack(relations).squeeze() # Stack all scores into a tensor target = torch.zeros(output.shape[0]).to(device) # Create ground truth labels loss = criterion(output, target) # Calculate loss optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() ``` 上述代码实现了 `CNNEncoder` 和 `RelationNetwork`,并定义了一个简单的训练函数。 --- #### TensorFlow 实现 Relation Network 下面是基于 TensorFlow 的 Relation Network 实现代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, BatchNormalization, MaxPooling2D, Flatten, Dense, ReLU, Input, concatenate from tensorflow.keras.models import Model def create_cnn_encoder(): inputs = Input(shape=(84, 84, 3)) x = Conv2D(filters=64, kernel_size=3)(inputs) x = BatchNormalization()(x) x = ReLU()(x) x = MaxPooling2D(pool_size=2)(x) x = Conv2D(filters=64, kernel_size=3)(x) x = BatchNormalization()(x) x = ReLU()(x) x = MaxPooling2D(pool_size=2)(x) x = Conv2D(filters=64, kernel_size=3, padding="same")(x) x = BatchNormalization()(x) x = ReLU()(x) x = Conv2D(filters=64, kernel_size=3, padding="same")(x) x = BatchNormalization()(x) x = ReLU()(x) outputs = Flatten()(x) encoder_model = Model(inputs=inputs, outputs=outputs, name="cnn_encoder") return encoder_model def create_relation_network(input_dim, hidden_units): feature_a = Input(shape=input_dim) feature_b = Input(shape=input_dim) concatenated = concatenate([feature_a, feature_b]) x = Dense(units=hidden_units, activation="relu")(concatenated) x = Dense(units=1, activation="sigmoid")(x) relation_model = Model(inputs=[feature_a, feature_b], outputs=x, name="relation_network") return relation_model # Example usage encoder = create_cnn_encoder() relation_net = create_relation_network(input_dim=1600, hidden_units=8) ``` 此代码展示了如何使用 Keras API 构建 CNN 编码器和关系网络模型。 --- #### 方法概述 Relation Network 是一种通过学习嵌入空间中的相似性来解决小样本分类问题的有效方法[^2]。其核心思想在于设计一个深度非线性距离度量函数,该函数能够捕捉查询样本和支持集之间的关系。相比其他元学习方法,Relation Network 更加简洁高效,在多种任务上表现出色。 为了验证其实效性,可以采用 Omniglot 或 Mini-ImageNet 数据集进行实验,并按照 N-way-K-shot 设置划分支持集与查询集。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值