Add g2q eval metrics and asymmetric MONA-24 configs

- _evaluate: compute R@K + AP for both directions (q2g and g2q) via inverted
  ground truth; g2q denominator counts only sat-tiles with at least one positive
  drone in the (sub)sampled query set. Surfaces in train.csv, val.csv,
  train_recall.csv, W&B summary, and final log.
- conf/gtauav_balanced_asym.gin: asymmetric WEB+SAT encoders, MONA in all 24
  ViT blocks (~17.6M trainable / ~733M total).
- conf/gtauav_baseline_asym.gin: same architecture, baseline_mode=True for
  Δ R@1 against balanced_asym.
- CLAUDE.md / README.md: document new configs, clarify that g2q is now
  computed (was claimed but missing).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pikaliov
2026-04-25 13:47:02 +03:00
parent 8f8cbb14dd
commit 814586ce3b
5 changed files with 123 additions and 12 deletions

View File

@@ -355,8 +355,22 @@ Gradient checkpointing: DINOv3 (24 blocks) + DGTRS-CLIP (12 blocks)
| logit_scale | 1 | 1 | learnable temperature |
| **Total (shared)** | **432M** | **5.6M (1.30%)** | retrieval dim = 512 |
> **Asymmetric mode** (`--shared-encoder false`): uses separate DINOv3 WEB (drone) + DINOv3 SAT
> **Asymmetric mode** (`shared_encoder=False`): separate DINOv3 WEB (drone) + DINOv3 SAT
> (satellite) encoders with independent MONA adapters. Requires ~4-5 GB more VRAM.
> Use `conf/gtauav_balanced_asym.gin` / `conf/gtauav_baseline_asym.gin` — these set
> `shared_encoder=False` and `mona_last_n_blocks=24` for the full-capacity setup.
### Eval directions
`_evaluate` computes R@1/5/10 and AP (MRR) for both retrieval directions:
| Key | Direction | Notes |
|-----|-----------|-------|
| `r@K_q2g`, `ap_q2g` | drone → satellite (query → gallery) | Denominator: all queries (q2g convention) |
| `r@K_g2q`, `ap_g2q` | satellite → drone (gallery → query) | Denominator: only sat-tiles with ≥1 positive drone in subsample |
g2q is computed via inverted ground truth: for each sat-tile, collect the drone indices
that list it as a valid candidate. `n_scored_g2q` is reported in metrics for transparency.
## Experiments
@@ -385,8 +399,10 @@ Gallery: sat_img -> GeoRSCLIP -> gallery
```
caption-test/
├── conf/ # Gin configs
│ ├── gtauav_balanced.gin # GTA-UAV with text (10 epochs, v3)
│ ├── gtauav_baseline.gin # GTA-UAV baseline, no text (v3)
│ ├── gtauav_balanced.gin # GTA-UAV with text, shared encoder, MONA 12/24 (v3)
│ ├── gtauav_baseline.gin # GTA-UAV baseline, shared, MONA 12/24, no text (v3)
│ ├── gtauav_balanced_asym.gin # GTA-UAV with text, asymmetric WEB+SAT, MONA 24/24
│ ├── gtauav_baseline_asym.gin # GTA-UAV baseline, asymmetric, MONA 24/24, no text
│ ├── gtauav_text_heavy.gin # GTA-UAV text-heavy gate=0.3 (v3)
│ ├── gtauav_image_heavy.gin # GTA-UAV image-heavy gate=0.9 (v3)
│ ├── balanced.gin # UAV-GeoLoc with text (v2)
@@ -485,6 +501,13 @@ python -m src.training.train_gtauav --config conf/gtauav_text_heavy.gin \
# Image-heavy (gate=0.9, 10% text weight)
python -m src.training.train_gtauav --config conf/gtauav_image_heavy.gin \
--filter-meta meta/seg_filter.json --batch-size 48 --epochs 30
# Asymmetric variants: separate WEB (drone) + SAT (satellite) encoders, MONA in all 24 blocks
# Higher capacity (~733M total / ~17.6M trainable), larger VRAM footprint.
python -m src.training.train_gtauav --config conf/gtauav_balanced_asym.gin \
--filter-meta meta/seg_filter.json
python -m src.training.train_gtauav --config conf/gtauav_baseline_asym.gin \
--filter-meta meta/seg_filter.json
```
### 3. Train without gin (CLI-only)