Init refactor branch

This commit is contained in:
pikaliov
2026-04-27 11:57:29 +03:00
parent c6fcd2222c
commit a27b5a7357
3 changed files with 593 additions and 4 deletions

View File

@@ -0,0 +1,158 @@
# Диагностика: коллапс recall на эпохе 1 — DSS + MoCo queue
**Дата:** 2026-04-25
**Конфиг:** `conf/gtauav_balanced.gin` (gate=0.7, with text)
**Запуск:** `python -m src.training.train_gtauav --config conf/gtauav_balanced.gin --filter-meta meta/seg_filter.json`
---
## 1. Симптомы из лога
### Метрики по эпохам
| Эпоха | Режим сэмплера | LR | train loss | train R@1 | val R@1 | val AP | eval loss |
|---|---|---|---|---|---|---|---|
| **ep0** | mutex-only (warmup) | 5.00e-05 | 4.2239 | **0.0742** | 0.0758 | 0.1511 | 2.0783 |
| **ep1** | DSS активирован, MoCo queue полная | 1.00e-04 | 4.4218 ↑ | **0.0120** ↓6× | 0.0107 | 0.0328 | 2.0786 |
### Ключевые наблюдения
- **Recall обвалился ровно на эпохе включения DSS** (warmup=1, поэтому DSS стартует на ep1)
- **Train loss выросла** (4.22 → 4.42), хотя должна падать
- **Eval loss практически стоит** (2.0783 → 2.0786) — модель не учится на чистом батч-сигнале
- **Разрыв train/eval loss > 2×** — большая часть train loss идёт от MoCo+hard-mining компонент, не от in-batch contrast
- Gate stable: `gate_q=0.70`, `gate_g=0.70` (текст не вытаскивает дополнительный градиент)
- `tau=0.07` (clamped, learnable, но почти не двигается → loss не учит температуру)
### Сбой при сохранении чекпойнта
```
RuntimeError: [enforce fail at inline_container.cc:668] .
unexpected pos 289048128 vs 289048016
```
**Причина:** диск переполнен (ENOSPC). Подтверждено независимо: `mkdir` в session-env тоже падает с ENOSPC. Это инфраструктурный баг, не алгоритмический — но он не даёт сохранить состояние и продолжить.
---
## 2. Почему DSS «не работает» на этом этапе
### 2.1. Mutex-constraint спасает от false negatives только формально
Mutex исключает дронов с пересекающимися `sat_candidates`. Но DSS специально пакует **визуально похожих** дронов — у которых sat-кандидаты могут быть *разными tiles*, но при этом сцены практически идентичные:
- один и тот же район Лос-Сантоса
- та же высота полёта
- та же time-of-day, та же погода (синтетика GTA-V)
Для холодного энкодера такие «negatives» неотличимы от позитива → softmax пытается развести то, что развести нечем → градиенты шумные и противоречивые.
### 2.2. Re-embed раз в эпоху — слишком редко в начале обучения
- На ep1 LR удваивается (5e-5 → 1e-4 после warmup)
- Encoder за эпоху смещается сильно (MONA-адаптеры учатся быстро)
- Батчи внутри эпохи собираются по embeddings, посчитанным **до** этих обновлений
- То есть «similarity» в DSS — это similarity **вчерашнего** энкодера
- Re-embed на ep1 занял 313s, но между двумя re-embed encoder успевает измениться существенно
### 2.3. Эпохи 0 на mutex-only недостаточно как warmup
- К моменту запуска DSS R@1=0.074 на полной gallery (~2684 уникальных тайлов)
- Random baseline ≈ 1/2684 ≈ 0.0004
- 0.074 — это «модель чуть-чуть оторвалась от случая», но качество embeddings ещё недостаточно
- DSS усиливает шум, а не сигнал: «визуально похожих» определяет *шумный* энкодер
---
## 3. Почему MoCo queue делает хуже
### 3.1. Representation drift в queue
- Queue хранит **4096 embeddings**, посчитанных в разные моменты времени разными версиями encoder
- На ep01, когда MONA-адаптеры учатся быстро, разница между «свежим» и «3 шага назад» embedding'ом — заметная
- Эти устаревшие негативы дают сигнал в направлении, в котором энкодер уже не находится
- Без momentum encoder (как в оригинальном MoCo) drift ничем не сглажен
### 3.2. `hard_mining_k=512` амплифицирует ошибку queue
- Из 4096 берутся 512 «самых трудных»
- «Трудность» меряется в **текущем** feature space
- Сами вектора лежали там в **старом** feature space
- На холодном энкодере это эквивалентно «учиться отличать себя-позитива от себя-вчерашнего»
- Loss растёт, recall падает
### 3.3. Тройная hard-negative композиция → collapse-режим
Все три механизма независимо подсовывают «трудные» негативы:
| Механизм | Источник трудности |
|---|---|
| DSS | визуально близкие в батче |
| Mutex sampler | in-batch contrast после фильтра |
| `hard_mining_k=512` | top-K из MoCo queue |
На warm encoder это polish; на cold encoder это **too-hard negatives problem** (известная failure mode у contrastive learning, Robinson et al., 2021):
- Модель не получает «лёгких» примеров, на которых формируется базовое embedding-пространство
- Градиенты толкают её в произвольных направлениях
- Embedding space коллапсирует или размывается
---
## 4. Подтверждения из истории коммитов
```
8f8cbb1 Diagnostic baseline v2: also disable MoCo queue
c25bd64 Diagnostic baseline: disable DSS + hard mining, fresh output dir
9a7fbff Fix plot_combined: fallback from 'total' to 'train_loss'
70f1617 Fix autograd in-place error: move memory-bank enqueue after backward
8197ab2 Fix training loop: only pass positive_weights to WeightedInfoNCELoss
```
Подозрение на DSS+MoCo уже было — текущие числа подтверждают его эмпирически.
---
## 5. Рекомендации
### 5.1. Cold-start curriculum (приоритет)
1. **Несколько эпох mutex-only без MoCo и без hard_mining** до R@1 хотя бы ~0.2 на train.
- Конкретно: `sampler_type="mutex"`, `loss.use_memory_bank=False`, `loss.hard_mining_k=0`.
2. Затем **включить MoCo queue с warm-up**: либо momentum encoder, либо queue pre-fill 1 эпоху со `stop_grad` на queue updates.
3. **DSS включать только после** того, как embeddings стали discriminative (R@1 на train > 0.2). Иначе «similar» = «random».
4. **`hard_mining_k` стартует с 0** и поднимается curriculum-схемой (например, 0 → 64 → 256 → 512 по эпохам).
### 5.2. Изменения по DSS
- Сократить интервал re-embed (раз в N шагов, не раз в эпоху) — минимум первые 2-3 эпохи
- Или временно фиксировать кеш embeddings из чистого baseline (без DSS) и использовать его как «референсный» для сэмплинга
### 5.3. Изменения по MoCo
- Добавить momentum encoder (EMA на ключи, как в оригинальном MoCo) — это решает drift
- Либо очищать queue на каждой эпохе (теряем эффект, но избегаем drift)
- Размер queue 4096 при batch 64 → 64 батча в очереди = слишком долгая история для холодного энкодера
### 5.4. Инфраструктура
- **Освободить диск** (ENOSPC блокирует чекпойнты и часть утилит)
- Возможно, перенести `out/gtauav/` на другой диск или почистить старые runs
- Добавить pre-flight disk check перед `torch.save`
---
## 6. План эксперимента для подтверждения
| Run | Sampler | MoCo queue | hard_mining_k | Цель |
|---|---|---|---|---|
| **A** (clean baseline) | mutex | off | 0 | Подтвердить, что без DSS/MoCo recall растёт нормально |
| **B** (only MoCo) | mutex | on | 0 | Изолировать вклад queue |
| **C** (only hard_mining) | mutex | on | 512 | Изолировать вклад top-K mining |
| **D** (only DSS) | dss | off | 0 | Изолировать вклад DSS |
| **E** (full, current) | dss | on | 512 | Reproduce coллапс |
Decision rule:
- Если A учится нормально (R@1 растёт монотонно), а E коллапсирует — это decisive ablation
- Если B/C/D по отдельности тоже коллапсируют — проблема в каждом компоненте
- Если только E коллапсирует — проблема в композиции
---
## 7. Альтернативная гипотеза (менее вероятная)
LR=1e-4 на проекциях после warmup может быть слишком большим для shared DINOv3 + MONA с малым trainable %. Симптомы похожи (резкий обвал на эпохе с полным LR), но не объясняют, почему mutex-only baseline (commit `c25bd64`) учится нормально без изменения LR. Так что это вторичный фактор.
---
## 8. Резюме
**Главный диагноз:** связка `DSS + MoCo queue + hard_mining_k=512` создаёт **too-hard negatives problem** на холодном энкодере. Каждый компонент по отдельности рассчитан на warm encoder; их композиция на ep1 (когда R@1 ещё ~0.07) делает задачу нерешаемой и приводит к коллапсу embedding space.
**Решение:** curriculum — сначала mutex+CE без queue/mining до R@1≈0.2, потом постепенно включать остальные механизмы.
**Блокер:** диск переполнен (ENOSPC), без освобождения места дальнейшее обучение и сохранение чекпойнтов невозможно.

