Views
No views yet
| Component | Detail |
|---|---|
| Backbone | dinov2_vitb14 (87M params, 768-dim output) |
| Pooling | GeM (Generalized Mean, p=3.0) or CLS token |
| Projector | 768 -> 256 (Linear) |
| Loss | InfoNCE (temperature=0.07) |
| Embedding dim | 256 |
| LoRA | Optional LoRA on Q/V attention (rank 32-64) |
| Model | Test Top-1 | Test GPS 2500m | Pool | LoRA | Role |
|---|---|---|---|---|---|
| 336_gem_v9d_lora_r64 | 60.8% | 66.4% | GEM | r64 | primary (default single model + ensem... |
| 336_gem_v4 | 56.2% | 63.9% | GEM | — | ensemble member (default pair with v9d) |
| 336_gem_runC_best | 58.1% | 64.9% | GEM | r32 | standalone alternative |
| 518_gem_lora_r32 | 58.1% | 64.9% | GEM | r32 | standalone (518px variant) |
| 336_gem_geo_v1 | 55.0% | 66.6% | GEM | — | best for GPS-constrained deployment |
| 336_gem_v6 | — | — | GEM | — | warm-start base for v9d, runC, 518 |
| gem_warmstart_v2 | — | — | GEM | — | foundational warm-start base |
[
{
"id": "336_gem_v9d_lora_r64",
"weight": 1.0,
"role": "primary"
},
{
"id": "336_gem_v4",
"weight": 1.0,
"role": "secondary"
}
]from gui_app.config import ENSEMBLE_MODELS # already wired1import torch, sys
2sys.path.insert(0, '..') # project root
3from core.model import DINOv2SiameseNetwork, apply_lora
4from core.checkpoint import inspect_checkpoint
5
6path = '336_gem_v9d_lora_r64/336_gem_v9d_lora_r64_best.pth'
7info = inspect_checkpoint(path)
8model = DINOv2SiameseNetwork(
9 backbone=info['backbone'],
10 img_size=info['img_size'],
11 embedding_dim=info['embedding_dim'],
12 aerial_input_dim=info['aerial_input_dim'],
13 pool=info['pool'],
14 dropout=0.0,
15 grad_checkpointing=False,
16)
17
18# Apply LoRA if the checkpoint contains LoRA weights
19ckpt = torch.load(path, map_location='cpu', weights_only=False)
20if any('.attn.qkv.lora_A' in k for k in ckpt['model_state_dict']):
21 args = ckpt.get('args', {})
22 apply_lora(model,
23 rank=args.get('lora_rank', 64),
24 alpha=args.get('lora_alpha', args.get('lora_rank', 64)),
25 target=args.get('lora_target', 'qv'))
26
27model.load_state_dict(ckpt['model_state_dict'])
28model.eval()