无人机拍到的和地面看到的是同一个人吗?VR3D 用 3D 表示学习解决跨视角行人重识别
先抛一个真实场景:城市多机协同巡逻中,目标先在路边被地面摄像头拍到,30 秒后无人机从 80 米高度飞过,它捕捉到的画面几乎只剩下头顶和肩膀轮廓。两个视角的图像很难让人相信拍的是同一个人。如果此时直接用传统 2D 行人重识别(Person Re-Identification, ReID)特征去匹配,结果大概率是灾难性的。
这不是少数场景才有的问题。智慧城市、大型活动安保、园区巡逻、应急救援都会出现「地面摄像头 + 空中无人机」的混合监控需求。空中视角和地面视角之间的夹角可以接近 90°,目标的外观、姿态、尺度、遮挡状态几乎完全改变了。传统的 ReID 方法建立在“两张图像都是正面或接近正面视角”的隐性假设上,一旦视角差异超出范围,特征就不可靠。
所以最近很多研究者把希望放在 3D 表示学习上。项目标题里的VR3D(View-Robust 3D Representation Learning for Aerial-Ground Person Re-Identification)就是这一思路的代表:与其在 2D 图像空间里不断修补视角差异,不如把行人“还原”到一个与视角无关的 3D 空间里,再做身份匹配。这篇文章不是论文翻译,而是从概念、方法拆解、训练管线、工程部署到常见坑,完整讲清楚这个方向到底解决什么问题、适合什么场景、落地时要注意什么。
1. Aerial-Ground 场景下的行人重识别难点在哪里
要理解 VR3D 为什么存在,先要知道传统 ReID 在 Aerial-Ground 场景下为什么失效。
传统 ReID 的定义是:在多个不重叠摄像头拍摄的画面中,检索同一个目标行人。经典流程是:目标检测 -> 特征提取 -> 距离度量 -> 排序返回。特征提取大多基于 2D 卷积网络,模型学到的是颜色、纹理、姿态、部件位置等外观信息。从训练数据来看,这类模型接触到的视角通常比较有限:平视、轻度俯视、侧视,视角变化范围一般不超过 30° 到 45°。
但空中—地面协同场景把视角变化拉到了极端。无人机视角垂直于地面或接近垂直,地面摄像头则是平视或轻微俯视。同一个人的身体在这种跨视角下会发生几类明显的变化:
- 自遮挡严重。无人机俯视时,面部、前后躯干的比例可能被压缩,双手和双腿可能被身体遮挡。
- 外观歧义增强。俯视时颜色信息可能只剩衣领、背包、帽子,原有的条纹、图案可能完全不可见。
- 尺度差异大。地面图像目标像素高度可能占整张图的 70%,无人机图像中目标可能只有几个像素,还要应对远处的小目标。
- 光照和背景差异大。空中视角下地面反光、阴影、遮挡物变化比地面平视更复杂。
这些问题叠加在一起,导致一个结果:2D 外观特征在 Aerial-Ground 检索场景里的可区分性断崖式下跌。你让模型看一眼地面图,再去无人机图里找同一个人,它很容易找到“颜色像但实际是别人”的干扰项。
如果只靠调整损失函数或换更强的骨干网络,能解决吗?很难。因为问题出在表征层面:2D 图像记录的是 3D 世界在某一个相机位姿下的投影,投影过程天然丢失了大量结构信息。同一个人的信息是完整保留在 3D 空间里的,但不同视角的 2D 图像只是从不同角度“观察”同一个 3D 结构,彼此之间并不存在像素级的对应关系。这就是为什么 VR3D 这类方法要把表征从 2D 搬到 3D。
2. 为什么 2D 外观特征很难做到 View-Robust
先把 2D ReID 的主流路线梳理一下,这样能更清楚 3D 表示学习的价值在哪里。
早期深度 ReID 方法把整张行人图输入 CNN,提取一个全局特征向量;后来大家发现局部信息也很重要,就出现了基于水平切条(stripes)的方法,把特征图切成多个水平块,分别学习局部特征再拼接;再后来有人用姿态估计、语义分割、关键点对齐来做“部件级”特征,希望让模型更关注语义部件而不是纯像素。这些方法在视角变化不大的数据集上表现不错,但都有一个共同假设:部件之间的空间位置相对稳定。视角一变,这个假设就塌了。
拿最常用的语义部件对齐举例。在人脸识别或行人重识别中,算法会把图像划分成头、躯干、腿等语义区域。地面视角下,头的中心位置、腿的方向都比较固定;无人机俯视下,头在图像中心,腿可能完全看不到,躯干变成一个不规则块,原来学到的部件空间关系全部失效。即使你有很强的注意力机制,模型也无法从缺失的信息中凭空恢复出下半身特征。
另一个问题是 2D 特征对视角变化的敏感性是隐性的。CNN 可以学到“某个颜色组合 + 某种姿态 = 某个人”这样的相关关系,但这种关系不是依靠身体结构建立的。换一个视角后,颜色还在,姿态没了,模型会退化成靠颜色和纹理粗暴匹配。跨视角检索时,如果目标恰好穿着常见的深色衣服,误检率会急剧上升。
所以结论很明确:要使特征具备 View-Robust 能力,不能只在 2D 图像上继续加模块,必须引入 3D 空间作为中间表示。一个行人无论无人机怎么拍、地面摄像头怎么拍,他在 3D 空间中的身体结构、体积分布、重心位置、关键部位相对关系是基本不变的。把这套结构建模出来,跨视角匹配就变成了“两个 3D 结构是否属于同一个人”的问题。
3. VR3D 用 3D 表示学习解决问题的逻辑
VR3D 这个名称可以拆成两部分:View-Robust 是想要达到的性质,3D Representation Learning 是实现手段。它的核心思想并不复杂:不要直接在像素上匹配,而是先从图像中恢复或估计出目标的三维结构,再在这个三维空间里做身份判别。
3.1 通俗理解:从“看图猜人”到“看结构认人”
假设你在远处看到一个穿着红衣服的人。第一眼你会靠颜色认人;但如果你能“脑补”出这个人的体型、肩宽、走路姿态、头身比这些三维结构信息,即使他换了一件衣服,你仍然可以识别。VR3D 想做的就是把这种“脑补”显式化:设计一个 3D 重建或 3D 特征提取模块,从 2D 图像中恢复目标的体积、表面或关键点结构,然后让身份分类器基于恢复出的结构信息做判断。
这种思路有一个很直接的好处:当两个视角差异很大时,2D 像素层面的差异非常大,但 3D 结构层面的差异应当很小。模型只需要学会在不同视角之间共享同一个 3D 空间,不需要强制建立像素到像素的对应。
3.2 3D 表示的具体形式
3D 表示学习并非只有一个固定答案。根据不同任务,研究者会选择不同的 3D 数据形式,每种形式都有不同的信息丰富度和计算开销:
| 3D 表示形式 | 基本描述 | 优点 | 缺点 |
|---|---|---|---|
| 体素(Voxel) | 把 3D 空间划分为网格单元,每个单元表示是否被占用 | 结构规整,适合 3D CNN | 分辨率越高内存急剧膨胀,容易稀疏 |
| 点云(Point Cloud) | 用一组 3D 坐标点表示物体表面或体积 | 表达灵活,可配合 PointNet 等网络 | 无序性需要特殊算子,采样不均时效果下降 |
| 网格(Mesh) | 用顶点和面片描述物体表面 | 表面信息丰富,适合渲染监督 | 拓扑结构复杂,难以直接用于分类特征 |
| 隐式表示(SDF/NeRF) | 用一个函数表示空间中每个点的占用或距离 | 连续、内存友好,适合高质量重建 | 推理慢,特征提取需要额外处理 |
| 3D Gaussian Splatting | 用大量三维高斯原语表示场景 | 可实时渲染,图像监督方便 | 参数量大,行人小目标场景稳定性有待验证 |
VR3D 并不强行限定用哪一种,而是围绕“视角鲁棒”这个目标选择或组合合适的表示。从目前学界的发展趋势看,点云、体素和隐式表示在行人重识别里都有应用,3D Gaussian Splatting 也开始被用于跨视角场景生成和特征学习。
3.3 3D 相对 2D 的优势
把问题从 2D 转向 3D,本质上是在为模型补充一个“视角不变约束”。这个约束有以下三个具体作用:
- 补齐自遮挡信息:虽然单张图像无法完整看到身体背面,但 3D 重建过程可以利用人体形状先验,估计出被遮挡部分的大致位置,使特征包含更多结构信息。
- 统一跨视角特征空间:无论输入图像是平视还是俯视,模型输出都落在同一个 3D 坐标或特征空间中,跨视角检索变成同一空间中的最近邻搜索。
- 增强可解释性:2D 特征很难说清“模型为什么觉得他们像”,3D 重建结果可以直接可视化,调试时更容易发现问题。
当然,3D 表示不是银弹。单张 2D 图像反推 3D 结构是典型的病态问题:同一张图像可能对应多种合理的 3D 解释。如果重建质量差,3D 特征反而会引入额外噪声。这也是 VR3D 这类方法真正要解决的难点:如何在 3D 预测不准的情况下仍然保持身份特征的可区分性。
4. VR3D 方法拆解:两阶段还是多任务联合学习
从工程实现的角度看,VR3D 的方法结构可以抽象为几个关键模块:2D 视觉编码器、3D 结构估计器、3D 特征提取器、身份判别头。下面基于公开研究里常见的做法做合理拆解,实际论文实现可能会有差异。
4.1 整体流程
输入一张检测到的行人图像,首先通过一个 2D 骨干网络提取高层特征图,这一步的作用是捕捉外观、纹理、颜色等信息。随后,3D 结构估计器根据 2D 特征预测目标在三维空间中的表示,比如体素占用、点云坐标、深度图加表面法线,或者隐式距离场。接着,3D 特征提取器在这个三维表示上学习一个紧凑向量。最后,身份判别头对这个向量做分类或度量学习。
用伪代码表达:
class VR3DPipeline(nn.Module): def __init__(self, backbone, shape_head, reid_head): super().__init__() self.backbone = backbone # 2D 特征提取 self.shape_head = shape_head # 3D 结构估计 self.reid_head = reid_head # 身份分类头 def forward(self, x): # x: [B, 3, H, W] f_2d = self.backbone(x) # [B, C, h, w] f_3d = self.shape_head(f_2d) # 可能是点云/体素/特征场 # 把 3D 结构压缩成身份特征 feat = self.reid_head(f_3d) # [B, D] return feat, f_3d4.2 2D 分支和 3D 分支如何融合
这里有一个值得注意的设计差异:3D 分支是作为辅助监督,还是作为最终特征的一部分?两种思路各有取舍。
- 如果 3D 和 2D 特征最终拼接或通过注意力融合,模型在推理时可以同时利用外观和结构信息。这种方式对 3D 重建质量的要求更高,因为误差会直接混入最终特征。
- 如果 3D 只作为辅助监督,最终特征仍然来自 2D 分支,那么 3D 的作用是通过重建任务让 2D 特征学习到更多空间结构先验。这种方式更稳定,但视角鲁棒性提升幅度可能有限。
从“View-Robust”这个目标来看,更稳妥的做法是:把 3D 结构作为显式的中间特征之一,同时保留 2D 外观分支,最后用可学习的融合模块决定每个维度应该更信任外观还是结构。关键在于融合后依然要保证跨视角样本在特征空间里距离更近。
4.3 损失函数设计
训练 VR3D 这类模型时,损失函数往往是多任务叠加的,通常包含以下部分:
- 身份分类损失:标准的 cross entropy loss,让特征向量能区分不同行人 ID。
- 度量学习损失:triplet loss 或 contrastive loss,拉近同一个人不同视角样本的距离,推远不同人样本的距离。
- 3D 重建损失:如果 3D 标签可见,直接用 L1 或 Chamfer Distance 监督重建结果;如果没有标签,可以用深度图、姿态图、分割图作为辅助监督。
- 跨视角一致性损失:让同一行人的不同视角图像经过模型后产生接近的 3D 特征。这里可以用 KL 散度、余弦相似度或跨视角对抗损失实现。
一个完整的损失函数表达如下:
import torch.nn.functional as F total_loss = ( ce_loss(logits, pid) + triplet_loss(feat, pid) + 0.1 * recon_loss(pred_3d, gt_3d) + 0.1 * cross_view_loss(feat_ground, feat_aerial) )四个损失的权重需要根据实际数据分布调整。如果 3D 重建质量很差,重建损失权重不宜过高;如果跨视角差异过大,跨视角一致性损失往往是最后效果提升的关键。
5. 数据、标注与跨视角评估设计
3D 表示学习听起来很美好,但工程落地时首先撞上的问题就是数据。传统 ReID 数据集偏重地面视角,Aerial-Ground 数据集的采集成本高,3D 标注更是昂贵。
5.1 数据来源:真实采集还是仿真合成
真实场景中,同时部署无人机和地面摄像头并标注同一批目标,需要做好时间同步、目标匹配和坐标对齐,成本很高。仿真合成是另一个主流途径:用游戏引擎或三维渲染软件生成大量不同视角、不同光照、不同姿态下的行人图像,同时自动产生精确的 3D 标注。
仿真数据的优点是标签便宜、视角可控、场景覆盖广;缺点是域差距。模型在仿真数据上训练后,迁移到真实监控数据时往往会出现性能下降。此时可以引入真实数据做域适应,例如用无监督域适应方法把仿真 3D 知识迁移到真实场景。
5.2 3D 标签不一定需要真 3D
很多团队开始做 VR3D 时会有一个误区:必须拿到高质量 3D 扫描或者动捕数据才能训练。其实不然。
在实现时可以用近似标签替代完整 3D 标注:
- 深度估计结果:用现成的单目深度估计模型给每一帧生成深度图,作为 3D 重建的监督信号。
- 人体关键点:用 2D pose 估计结果推导身体骨架的 3D 方位,辅助网络理解姿态。
- 人体分割 Mask:和背景分离后的 Mask 可以帮助 3D 模块把注意力集中在人体区域,而不是去重建背景。
- 多次视角一致性:如果同一个目标同时被多个地面摄像头拍到,即使没有真 3D 标签,也可以通过多视角一致性约束让 3D 表示更加真实。
从实际经验来看,伪 3D 监督虽然不如真 3D 标签精确,但足以帮助模型学习视角不变的强先验。重点是不要让模型硬记深度图噪声,否则跨视角一致性会比直接学 2D 特征更差。
5.3 评估指标和评估协议
VR3D 的评估不能只用一个全局 mAP。因为 Aerial-Ground 场景里,不同视角组合的难度完全不同。更科学的做法是把测试集按视角差分成多个子集:
- 地面到地面(Ground-Ground):难度最低,相当于传统 ReID。
- 地面到空中(Ground-Aerial):难度较高,双方视角差异大。
- 空中到地面(Aerial-Ground):难度最高,也是这个方向最关心的场景。
- 空中到空中(Aerial-Aerial):难度相对低,但会有更多俯视自遮挡。
评估时分别报告每组子集的 Rank-1、Rank-5 和 mAP,再看整体结果。这样做的好处是:如果模型只在地面子集上强,跨视角子集上差,说明 3D 表示没有真正发挥视角鲁棒作用。只汇报一个整体数字,很容易掩盖这个问题。
6. 一个示意训练管线:PyTorch 风格实现
这一节给出一套可落地的示意代码,用来演示 VR3D 类模型如何组织数据、训练和验证。注意,这不是原论文的完整复现,而是为了把前面讲的模块串起来,方便大家迁移到自己的项目。
6.1 模型定义
先定义一个轻量示意模型。2D 骨干可以用 ResNet50,3D 分支用一个简单的体素预测头,演示“从 2D 特征预测 3D 体素占用”的核心流程。
import torch import torch.nn as nn from torchvision.models import resnet50 class VR3D(nn.Module): def __init__(self, num_classes=1000, feature_dim=512): super().__init__() # 2D 骨干:去掉最后的分类层,输出特征图 backbone = resnet50(pretrained=True) self.backbone = nn.Sequential(*list(backbone.children())[:-2]) self.conv1x1 = nn.Conv2d(2048, 256, 1) # 3D 体素预测头:将 2D 特征图映射为体素占用 self.voxel_head = nn.Sequential( nn.Conv2d(256, 256, 3, padding=1), nn.BatchNorm2d(256), nn.ReLU(inplace=True), nn.Conv2d(256, 64, 3, padding=1), ) # ReID 特征头 self.pool = nn.AdaptiveAvgPool2d((1, 1)) self.embedding = nn.Sequential( nn.Linear(256 + 64, feature_dim), nn.BatchNorm1d(feature_dim), ) self.classifier = nn.Linear(feature_dim, num_classes) def forward(self, x): f_2d = self.backbone(x) # [B, 2048, 16, 8] f_2d = self.conv1x1(f_2d) # [B, 256, 16, 8] voxel_feat = self.voxel_head(f_2d) # [B, 64, 16, 8] pooled_2d = self.pool(f_2d).flatten(1) # [B, 256] pooled_3d = self.pool(voxel_feat).flatten(1) # [B, 64] feat = self.embedding(torch.cat([pooled_2d, pooled_3d], dim=1)) logits = self.classifier(feat) return logits, feat, pooled_3d这个代码中,voxel_head并没有真正输出一个 3D 体素张量,而是从 2D 特征中提取“类似 3D 结构”的高层语义。真正的体素预测需要在空间维度上扩展,比如把[B, 64, 16, 8]的特征图重排为[B, 4, 16, 8, 8]的体素占用。这里保留为示意,重点是让 2D 和 3D 特征联合参与 ReID 特征构建。
6.2 损失函数
接下来定义一个多任务损失,包含身份分类、三元组损失和跨视角一致性损失。跨视角一致性通过计算同一 ID 的 ground-aerial 特征距离实现。
import torch import torch.nn as nn import torch.nn.functional as F def vp_loss(logits, feat, pid, aer_triplet_mask): # 1. 身份分类损失 ce_loss = F.cross_entropy(logits, pid) # 2. 三元组损失,简化为 hard triplet # 这里省略了采样的细节,实际实现中要对 feat 按 pid 分桶。 # 使用 PyTorch 三元组损失函数需要自定义采样器。 triplet_loss = torch.tensor(0.0, requires_grad=True) # 3. 跨视角一致性损失 # 如果同一个 pid 同时有 ground 和 aerial 两个样本, # 拉近它们的 3D 特征;这里用掩码控制配对。 permuted_feat = feat.index_select(0, aer_triplet_mask) consistency_loss = F.mse_loss(feat, permuted_feat) return ce_loss + triplet_loss + 0.5 * consistency_loss注意,三元组损失在 ReID 训练里通常用torch.TripletMarginLoss配合自定义采样器完成。这里的代码只是展示一个可扩展的损失组合方式。实际工程中,跨视角一致性损失可以用更难样本:对同一 ID 的 ground 特征和 aerial 特征,计算所有 pair 距离,只回传最难的正样本对。
6.3 训练配置
模型训练时推荐用下面的 YAML 配置作为起点。具体参数需要根据数据集大小和 GPU 显存调整,不要照搬。
model: name: VR3D backbone: resnet50 feature_dim: 512 pretrained: true data: image_size: [256, 128] batch_size: 64 num_workers: 8 # 如果训练集包含 ground 和 aerial 两类视角,建议每个 batch 中同时采样两种视角 sampler: identity_balanced train: epochs: 120 lr: 0.00035 lr_scheduler: cosine weight_decay: 0.0005 # 视角差异大时,可以调大 consistency_loss 权重 lambda_cls: 1.0 lambda_triplet: 1.0 lambda_consistency: 0.5 eval: metrics: [rank1, rank5, mAP] protocol: cross_view这个配置的关键点是sampler: identity_balanced。训练跨视角 ReID 时,不能简单随机采样,否则一个 batch 里可能全是地面视角或全是空中视角,跨视角一致性损失会失效。更合理的做法是每个 batch 从固定数量的 ID 里采样,每个 ID 尽量同时包含 ground 和 aerial 两种图像。
6.4 运行和验证
训练脚本大致如下:
python train.py \ --config configs/vr3d.yaml \ --gpu 0,1 \ --output_dir ./logs/vr3d训练结束后,在测试集上分别计算 Ground-Ground、Ground-Aerial、Aerial-Ground、Aerial-Aerial 四个子集的 Rank-1 和 mAP。如果 Ground-Aerial 子集的 Rank-1 比传统 2D 方法提升明显,说明 3D 表示确实起作用了。
7. 常见问题与排查方法
下面整理几个在实现 VR3D 类模型时最容易遇到的问题,适合项目初期对照排查。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 3D 分支输出一直是均值 | 3D 重建损失权重过低或标签噪声过大 | 单独打印重建损失数值,可视化重建输出 | 调大重建损失权重,检查伪 3D 标签是否对齐 |
| 跨视角子集提升不明显 | 2D 分支占主导,3D 分支融合权重太低 | 分别用 2D 特征和 3D 特征做检索对比 | 增加 3D 特征在最终向量中的占比,或用注意力融合 |
| GPU 显存不足 | 体素分辨率高、batch 过大 | 查看显存监控和模型参数量 | 降低输入分辨率、减小 batch 或改用点云表示 |
| 训练震荡 | 多任务损失尺度不一致 | 打印每个 loss 量级,观察是否相差 10 倍以上 | 对不同损失做自动权重归一化或调小 dominant loss |
| 推理速度慢 | 3D 重建模块计算量太大 | 用 profiler 统计各模块耗时 | 蒸馏成小模型,或把 3D 分支移到辅助监督位置 |
| 真实数据比仿真数据差很多 | 仿真到真实的域差距 | 对比仿真/真实数据的特征分布 | 加入域适应模块,收集少量真实数据做微调 |
| 小目标识别不到 | 检测框太小,3D 信息不足 | 检查检测环节召回率 | 先提升检测质量,对小目标做超分辨率或切块放大 |
最值得强调的一点是:3D 分支并不能“无中生有”。如果目标在图像里只占十几个像素,任何 3D 重建模块都很难恢复到有效结构信息。所以 Aerial-Ground ReID 的应用前置条件是检测器得先把小目标找出来,并且提供足够清晰的输入。
8. 工程化与部署建议
方法实验能跑通,距离上线还有一段路。这里给出几条工程化建议,尤其适合做安防、智慧城市、机器人巡检的团队。
8.1 模型轻量化
VR3D 类模型包含 2D 骨干和 3D 分支,参数和计算量都比传统 ReID 模型大。如果目标是部署在无人机边缘端或地面 NVR 上,建议先训练大模型,再通过知识蒸馏把 3D 结构约束迁移到轻量模型上。蒸馏时不仅对齐最终特征,也要对齐 3D 分支的中间输出,这样小模型才能继承视角鲁棒能力。
8.2 搜索库设计
Aerial-Ground ReID 不只是“一张图对一张图”的匹配。无人机实时飞到某个区域时,需要和过去半小时内地面摄像头抓拍的所有行人底库做检索。底库可能包含几万甚至几十万个特征向量。实际部署时推荐:
- 离线为所有历史目标提取特征,存入向量数据库。
- 无人机目标实时提取特征后,用近似最近邻检索召回 Top-K。
- 对 Top-K 结果做二次重排,重排时除了 ReID 分数,还要考虑时空约束,比如无人机的飞行动线和地面摄像头视野是否可能存在重叠。
8.3 安全与合规提醒
行人重识别属于面向人物的视觉分析技术,部署到公共区域时必须严格遵守当地法律法规和平台安全规范。上线前要明确数据收集范围、保存期限、使用目的,避免采集和存储无关个人信息。所有模型实验应在授权测试环境完成,不鼓励对非授权数据做大规模爬取和训练。这一点不是套话,而是这类技术真正落地时绕不过去的红线。
8.4 持续迭代
跨视角 ReID 很难做到一次训练一劳永逸。光照、季节、无人机飞行高度、摄像头安装位置都会影响效果。建议在实际场景中持续收集错检样例,形成难例集,并定期重训模型。同时保留模型版本管理,新模型效果回退时能快速回滚到旧版本。
9. 总结与后续学习方向
VR3D 所代表的思路,简单来说就是:在 Aerial-Ground 这种视角差异极大的场景里,2D 外观特征的天花板已经碰到了,3D 表示学习是更本质的解决路径。它把“行人匹配”从像素相关性比较升级为结构一致性比较,让模型在面对俯视、平视、侧视切换时,仍然能围绕人体三维结构找到共性。
不过,3D 表示学习不是把模型改大一点、加一个 3D 头就能自动成功。真正的考验来自三处:第一,3D 结构的预测质量是否稳;第二,2D 外观信息和 3D 结构信息的融合比例是否合理;第三,数据规模和视角覆盖是否足够支撑跨视角学习。如果这三个条件不具备,3D 分支只会成为模型的花瓶。
对于想深入了解的读者,建议从这几个方向继续学习:
- 先跑通一个传统 ReID Baseline(比如 ResNet50 + Triplet Loss),理解特征和损失的基本行为。
- 再给 Baseline 加上一个弱监督 3D 分支,用深度估计或人体分割做辅助损失,观察跨视角指标是否变化。
- 接着引入跨视角一致性损失,专门拉近同一 ID 在不同视角下的特征。
- 如果条件允许,尝试用 3D Gaussian Splatting 或 NeRF 对行人做多视角重建,把渲染得到的多视角图像作为数据增强。
最后提醒一句:不是所有 ReID 场景都需要 3D。如果现有摄像头之间视角差异不大,传统方法已经够用,强行上 3D 只会在推理速度和工程复杂度上吃亏。Aerial-Ground 场景才是 VR3D 这类模型真正的用武之地。判断需求、选择表示、设计损失、验证子集,这四个步骤做好了,跨视角行人重识别项目就已经成功了一大半。