1. 项目概述与核心挑战在计算机视觉的实际落地中我们常常遇到一个令人头疼的问题在一个场景比如校园监控下辛辛苦苦训练好的模型换到另一个场景比如商场监控就直接“水土不服”性能大幅下降。这就是所谓的“域偏移”Domain Shift问题。行人重识别Person Re-identification, Re-ID任务对此尤为敏感因为不同摄像头下的光照、视角、背景、行人着装风格都存在巨大差异。无监督域自适应Unsupervised Domain Adaptation, UDA技术就是为了解决这个“模型跨域泛化”的难题而生的。它的核心思想是利用一个有丰富标注的源域数据如公开数据集Market1501训练一个模型然后让这个模型在没有任何标注的目标域数据如我们自己的监控摄像头画面上也能表现良好。传统的UDA Re-ID方法大多基于卷积神经网络CNN通过风格迁移、记忆库对比学习或基于聚类的伪标签生成等策略来弥合域间差异。然而随着Vision TransformerViT在各类视觉任务上展现出超越CNN的潜力一个很自然的问题出现了Transformer架构能否为UDA Re-ID带来新的突破这正是我们这次要深入探讨的核心。ViT摒弃了CNN的局部归纳偏置完全依赖自注意力机制来建立图像块patch之间的全局依赖关系。这种结构上的根本性改变不仅带来了更强的特征表示能力其独特的“可学习类别标记”class token设计更像是一个嵌入在模型输入层的“全局控制器”或“提示符”这为我们设计新的域适应策略提供了前所未有的灵活性和切入点。基于这个观察我们提出并实现了一种名为“提示与调优”Prompting and Tuning, PAT的两阶段无监督域自适应方法。简单来说我们不把ViT当做一个黑箱特征提取器来粗暴地进行域适应而是巧妙地利用其结构特性第一阶段我们只动这个“提示符”class token让它从代表源域“切换”到代表目标域实现快速、抗噪的粗粒度适应第二阶段我们再解锁整个模型进行精细微调但只使用高置信度的目标域数据避免噪声干扰。这种“先提示后调优”的协同策略在多个主流跨域Re-ID任务上取得了显著优于现有CNN和ViT基线方法的效果。接下来我将为你完整拆解这套方法的每一个技术细节、实现步骤以及我们趟过的“坑”。2. 核心思路与方案设计解析2.1 为什么选择Vision Transformer作为骨干在深入PAT方法之前必须理解我们为什么押注ViT。传统的CNN-based UDA方法其适应过程往往作用于特征图或分类器层面模型底层提取的通用视觉模式如边缘、纹理与高层语义特征如行人姿态、衣着是耦合在一起进行优化的。而ViT的运作机制完全不同它将图像分割为一系列序列化的图像块并通过自注意力机制让这些块之间自由交互。最关键的是在输入序列的最前面ViT引入了一个额外的、可学习的[CLS]标记即class token。这个标记在通过所有Transformer层后其输出被用作整个图像的全局特征表示。这个设计带来了一个关键优势[CLS]标记可以看作是一个与具体图像内容无关的、承载了数据集全局统计特性的“提示向量”。在监督训练中它学会了聚合所有图像块的信息来服务于分类任务。在UDA场景下我们假设这个标记也隐含地编码了“域”的信息。那么一个直观的想法是如果我们能通过一种轻量化的方式让这个标记从编码“源域特性”转变为编码“目标域特性”是否就能以极小的代价实现对模型的域条件化Domain Conditioning这正是PAT方法第一阶段“提示学习”的理论基础。与微调整个拥有数亿参数的大模型相比仅调整这一个标记通常只有768或1024维其训练效率和对训练噪声尤其是伪标签噪声的鲁棒性会高得多。2.2 PAT两阶段框架的整体设计逻辑PAT方法的核心设计遵循了“分而治之”和“由粗到精”的原则。整个流程可以清晰地分为三个阶段源域预训练、提示学习阶段、模型微调阶段。第一阶段源域预训练。这并非PAT的创新而是所有UDA方法的前提。我们使用标准的监督学习方式在拥有真实标签的源域数据集如DukeMTMC-reID上训练一个ViT Re-ID模型。这个阶段的目标是让模型学会如何提取行人的判别性特征并为后续的适应过程提供一个强大的初始化。此时模型中的[CLS]标记已经成为了源域数据分布的一个“代言人”。第二阶段提示学习Prompting。这是PAT的第一个创新阶段。我们将预训练好的模型加载进来然后“冻结”freeze除了[CLS]标记以外的所有权重参数。接着我们在无标签的目标域数据上进行训练。训练使用的监督信号来自于对目标域特征进行聚类如DBSCAN后生成的伪标签。由于绝大部分模型参数被冻结模型很难去“记忆”或“过拟合”那些可能存在错误的伪标签。整个学习过程几乎完全由这个可变的[CLS]标记来驱动。它的任务就是调整自己使得模型在目标域数据上的特征分布更加紧凑、类间更加可分。你可以把这个过程想象成只调整一个“全局旋钮”让整个已经定型的特征提取流水线更适合处理新域的数据流。这个阶段计算代价低且对噪声不敏感能快速将模型“拉”到目标域附近。第三阶段模型微调Tuning。经过提示学习模型已经对目标域有了初步的适应。此时[CLS]标记已经调整为适合目标域的状态。第二阶段的目标是进一步提升精度因此我们需要解锁整个模型的所有参数进行端到端的微调。但是直接使用所有带伪标签的目标域数据是危险的因为伪标签中的噪声会随着模型强大的拟合能力而被放大导致性能下降。因此PAT在这一阶段引入了不确定性感知的样本筛选机制。我们不是简单丢弃聚类中的离群点而是为每个样本计算一个不确定性分数在计算损失时给予低置信度样本更小的权重。这样模型能够更聚焦于学习那些可靠的样本实现更精细的调优。注意这里存在两种训练范式。如果你的基线UDA方法如IDM本身包含源域预训练那么PAT的提示学习阶段就是“同一位置不同时间”地训练一个标记先源域后目标域。如果你的基线方法如SpCL是源域和目标域数据同时训练那么PAT就需要“同一时间不同位置”地维护两个独立的[CLS]标记分别对应源域和目标域输入。3. 关键技术细节与实现要点3.1 ViT骨干网络与特征提取流程要复现PAT首先得搭建好ViT Re-ID的基础框架。我们采用类似TransReID的结构但针对UDA任务进行了适配。图像分块与嵌入输入一张H x W x C的图像我们不是像原始ViT那样切成不重叠的块而是采用滑动窗口的方式生成图像块序列。设窗口大小为P x P步长为S通常S P以产生重叠增强局部细节那么得到的图像块总数K由公式计算。这种重叠分块是一种有效的数据增强能让模型看到更丰富的局部上下文信息。每个图像块经过线性投影层映射到D维如768得到序列{L(x^1_p), ..., L(x^K_p)}。类别标记与位置编码我们准备一个可学习的[CLS]标记x_cls维度也是D将其拼接到图像块序列的最前面。随后为序列中的每一个位置包括[CLS]标记加上可学习的位置编码P。最终输入Transformer编码器的序列为z0 [x_cls; L(x^1_p); ...; L(x^K_p)] P这个z0就是包含了全局提示和所有局部视觉信息的初始表示。Transformer编码与特征输出序列z0经过L层Transformer编码器每层包含多头自注意力MSA和多层感知机MLP的处理。在每一层[CLS]标记都会与其他所有图像块标记进行信息交互聚合全局上下文。最终我们取最后一层输出的[CLS]标记对应的向量zL[0]作为整张图像的Re-ID特征f。这个f将用于计算所有损失函数以及每个训练周期开始时的聚类操作。3.2 两阶段伪标签训练机制详解伪标签训练是聚类式UDA方法的基石。PAT在此框架下对两个阶段赋予了不同的“数据偏好”。提示学习阶段的数据偏好拥抱所有数据不怕噪声。在此阶段由于模型参数基本被冻结模型的拟合能力非常有限本质上只是在学习一个D维向量。这种“欠拟合”的状态反而成了优点——它对伪标签噪声不敏感。因此我们的策略是尽可能利用所有目标域数据包括那些聚类边界模糊或可能是离群点的样本。目标是让[CLS]标记广泛地吸收目标域的整体数据分布特征快速完成域的“粗对齐”。在实现上我们直接使用DBSCAN对所有目标域样本特征聚类后产生的伪标签不进行任何筛选。微调阶段的数据偏好精益求精筛选可靠样本。一旦放开所有参数ViT强大的表示能力很容易对噪声数据过拟合。因此我们必须对训练数据进行清洗。PAT对比了两种策略基于距离的硬筛选Data Preference在每个聚类内部计算所有样本特征到聚类质心的距离。设定一个比例阈值R例如0.3丢弃每个聚类中距离最远的R比例样本。同时DBSCAN产生的所有离群点噪声点也一并丢弃。基于不确定性的软加权Uncertainty这是一种更优雅的方式。我们利用提示学习阶段产生的“源域提示符”x_cls^S和当前“目标域提示符”x_cls^T。对于同一个目标域图像我们分别用这两个提示符输入同一个冻结的骨干网络其他参数Pa固定得到两个特征向量f^S_Ti和f^T_Ti。计算这两个特征分布之间的KL散度Kullback–Leibler divergence作为该样本的不确定性u_Ti。不确定性越高说明模型在不同域提示下对该样本的预测差异越大其伪标签越不可信。我们将exp(-u_Ti)作为该样本损失函数的权重。对于源域样本其权重恒为1。实操心得在我们的实验中不确定性加权策略 consistently 优于简单的距离硬筛选。因为它没有直接丢弃数据而是降低了不可靠样本的贡献度保留了更多的信息。实现时需要注意计算效率可以每几个epoch或在一个子集上计算一次不确定性并缓存避免每个迭代都计算带来过大开销。3.3 不确定性度量的具体实现与代码片段不确定性模块是PAT提升性能的关键。其核心思想是一个可靠的样本无论模型是用源域提示符还是目标域提示符其提取的特征在分类空间如Re-ID的ID分类器上的输出分布应该是相对一致的。反之不一致则意味着样本特征模糊或伪标签可疑。以下是该模块在PyTorch中的简化实现逻辑import torch import torch.nn.functional as F def compute_uncertainty_weight(model, target_images, source_prompt, target_prompt): 计算目标域样本的不确定性权重。 model: 冻结的ViT骨干网络参数Pa固定 target_images: 目标域图像数据 source_prompt: 源域训练得到的 [CLS] token (x_cls^S) target_prompt: 当前目标域 [CLS] token (x_cls^T) model.eval() with torch.no_grad(): # 使用源域提示符提取特征 features_source model.forward_with_prompt(target_images, source_prompt) # 使用目标域提示符提取特征 features_target model.forward_with_prompt(target_images, target_prompt) # 假设我们有一个预训练的ID分类器 head logits_source id_classifier(features_source) logits_target id_classifier(features_target) # 转换为概率分布 (softmax) prob_source F.softmax(logits_source, dim1) prob_target F.softmax(logits_target, dim1) # 计算KL散度 D_KL(P_target || P_source) # 防止log(0)添加一个极小值 kl_div F.kl_div((prob_source 1e-10).log(), prob_target, reductionnone).sum(dim1) uncertainty kl_div # 将不确定性转换为权重 weight exp(-uncertainty) # 可以对uncertainty进行归一化或缩放使其在合理范围内 weights torch.exp(-uncertainty) model.train() return weights # 在损失计算中应用权重 loss weighted_cross_entropy_loss(logits, pseudo_labels, weights)在实际训练中forward_with_prompt函数需要能够动态替换ViT输入序列中的[CLS]标记。这通常需要稍微修改一下ViT的forward方法使其能接受一个外部的prompt参数。4. 实验配置、训练流程与结果分析4.1 实验环境与超参数设置我们的实验基于PyTorch框架在4张V100 GPU上进行。以下是一些关键的实现细节这些参数对复现结果至关重要骨干网络采用ViT-Base/16或ViT-Large架构并在ImageNet-21k或ImageNet-1k上进行预训练。这是获得强大初始特征提取能力的基础。图像处理所有图像统一缩放到256 x 128像素。采用滑动窗口生成图像块窗口大小P16步长S16即无重叠的原始ViT分块或S12产生重叠。重叠分块能带来轻微的性能提升但会增加序列长度和计算量。优化器使用SGD优化器动量设为0.9权重衰减为1e-4。这是训练ViT的常见配置。提示学习阶段由于只有[CLS]标记可学习学习率可以设得稍高如1e-3。微调阶段对整个模型微调学习率应降低如1e-4或5e-5并使用余弦退火调度。批次大小每张GPU的批次大小设为164张GPU总批次大小为64。使用跨GPU同步批归一化SyncBN来稳定训练。聚类与伪标签生成每个训练epoch开始时用当前模型提取所有目标域图像的特征使用DBSCAN算法进行聚类。DBSCAN的eps邻域距离和min_samples最小样本数需要根据数据集调整我们通常设min_samples4eps通过k-距离图来选取。损失函数结合交叉熵损失用于ID分类和三元组损失Triplet Loss。在微调阶段三元组损失应使用加权后的困难样本挖掘。4.2 跨域Re-ID任务上的性能对比我们在四个标准的跨域行人重识别任务上评估PAT方法DukeMTMC-reID - Market1501Market1501 - DukeMTMC-reIDDukeMTMC-reID - MSMT17Market1501 - MSMT17其中MSMT17因其场景复杂、光照变化大而被认为是最具挑战性的数据集。我们以平均精度均值mAP和Rank-1识别率R1作为主要评价指标。下表展示了PAT与当前最先进SOTA方法的对比结果以Duke-Market和Market-Duke为例方法Duke-Market (mAP / R1)Market-Duke (mAP / R1)骨干网络MMT (ICLR‘20)71.2 / 87.765.1 / 78.0CNNSpCL (NeurIPS‘20)76.7 / 90.368.8 / 82.9CNNUNRN (AAAI‘21)78.1 / 91.969.1 / 82.0CNNIDM (ICCV‘21)83.9 / 93.471.1 / 83.9IBN-ResNet-50PAT (Ours)86.3 / 94.272.8 / 84.4Vision Transformer从结果可以看出基于ViT骨干的PAT方法在两项任务上均显著超越了之前基于CNN的SOTA方法。特别是在更具挑战性的Market-MSMT17和Duke-MSMT17任务上PAT的优势更为明显这证明了ViT骨干网络在复杂域适应场景下更强的特征判别能力和我们两阶段策略的有效性。4.3 消融实验每个组件贡献了多少为了验证PAT各个组件的有效性我们进行了系统的消融实验ViT骨干的有效性将IDM方法中的IBN-ResNet-50骨干网络直接替换为Vanilla ViT记为V-Transformer在Duke-Market任务上mAP从83.9%提升到84.7%R1从93.4%提升到93.7%。这证实了ViT本身作为更强特征提取器的优势。两阶段训练的有效性在V-Transformer基础上采用单阶段训练即提示学习和微调同时进行所有参数一起更新性能与V-Transformer基线持平。而采用我们的两阶段策略先提示学习再微调mAP进一步提升至85.2%。这说明将域适应过程解耦为“粗对齐”和“精调优”是有益的。数据筛选策略的对比在微调阶段对比“使用全部数据”、“基于距离的硬筛选”、“基于不确定性的软加权”。实验表明硬筛选比使用全部数据提升约0.4% mAP而软加权比硬筛选再提升约0.7% mAP。这清晰地证明了不确定性加权在保留信息的同时抑制噪声的优越性。训练时间分析CNN基线方法如IDM训练约需0.5天。替换为ViT后由于参数量大增训练时间延长至约4天。采用两阶段训练后由于提示学习阶段大部分参数冻结训练时间增至5天。引入不确定性计算后总训练时间约为5.5天。虽然时间成本增加但带来的性能提升是显著的。5. 实操避坑指南与常见问题排查在实际复现PAT方法的过程中我们遇到了不少挑战也总结出一些关键的经验和技巧。5.1 伪标签噪声与聚类稳定性问题在UDA中伪标签的质量直接决定模型性能的上限。DBSCAN聚类对超参数eps,min_samples非常敏感不同epoch聚类结果可能波动导致伪标签抖动label flickering影响训练稳定性。解决方案动态聚类参数不要在整个训练过程中使用固定的eps。可以设计一个简单的策略例如在训练初期使用较大的eps生成更少、更大的簇伪标签噪声大但覆盖广随着训练进行模型特征越来越好逐渐减小eps生成更多、更纯的簇。记忆库与动量更新借鉴MMT等方法维护一个特征记忆库Memory Bank并使用动量更新的教师模型来生成更稳定、更平滑的伪标签。这能有效缓解标签抖动。多视图聚类一致性对同一张图像使用不同的数据增强如翻转、裁剪得到多个视图分别提取特征并聚类。只有当多个视图的聚类结果一致时才认为该样本的伪标签可靠。这可以作为不确定性度量的一种补充。5.2 ViT训练技巧与优化问题ViT模型容易过拟合尤其是在目标域数据量相对较少的情况下。直接微调可能导致灾难性遗忘Catastrophic Forgetting在源域上学到的知识。解决方案分层学习率在微调阶段对ViT的不同层设置不同的学习率。通常靠近输出的层分类头、最后几个Transformer块使用较大的学习率靠近输入的层patch embedding前几个Transformer块使用较小的学习率。这有助于模型在适应新域的同时保留底层的通用视觉特征。知识蒸馏将预训练的源域模型作为教师模型将正在适应目标域的模型作为学生模型。在训练学生模型时除了使用目标域的伪标签损失还加入与教师模型输出特征之间的蒸馏损失如KL散度或MSE损失。这能有效约束学生模型防止其偏离源域学到的有用知识太远。强数据增强在目标域训练时使用RandAugment、MixUp、CutMix等强数据增强策略。这不仅能增加数据多样性防止过拟合还能让模型学习到更鲁棒的特征对伪标签噪声也有一定的正则化作用。5.3 不确定性计算中的数值稳定性问题计算KL散度D_KL(P_target || P_source)时如果P_source的某些概率值为0会导致log(0)出现数值错误NaN。即使加了微小常数也可能在训练初期模型预测非常自信概率接近one-hot时出现梯度爆炸或不稳定。解决方案标签平滑Label Smoothing在计算源域提示符和目标域提示符对应的分类概率时对softmax的输出应用标签平滑。例如将原始的one-hot伪标签y替换为(1 - ε) * y ε / K其中K是类别数ε是一个小常数如0.1。这能防止模型输出过于极端的概率分布使得KL散度的计算更稳定。温度缩放Temperature Scaling在softmax函数中引入温度参数Tsoftmax(logits / T)。T 1会软化概率分布使得不同提示符下的输出分布差异更平滑更容易计算和比较。T可以作为一个可学习的参数或在验证集上调优。截断与归一化计算权重w exp(-u)后可以对权重进行归一化处理例如按批次归一化到均值为1或者设置一个下限如0.1避免某些样本权重完全为0而被彻底忽略。5.4 工程实现与效率优化问题ViT模型参数量大计算不确定性需要前向传播两次分别用源提示和目标提示显存占用和计算时间翻倍。解决方案梯度检查点Gradient Checkpointing在ViT的Transformer层中启用梯度检查点。这是一种用时间换空间的策略会重新计算某些中间激活值从而大幅降低训练时的显存占用使得在有限显存下训练更大模型或使用更大批次成为可能。异步不确定性计算不需要在每个训练迭代中都计算所有样本的不确定性。可以维护一个不确定性队列每隔N个迭代例如一个epoch用当前的模型和提示符计算一次所有目标域样本的不确定性并将其缓存。在接下来的N次迭代中都使用这份缓存的不确定性权重。虽然这会引入一些滞后但能极大减少计算开销。混合精度训练使用PyTorch的AMPAutomatic Mixed Precision自动混合精度训练。这能显著减少显存占用并加速训练过程对于ViT这类大模型效果尤为明显。6. 总结与未来扩展方向通过这次对PAT方法的深入实践我深刻体会到将Transformer引入UDA任务不仅仅是简单的“骨干网络替换”。ViT结构上的特性尤其是那个可学习的[CLS]标记为我们设计新的适应范式打开了新的大门。PAT的两阶段策略——先通过轻量化的提示学习快速、鲁棒地完成域粗对齐再通过不确定性加权的精细微调提升精度——提供了一种高效且有效的解耦学习思路。从工程角度看这套方法虽然带来了性能提升但也增加了训练复杂度和时间成本。未来有几个方向值得探索更高效的提示设计目前我们只使用了单一的[CLS]标记作为提示。是否可以引入多个可学习的提示向量Multi-Prompt让它们分别捕获目标域中不同子群体或不同场景的特性提示与适配器的结合除了调整输入层的提示能否在ViT的中间层插入轻量化的适配器Adapter模块这样可以在不同层次进行域适应可能获得更精细的调整。在线不确定性估计目前的不确定性计算依赖于两个固定的提示符。能否设计一个在线学习机制让模型在训练过程中动态评估自身预测的置信度从而实现更自适应的样本加权面向实际场景的优化真实世界的跨域Re-ID往往涉及多个目标域如从多个已有数据集适应到一个全新的场景。如何设计一个统一的提示学习框架使其能同时或顺序地适应多个域是一个更具实用价值的课题。最后分享一个在调试中的小技巧可视化[CLS]标记在训练过程中的变化。我们可以通过t-SNE或PCA降维将每个epoch得到的[CLS]标记向量可视化出来。你会清晰地看到在提示学习阶段这个标记在特征空间中从“源域簇”快速向“目标域簇”移动而在微调阶段整个模型的特征分布会围绕这个已经调整好的标记进一步收紧。这种可视化能非常直观地验证你的训练过程是否按预期进行。