View File

@@ -0,0 +1,431 @@
# АНАЛИЗ ДАТАСЕТА: GTA-UAV (LR)
**Дата анализа:** 2026-04-21
**Метод:** Эмпирический анализ данных на диске + статья arXiv:2409.16925 + GitHub-репозиторий авторов
**Путь к данным:** `/home/servml/Документы/datasets/GTA-UAV-LR/`
**Путь к аугментациям:** `/home/servml/Документы/datasets/GTA-UAV-LR-aug/`
---
## 1. МЕТАДАННЫЕ
| Поле | Значение |
|------|----------|
| Полное название | Game4Loc: A UAV Geo-Localization Benchmark from Game Data |
| Авторы | Yuxiang Ji, Boyong He, Zhuoyue Tan, Liaoni Wu |
| Год, Venue | 2025, AAAI 2025 (Oral), arXiv:2409.16925 [cs.CV] |
| Код | https://github.com/Yux1angJi/GTA-UAV (Python, PyTorch) |
| Данные | HuggingFace / BaiduDisk (пароль: gtav) |
| Лицензия | Apache 2.0 |
| Общий объём на диске | **~26 GB** (LR); HR-версия ~143 GB |
---
## 2. ОБЩАЯ СТАТИСТИКА
### 2.1. Сводка
| Параметр | Значение |
|----------|----------|
| Drone-изображений (query) | **33 763** |
| Спутниковых тайлов (DB) | **14 640** (4 уровня зума) |
| Всего изображений | **48 403** |
| Покрытая территория | **81.3 км²** (один непрерывный регион) |
| Сцена | Лос-Сантос (GTA V) — городская + природная среда |
| Номинальных высот | 6 (100, 200, 300, 400, 500, 600 м) |
| Направлений камеры (yaw) | **361 уникальное** значение (произвольные углы) |
| Тип данных | **Синтетика** (рендеринг в игровом движке GTA V) |
### 2.2. Разбиения
Датасет предоставляет **два протокола** оценки:
| Протокол | Train | Test | Метод разбиения |
|----------|-------|------|-----------------|
| Same-area | 26 964 (80.0%) | 6 744 (20.0%) | По изображениям в пределах одного региона |
| Cross-area | 15 693 (46.5%) | 18 015 (53.5%) | По географическим подрегионам |
**Same-area:** train и test из одной и той же территории, без пересечений по изображениям.
**Cross-area:** train и test из непересекающихся географических зон — более сложный и реалистичный сценарий.
### 2.3. Распределение по номинальным высотам
| Номинальная высота | Same-area train | Same-area test | Всего | Доля |
|-------------------|----------------|---------------|-------|------|
| 100 м | 4 248 | 1 072 | 5 320 | 15.8% |
| 200 м | 4 572 | 1 162 | 5 734 | 17.0% |
| 300 м | 4 546 | 1 138 | 5 684 | 16.9% |
| 400 м | 4 615 | 1 162 | 5 777 | 17.1% |
| 500 м | 4 598 | 1 171 | 5 769 | 17.1% |
| 600 м | 4 385 | 1 039 | 5 424 | 16.1% |
| **Итого** | **26 964** | **6 744** | **33 708** | 100% |
Распределение по высотам **равномерное** (~1617% на каждую номинальную высоту).
---
## 3. ИСТОЧНИКИ ИЗОБРАЖЕНИЙ
### 3.1. Дроновые виды (query)
| Параметр | Значение |
|----------|----------|
| Платформа | **Синтетический рендеринг** (GTA V / DeepGTAV) |
| Тип съёмки | RGB, near-nadir (камера ≈90° вниз, cam_roll ≈ -90°) |
| Разрешение (LR) | **512x384 px** |
| Разрешение (HR) | 1920x1440 px |
| Pitch камеры | ≈-90° (вертикально вниз), drone_pitch ±10° |
| Roll дрона | ±20° (реалистичные вибрации) |
| Yaw (heading) | Произвольные углы 0°360° (361 уникальное значение) |
| Формат | PNG |
### 3.2. Спутниковые виды (DB)
| Параметр | Значение |
|----------|----------|
| Платформа | Спутниковые тайлы (стиль Google Maps) |
| Формат | PNG |
| Разрешение тайлов | **256x256 px** (все уровни зума) |
| Количество тайлов | **14 640** |
| Уровни зума | 4 уровня (4, 5, 6, 7) |
### 3.3. Мультимасштабная тайловая сетка
Спутниковые данные организованы как **пирамида зум-уровней** — каждый следующий уровень удваивает разрешение:
| Зум | Cols x Rows | Тайлов | Масштаб (относительно zoom 7) |
|-----|-------------|--------|------------------------------|
| 4 | 11 x 16 | 176 | 1/8 |
| 5 | 22 x 32 | 704 | 1/4 |
| 6 | 43 x 64 | 2 752 | 1/2 |
| 7 | 86 x 128 | 11 008 | 1/1 (базовый) |
| **Итого** | | **14 640** | |
Все сетки заполнены на **100%** (нет пропущенных тайлов).
**Общий размер карты** (zoom 7): 86 × 256 = **22 016 px** по ширине, 128 × 256 = **32 768 px** по высоте.
Именование тайлов: `{zoom}_{0}_{X}_{Y}.png` (пример: `7_0_42_63.png`).
---
## 4. ПАРАМЕТРЫ СЪЁМКИ ДРОНОВ
### 4.1. Фактические высоты полёта
Номинальные высоты (из имени файла) **не совпадают** точно с фактическими — это реалистичный эффект рельефа:
| Номинальная | Фактический диапазон | Среднее | Кол-во |
|-------------|---------------------|---------|--------|
| 100 м | 24.9 444.9 м | 93.9 м | 5 320 |
| 200 м | 34.3 548.4 м | 193.9 м | 5 734 |
| 300 м | 31.0 648.9 м | 294.3 м | 5 684 |
| 400 м | 33.4 746.0 м | 395.2 м | 5 777 |
| 500 м | 44.9 930.4 м | 494.9 м | 5 769 |
| 600 м | 82.1 988.1 м | 593.6 м | 5 424 |
**Общий диапазон фактических высот:** 24.9 988.1 м (среднее 345.3 м).
Большой разброс объясняется тем, что высота задаётся **над уровнем моря**, а рельеф варьируется.
### 4.2. Ориентация камеры (attitude)
| Параметр | Среднее | Диапазон |
|----------|---------|----------|
| Drone roll (|abs|) | 3.99° | 0° 20° |
| Drone pitch (|abs|) | 3.87° | 0° 10° |
| Cam roll | -90.0° | -110° -71.2° |
| Drone yaw | произвольный | -180° +180° (361 уникальное значение) |
Камера направлена **вертикально вниз** (cam_roll ≈ -90°), с реалистичными отклонениями дрона по roll/pitch.
### 4.3. Классификация углов (для обучения)
В CSV-файлах `*_class_angle.csv` yaw дискретизирован в **4 класса** (квадранты):
| Класс | Диапазон | Кол-во (cross-area train) |
|-------|----------|--------------------------|
| 0 | 0°90° | 7 871 |
| 1 | 90°180° | 7 637 |
| 2 | 180°270° | 7 650 |
| 3 | 270°360° | 7 834 |
Распределение по квадрантам **равномерное**.
---
## 5. ПРОСТРАНСТВЕННОЕ ПОКРЫТИЕ
### 5.1. Зона дронов в координатах карты
| Параметр | Значение |
|----------|----------|
| Диапазон X (zoom 7) | 606 6 068 px (охват ~5 462 px) |
| Диапазон Y (zoom 7) | 1 330 9 735 px (охват ~8 405 px) |
| Покрытие карты | 5 462 / 22 016 × 8 405 / 32 768 ≈ **6.4%** площади zoom-7 карты |
Дрон-изображения сконцентрированы в определённом подрегионе карты, при этом **вся** карта (100% тайлов) доступна как DB.
### 5.2. Регион
| Параметр | Значение |
|----------|----------|
| Источник | Карта Лос-Сантос (GTA V) |
| Площадь | 81.3 км² |
| Типы ландшафта | Город, пригороды, горы, побережье, леса, пустыня |
| Координатный охват | Синтетические координаты (x, y в пикселях карты) |
---
## 6. АННОТАЦИИ И МЕТАДАННЫЕ
### 6.1. Файлы аннотаций
| Файл | Содержание | Формат |
|------|-----------|--------|
| `same-area-drone2sate-train.json` | Same-area train: 26 964 записей | JSON (list of dicts) |
| `same-area-drone2sate-test.json` | Same-area test: 6 744 записей | JSON |
| `cross-area-drone2sate-train.json` | Cross-area train: 15 693 записей | JSON |
| `cross-area-drone2sate-test.json` | Cross-area test: 18 015 записей | JSON |
| `*_drone_meta.csv` | Метаданные дрона (height, yaw, roll, pitch) | TSV |
| `*_drone_meta_new.csv` | Обновлённые метаданные | TSV |
| `*_class_angle.csv` | Класс угла yaw (03) | CSV |
| `back_csv/` | Обратные CSV-файлы для cross-area | Директория |
### 6.2. Структура JSON-записи
```json
{
"drone_img_dir": "drone/images",
"drone_img_name": "400_0001_0000022427.png",
"drone_loc_x_y": [1268.6, 6326.8],
"sate_img_dir": "satellite",
"pair_pos_sate_img_list": ["5_0_3_18.png"],
"pair_pos_sate_weight_list": [0.521],
"pair_pos_sate_loc_x_y_list": [[1209.6, 6393.6]],
"pair_pos_semipos_sate_img_list": ["4_0_1_9.png", "5_0_3_17.png", ...],
"pair_pos_semipos_sate_weight_list": [0.174, 0.146, ...],
"pair_pos_semipos_sate_loc_x_y_list": [[1036.8, 6566.4], ...],
"drone_metadata": {
"height": 356.92,
"drone_roll": -3.66,
"drone_pitch": -4.81,
"drone_yaw": -86.0,
"cam_roll": -93.66,
"cam_pitch": -4.81,
"cam_yaw": -86.0
}
}
```
### 6.3. Типы аннотаций
| Тип аннотации | Наличие | Комментарий |
|---------------|---------|-------------|
| Координаты drone (x, y) | **Да** | В пространстве карты (zoom 7) |
| Высота дрона (altitude) | **Да** | В метрах, 6 номинальных уровней |
| Heading angle (yaw) | **Да** | Произвольные углы -180°...+180° |
| Pitch / Roll | **Да** | Drone и Camera отдельно |
| Positive pairs | **Да** | С весами IoU overlap |
| Semi-positive pairs | **Да** | Множественные, с весами |
| Координаты тайлов (x, y) | **Да** | Центры тайлов в пространстве карты |
| GPS-координаты | **Нет** | Синтетическая карта |
| Depth maps | Нет | — (но сгенерированы в aug) |
| Segmentation masks | Нет | — (но сгенерированы в aug) |
| Bounding boxes | Нет | — |
| Временная метка | Нет | — |
---
## 7. РАСПРЕДЕЛЕНИЕ POSITIVE / SEMI-POSITIVE ПАР
### 7.1. Positive matches (точные)
| Positives на query | Кол-во | Доля |
|-------------------|--------|------|
| 0 | 16 297 | 48.3% |
| 1 | 16 505 | 49.0% |
| 2 | 906 | 2.7% |
**~48% query не имеют точного positive** — это ключевая особенность датасета. Авторы моделируют реалистичный сценарий, когда дрон-изображение может не иметь точно совпадающего спутникового тайла.
### 7.2. Semi-positive matches (частичное перекрытие)
| Semi-positives | Кол-во | Доля |
|----------------|--------|------|
| 1 | 93 | 0.3% |
| 2 | 1 538 | 4.6% |
| 3 | 7 301 | 21.7% |
| 4 | 7 290 | 21.6% |
| 5 | 8 135 | 24.1% |
| 6 | 6 685 | 19.8% |
| 7 | 2 168 | 6.4% |
| 8 | 369 | 1.1% |
| 910 | 129 | 0.4% |
**Среднее число semi-positives на query:** 4.58
В отличие от UAV-GeoLoc (где ~94% query имеют ровно 4 positive), здесь распределение гораздо более **вариативное** (от 1 до 10 semi-positives).
### 7.3. Уникальные спутниковые тайлы в парах
Из 14 640 спутниковых тайлов, в positive/semi-positive парах задействовано **4 266** уникальных тайлов (29.1%).
Распределение по зумам среди используемых:
| Зум | Тайлов в парах | Из общего числа |
|-----|---------------|-----------------|
| 4 | 83 | 47.2% |
| 5 | 279 | 39.6% |
| 6 | 886 | 32.2% |
| 7 | 3 018 | 27.4% |
---
## 8. АУГМЕНТИРОВАННЫЙ НАБОР (GTA-UAV-LR-aug)
**Путь:** `/home/servml/Документы/datasets/GTA-UAV-LR-aug/`
**Объём:** ~71 GB
### 8.1. Сгенерированные модальности
| Модальность | Модель | Drone | Satellite | Итого |
|-------------|--------|-------|-----------|-------|
| Depth | DA3-LARGE-1.1 | 33 763 | 14 640 | 48 403 |
| CHM (Canopy Height) | DINOv3-ViTL16-CHMv2 | 33 763 | 14 640 | 48 403 |
| Edge | Sobel from depth (CPU) | 33 763 | 14 640 | 48 403 |
| Segmentation | SegEarth-OV3 | 33 763 | 14 640 | 48 403 |
### 8.2. Параметры пайплайна
| Параметр | Значение |
|----------|----------|
| Версия пайплайна | 4.0.0-dir-layout |
| Размер DB-изображений | 256 px |
| Размер query-изображений | 512 px |
| Профиль GPU | RTX 4090 |
| Сохранение safetensors | Да |
| Дата генерации | 2026-04-19 |
### 8.3. Классы сегментации (17 промптов)
background, building, road, vegetation, water, sand and gravel ground, rocky terrain, farmland, railway, parking lot, sidewalk, bare soil and plowed field, roof and rooftop, sports field and playground, muddy ground and wetland, embankment and levee, swimming pool
### 8.4. Дополнительные форматы
| Директория | Содержание |
|-----------|-----------|
| `npy/` | Предвычисленные NumPy-массивы (chm, depth, edge, segm) |
| `safetensors/` | Эмбеддинги (drone, satellite) |
---
## 9. СРАВНЕНИЕ С UAV-GeoLoc И UAV-VisLoc
| Параметр | GTA-UAV (LR) | UAV-GeoLoc | UAV-VisLoc |
|----------|-------------|-----------|-----------|
| Тип данных | **Синтетика** (GTA V) | **Синтетика** (Google Earth Studio) | **Реальные** БПЛА |
| Drone-изображений | 33 763 | 652 744 | 6 774 |
| DB-изображений | 14 640 | 274 683 | 0 (нужно нарезать) |
| Всего изображений | 48 403 | 927 427 | 6 774 + 11 карт |
| Разрешение drone | **512x384** | 512x512 | 3976x2652 / 3000x2000 |
| Разрешение DB | **256x256** | 100x100 1000x1000 | N/A (целые карты) |
| Высоты полёта | 25988 м (6 номинальных) | 100, 125, 150 м | 4052572 м |
| Heading (yaw) | Произвольные (361 значение) | 8 × 45° | Произвольные |
| Регионы | 1 (Лос-Сантос, GTA V) | 372 сцены, 11 стран | 11 маршрутов, 7 провинций Китая |
| Сцен/маршрутов | 1 непрерывная карта | 372 | 11 |
| Площадь покрытия | 81.3 км² | Варьируется | Варьируется |
| Positive pairs | Да (с весами IoU) | Да (positive.json) | Нет (нужно по GPS) |
| Semi-positive pairs | Да (с весами IoU) | Да (semi_positive.json) | Нет |
| % query без positive | **48.3%** | ~1.2% | — |
| Avg semi-positives | 4.58 | ~2.83 | — |
| Split протоколы | Same-area + Cross-area | Terrain / Country / All | По изображениям (~75/25) |
| Мультимасштабность DB | **Да** (4 зум-уровня) | Нет (фиксированный размер) | Нет |
| Temporal gap | **Нет** (одновременно) | Нет | 25 лет |
| Лицензия | Apache 2.0 | CC BY-NC 4.0 | Не указана |
| Объём на диске | ~26 GB (LR) | ~181 GB | ~16.4 GB |
### Ключевые отличия GTA-UAV:
1. **Непрерывная территория** — одна большая карта 81.3 км², а не набор дискретных сцен. Это позволяет моделировать реальный сценарий навигации.
2. **Мультимасштабные тайлы** — 4 уровня зума (47) vs единый размер кропов в UAV-GeoLoc.
3. **Частичные совпадения** — 48% query не имеют точного positive, что моделирует реалистичный сценарий, когда дрон находится между тайлами. Используются **веса IoU** вместо бинарных меток.
4. **Широкий диапазон высот** — 6 номинальных уровней (100600 м) vs 3 уровня (100150 м) в UAV-GeoLoc.
5. **Произвольные углы** — 361 уникальное значение yaw vs 8 дискретных (шаг 45°) в UAV-GeoLoc.
6. **Два протокола оценки** — same-area (проще) и cross-area (реалистичнее) vs terrain/country/all splits в UAV-GeoLoc.
---
## 10. ПОЛНАЯ СТРУКТУРА ДАННЫХ
```
GTA-UAV-LR/ # ~26 GB
├── README.md # Описание датасета
├── drone/
│ └── images/
│ ├── 100_0001_0000000000.png # 512x384
│ ├── 100_0001_0000000001.png
│ ├── ...
│ ├── 200_0001_XXXXXXXXXX.png
│ ├── ...
│ └── 600_0001_XXXXXXXXXX.png # 33 763 файлов
├── satellite/
│ ├── 4_0_0_0.png # 256x256, zoom 4
│ ├── 4_0_0_1.png
│ ├── ... # 176 тайлов zoom 4
│ ├── 5_0_0_0.png # 704 тайлов zoom 5
│ ├── ...
│ ├── 6_0_0_0.png # 2 752 тайлов zoom 6
│ ├── ...
│ ├── 7_0_0_0.png # 11 008 тайлов zoom 7
│ └── ... # 14 640 файлов итого
├── same-area-drone2sate-train.json # 26 964 записей
├── same-area-drone2sate-test.json # 6 744 записей
├── cross-area-drone2sate-train.json # 15 693 записей
├── cross-area-drone2sate-test.json # 18 015 записей
├── cross-area-drone2sate-train_drone_meta.csv # TSV: img, height, yaw, roll, pitch
├── cross-area-drone2sate-test_drone_meta.csv
├── cross-area-drone2sate-train_drone_meta_new.csv # Обновлённые метаданные
├── cross-area-drone2sate-test_drone_meta_new.csv
├── cross-area-drone2sate-train_class_angle.csv # CSV: img, angle_class (0-3)
├── cross-area-drone2sate-test_class_angle.csv
└── back_csv/ # Обратные CSV для cross-area
├── cross-area-drone2sate-train_class_angle.csv
└── cross-area-drone2sate-test_class_angle.csv
GTA-UAV-LR-aug/ # ~71 GB (аугментации)
├── manifest.json # Метаданные пайплайна
├── pipeline.log
├── depth/ # DA3-LARGE-1.1
│ ├── drone/images/ (33 763 файлов)
│ └── satellite/ (14 640 файлов)
├── chm/ # DINOv3-ViTL16-CHMv2
│ ├── drone/images/ (33 763 файлов)
│ └── satellite/ (14 640 файлов)
├── edge/ # Sobel from depth
│ ├── drone/images/ (33 763 файлов)
│ └── satellite/ (14 640 файлов)
├── segm/ # SegEarth-OV3, 17 классов
│ ├── drone/images/ (33 763 файлов)
│ └── satellite/ (14 640 файлов)
├── npy/ # NumPy массивы
│ ├── chm/
│ ├── depth/
│ ├── edge/
│ └── segm/
└── safetensors/ # Предвычисленные эмбеддинги
├── drone/
└── satellite/
```

