# CLAUDE.md

## Что это за проект

Пайплайн автоматической генерации 4 вспомогательных модальностей (depth, edges, segmentation, canopy height) из RGB-изображений аэрофотоснимков. Используется для подготовки обучающих данных для NADEZHDA — системы cross-view geolocalization (БПЛА ↔ спутник).

## Быстрый старт

```bash
# World-UAV (973K images, основной датасет)
python -m src.main

# UAV_VisLoc (81K images)
python scripts/run_uav_visloc.py

# GTA-UAV-LR (48K images, synthetic GTA V)
python scripts/run_gta_uav.py

# Тесты (149 шт, без GPU)
python -m pytest src/tests/ -v
```

## Поддерживаемые датасеты

| Датасет | Изображения | Тип | Скрипт |
|---|---|---|---|
| World-UAV | 973K | Реальные аэрофото, 27 terrain, 11 стран | `python -m src.main` |
| UAV_VisLoc | 81K | Реальные, 11 сцен, DB + drone | `python scripts/run_uav_visloc.py` |
| GTA-UAV-LR | 48K | Синтетика GTA V, 6 высот полёта | `python scripts/run_gta_uav.py` |

## Ключевые решения

- **Формат выхода:** SafeTensors (zero-copy mmap, ~0.1ms чтение). Не NPY, не PNG, не `.pt`.
- **Структура директорий:** модальность = папка (`depth/`, `edge/`, `segm/`, `chm/`, `safetensors/`), не суффикс файла.
- **Стадии последовательно** — одна модель в GPU за раз (экономия VRAM).
- **Сегментация:** SegEarth-OV3 (SAM 3.1 + open-vocabulary prompts). **17 unified классов** для всех датасетов (единые ID для transfer learning).
- **Post-processing:** два правила после SegEarth — dark water fix (mean<0.24, std<0.18 → water; satellite bg 57%→5%) и wetland reclassify (GTA-UAV: ложный wetland 14%→0%).
- **CHMv2 только FP32** — в FP16 NaN.

## Структура кода

```
src/main.py              — точка входа, оркестрация стадий
src/augmentor/inference.py — инференс + postprocess_segmentation()
src/augmentor/io_utils.py  — I/O, SafeTensors, палитра 17 классов
src/augmentor/dataset.py   — discovery, filtering (DB/query/drone/satellite)
src/conf/                  — gin-configurable dataclasses
src/nn/                    — вендорированные DA3 + SegEarth-OV3
scripts/seg_classes.py     — UNIFIED_PROMPTS (17 классов, единый источник)
scripts/run_*.py           — скрипты запуска для каждого датасета
in/config_files/           — gin-конфиги
docs/                      — документация
```

## Конфигурация

Все параметры через gin. CLI override: `--gin "PipelineConfig.source = 'db'"`.

Для нового датасета — создать скрипт в `scripts/` (пример: `run_gta_uav.py`).

Ключевые флаги pipeline:
- `seg_fix_dark_water=True` — автоматически исправлять тёмную воду (по умолчанию вкл.)
- `seg_reclassify_wetland=False` — переклассификация wetland в vegetation/bare soil (вкл. для GTA-UAV)

## Что НЕ делать

- Не менять порядок/ID классов в `scripts/seg_classes.py` — все датасеты зависят от фиксированных ID.
- Не использовать `.pt` (torch.save) для хранения тензоров — pickle, медленно.
- Не рендерить depth/seg в RGB colormap для обучения — OOD для DINOv3, потеря информации.
- Не снижать threshold ниже 0.1 — увеличивает false positives без значимого улучшения recall.
- Не менять `dark_water_std_thr` (0.18) — калибровано на GTA-UAV ocean (std 0.10-0.15). Ниже — не ловит, выше — false positives на normal images.
