| name | concerto-joint-learning |
| title | Concerto: Joint 2D-3D Self-Supervised Learning Emerges Spatial Representations |
| version | 0.0.2 |
| engine | skillxiv-v0.0.2-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2510.23607 |
| keywords | ["Self-Supervised Learning","Multimodal","Spatial Understanding","3D Vision"] |
| description | Learns richer spatial representations by training on both 2D and 3D data simultaneously. Combines 3D intra-modal self-distillation with 2D-3D cross-modal joint embedding, achieving 14.2% and 4.8% improvements over single-modality baselines in scene understanding and geometric consistency. |
Concerto: Joint 2D-3D Self-Supervised Representation Learning
Human spatial understanding emerges from multiple sensory modalities simultaneously. Concerto mirrors this by learning from paired 2D images and 3D point clouds, discovering representations richer than either modality alone.
The joint learning approach creates spatial features with superior geometric and semantic consistency, improving downstream scene understanding tasks.
Core Concept
Key insight: simultaneous 2D-3D training creates more coherent spatial concepts than training separately. Concerto uses:
- 3D intra-modal self-distillation (learning within 3D point clouds)
- 2D-3D cross-modal joint embedding (aligning image and 3D representations)
- Multi-view consistency to reinforce learned concepts
Architecture Overview
- Separate encoders for 2D and 3D modalities
- Cross-modal contrastive learning between image and 3D features
- Intra-modal self-distillation within 3D representations
- Multi-view consistency constraints across modalities
Implementation Steps
Create dual-stream encoders for 2D and 3D data. Each stream learns modality-specific representations while staying aligned through contrastive loss:
class ConcertoEncoder(nn.Module):
def __init__(self, feature_dim=256):
super().__init__()
self.image_encoder = ViT(
patch_size=16,
num_layers=12,
hidden_dim=768
)
self.pointcloud_encoder = PointNet(
num_layers=4,
feature_dim=feature_dim
)
self.image_proj = nn.Sequential(
nn.Linear(768, 512),
nn.ReLU(),
nn.Linear(512, feature_dim)
)
.pc_proj = nn.Sequential(
nn.Linear(feature_dim, ),
nn.ReLU(),
nn.Linear(, feature_dim)
)
():
image_feat = .image_encoder(images)
pc_feat = .pointcloud_encoder(point_clouds)
image_proj = .image_proj(image_feat)
pc_proj = .pc_proj(pc_feat)
image_proj, pc_proj