View File

@@ -34,10 +34,10 @@ TrainConfigGTAUAV.label_smoothing = 0.1
TrainConfigGTAUAV.learnable_temperature = True
TrainConfigGTAUAV.weight_q2g = 0.6
TrainConfigGTAUAV.weight_g2q = 0.4
TrainConfigGTAUAV.neg_bank_size = 4096
TrainConfigGTAUAV.neg_bank_size = 0 # 4096
# ---- Sampling ----
TrainConfigGTAUAV.sampler_type = "dss" # "dss" or "mutex"
TrainConfigGTAUAV.sampler_type = "mutex" # "dss" or "mutex"
TrainConfigGTAUAV.dss_warmup_epochs = 1 # first N epochs use mutex-only (untrained embeds not useful)
TrainConfigGTAUAV.dss_reembed_every = 1
TrainConfigGTAUAV.use_mutex_sampler = True # legacy flag, kept True unless disabling both samplers
@@ -48,7 +48,7 @@ TrainConfigGTAUAV.output_dir = "out/gtauav/with_text"
# ---- Tracking ----
TrainConfigGTAUAV.use_wandb = False
TrainConfigGTAUAV.use_tb = True
TrainConfigGTAUAV.use_gradcam = True
TrainConfigGTAUAV.use_gradcam = False
TrainConfigGTAUAV.gradcam_every = 5
TrainConfigGTAUAV.use_profiler = False
TrainConfigGTAUAV.log_grad_norms = True
@@ -61,4 +61,4 @@ InfoNCELoss.weight_q2g = 0.6
InfoNCELoss.weight_g2q = 0.4
InfoNCELoss.tau_min = 0.01
InfoNCELoss.tau_max = 0.1
InfoNCELoss.hard_mining_k = 512 # 0 = use whole queue (disable mining)
InfoNCELoss.hard_mining_k = 0 # 512 # 0 = use whole queue (disable mining)