# Анализ классов сегментации для UAV-GeoLoc ## Обзор датасета - **392 локации**, 76 кадров каждая (height100_rot90) = ~29 800 изображений - **11 стран** (Country/): Australia, Brazil, English, French, German, Italy, Japan, Korea, Poland, Spain, USA - **27 типов terrain** (Terrain/): Basin, Calcification, Danxia, Delta, Desert, Fall, Farm, Finca, Flowers, Glacier, Gorge, Hill, Hylare, Island, Karst, Lakes-ignore, Mountain, Oasis, Pasture, Plain, Plateau, Prairie, Snow, StoneForest, Terrace, Volcano, Wetland ## Проблема с исходной конфигурацией (5 классов) Исходные промпты: ``` SegConfig.prompts = ['background', 'building', 'road', 'vegetation', 'water'] SegConfig.threshold = 0.3 ``` При 5 классах **60-90% площади terrain-кадров и 30-50% городских кадров уходит в background**, теряя информативные объекты (ж/д пути, грунт, скалы и т.д.). --- ## Инвентаризация объектов ### URBAN (Country/) — 11 стран, ~300 локаций | Объект | Где встречается | Частота | |---|---|---| | Здания (крыши: черепица, плоские, металл, стекло) | Все города | Доминирует | | Дорога / асфальт | Все города | Очень высокая | | Растительность (деревья, кустарники) | Все города | Высокая | | Тротуар / пешеходная зона / набережная | Все города, особенно Европа | Высокая | | Парковка | Мюнхен, SF, Варшава, Аделаида | Средняя | | Железная дорога (рельсы, балласт, стрелки) | Мюнхен, Сидней, Варшава | Средняя | | Вода (река, канал, море) | Париж/Сена, Венеция, Киото, Бусан, Копакабана | Средняя | | Мост / эстакада | Сидней, Париж | Низкая-средняя | | Внутренний двор | Все европейские города | Средняя | | Открытый грунт / гравий | Мюнхен, Варшава | Средняя | | Газон / парк | Лондон/Westminster, Rio | Средняя | | Спортивная площадка | Мюнхен | Низкая | | Пляж / песок | Копакабана, Бусан/Gwangalli | Низкая | | Дорожная разметка (зебры, полосы) | Все города | Высокая, но мелкая | | Солнечные панели | SF, Мюнхен | Низкая | ### TERRAIN — 27 типов | Terrain | Что на кадрах | Ключевые поверхности | |---|---|---| | Desert (Gobi) | Песок, эрозионные борозды, скалы | bare ground, sand, rock | | Farm (Bohemian) | Густой лес, кроны деревьев | vegetation | | Glacier (Athabasca) | Лёд, снег, трещины | snow, ice, water | | Island (Aldabra) | Бирюзовая вода, мелководье | water | | Wetland (Danube) | Болотистая почва, кустарник | vegetation, bare ground, water | | Mountain (Andes) | Песок/пыль, следы троп | bare ground, rock | | Delta (Congo) | Лавовые/скальные поверхности | rock, bare ground | | Volcano (Kilauea) | Тёмная лава, скальные породы | rock, bare ground | | Snow (Aconcagua) | Белый снег, точки камней | snow | | Danxia (GrandCanyon) | Красная порода + растительность | rock, vegetation | | Oasis | Саванна, кустарники на песке | bare ground, vegetation | | Finca (Althorp) | Хвойный лес, плантации | vegetation | | Terrace (Banaway) | Сельхоз террасы, тропы | farmland, bare ground | | Plain (Alberta) | Луг, речная пойма, грунтовая дорога | grassland, bare ground, road | | Plateau | Кустарник на каменистой почве | vegetation, rock | | Prairie (Etosha) | Саванна, точки кустов на песке | bare ground, vegetation | | Gorge (Antelope) | Каньон, красные скалы | rock, bare ground | | Karst (Mammoth) | Скальные плиты, трещины | rock | | Calcification (ElTatio) | Гейзерные поля, песчаная порода | bare ground, rock | | Flowers (BlueHotSpring) | Горячие источники, минеральные отложения | rock, water | | Hylare (Amazon) | Густой тропический лес | vegetation | | StoneForest (GrandCanyon) | Каньонные скалы + кустарник | rock, vegetation | | Hill (Sedona) | Красные скалы + кустарник | rock, vegetation | | Basin | — | — | | Fall | — | — | | Pasture | — | — | | Lakes-ignore | — | — | --- ## Финальная конфигурация: 11 классов ```python SegConfig.prompts = [ 'background', # 0 — unclassified 'building', # 1 — buildings, rooftops 'road', # 2 — roads, asphalt 'vegetation', # 3 — trees, bushes, forest canopy 'water', # 4 — rivers, canals, sea, lakes 'sand and gravel ground', # 5 — soil, gravel, sand, dust, bare earth 'rocky terrain', # 6 — rock, stone, lava, canyon walls 'farmland', # 7 — agricultural terraces, fields 'railway', # 8 — railway tracks, rails 'parking lot', # 9 — parking areas 'sidewalk', # 10 — sidewalks, pedestrian zones, embankments ] SegConfig.threshold = 0.15 SegConfig.default_resolution = 1008 ``` ### Эволюция конфигурации 1. **v1** (исходная): 5 классов, threshold=0.3 — слишком много background 2. **v2** (первая итерация): 12 классов (`bare ground`, `rock`, `snow`, `farmland`, `railway`, `parking lot`, `sidewalk`), threshold=0.3 — terrain по-прежнему плохо 3. **v3** (вторая итерация): 12 классов с переименованными промптами (`sand and gravel ground`, `rocky terrain`, `snow and ice`), threshold=0.15 — значительное улучшение terrain 4. **v4** (финальная): 11 классов — убран `snow and ice` (SegEarth-OV3 не различает снег/лёд от воды при виде сверху), threshold=0.15 ### Обоснование каждого нового класса | Класс | Промпт | Обоснование | Покрытие | |---|---|---|---| | bare ground | `sand and gravel ground` | Без него пустыня, гейзеры, плато, прерия, пляж уходят в background | Критичен для terrain | | rock | `rocky terrain` | Вулканы, каньоны, карст — уникальная текстура | Критичен для terrain | | farmland | `farmland` | Террасы, поля — геометрически уникальны для matching | Важен для Terrace/Plain/Farm | | railway | `railway` | Ж/д пути — линейный ориентир с уникальной топологией | Важен для городов | | parking lot | `parking lot` | Чёткая прямоугольная геометрия, видна и с дрона и со спутника | Средний для городов | | sidewalk | `sidewalk` | Структурные границы в городах, набережные | Средний для городов | ### Отброшенные классы и причины | Класс | Причина отказа | |---|---| | `snow and ice` | SegEarth-OV3 классифицирует лёд/снег как `water` при виде сверху — промпт не работает. Проверено на Glacier (Athabasca) | | `beach` / `sand` | Покрыт `sand and gravel ground` | | `bridge` | Слишком редко, перекрывается с `road` | | `grassland` / `lawn` | Перекрывается с `vegetation` | | `river` / `sea` / `lake` | Всё покрыто единым `water` | | `sports field` | Слишком редко на полном датасете | | `courtyard` | Семантически = `bare ground` + `building` | | `fence` | Слишком тонкий объект для SegEarth на 1008px | | `road marking` | Слишком мелкий, лучше оставить как часть `road` | | `solar panel` | Редко, мелко, часть крыши | --- ## Результаты тестирования на 10 изображениях Тестовые изображения: 6 городских (Munich, Paris, Venice, New York, Sydney, Busan) + 4 terrain (Desert, Glacier, Volcano, Danxia). ### Городские сцены | Локация | Обнаруженные классы | Качество | |---|---|---| | Munich (ж/д пути) | railway, sand/gravel, vegetation, road, water | Отлично — ж/д = фиолетовый, балласт = бежевый | | Paris (набережная Сены) | road, vegetation, water, sidewalk, parking lot | Отлично — река, тротуар, дорога разделены | | Venice (старый город) | building, road, water, parking lot | Хорошо — каналы появились как water | | New York (Manhattan) | building, road, vegetation, parking lot, sidewalk | Отлично — все городские классы | | Sydney (эстакада) | road, building, vegetation, parking lot, sidewalk | Хорошо | | Busan (пляж) | water, sand and gravel ground | Отлично — пляж = бежевый, море = синий | ### Terrain | Локация | Обнаруженные классы | Качество | |---|---|---| | Desert (Gobi) | road, rocky terrain | Приемлемо — пустыня = road (серый близок к песку) | | Glacier (Athabasca) | water | Ограничение модели — лёд = water | | Volcano (Kilauea) | rocky terrain | Отлично — было 100% background, стало 100% rocky terrain | | Danxia (GrandCanyon) | vegetation | Частично — кусты определены, скалы в background | ### Известные ограничения SegEarth-OV3 - Ледники/снег классифицируются как `water` — визуально неразличимы сверху для модели - Красные скалы (Danxia) плохо определяются как `rocky terrain` - Пустынный грунт может путаться с `road` --- ## Палитра цветов | ID | Класс | RGB | Цвет | |:--:|:---|:---|:---| | 0 | background | (0, 0, 0) | Black | | 1 | building | (220, 40, 40) | Red | | 2 | road | (160, 160, 160) | Gray | | 3 | vegetation | (30, 180, 30) | Green | | 4 | water | (30, 120, 220) | Blue | | 5 | sand and gravel ground | (180, 140, 80) | Tan | | 6 | rocky terrain | (120, 100, 80) | Brown | | 7 | farmland | (200, 200, 50) | Yellow | | 8 | railway | (100, 60, 120) | Purple | | 9 | parking lot | (255, 165, 0) | Orange | | 10 | sidewalk | (200, 200, 200) | Light gray | --- ## Unified 17 классов для transfer learning UAV_VisLoc и GTA-UAV используют **единый набор 17 классов** (`scripts/seg_classes.py`). Это обеспечивает совместимость class IDs при transfer learning (pretrain GTA-UAV → fine-tune UAV_VisLoc). Не каждый датасет содержит пиксели каждого класса — класс с 0 пикселей просто не даёт вклад в loss. Источник единой конфигурации: `scripts/seg_classes.py:UNIFIED_PROMPTS`. --- ## Конфигурация для UAV_VisLoc: 17 классов (unified) UAV_VisLoc_processed — другой датасет (81K images, 11 сцен, DB + drone, 256x256). Анализ сегментации на scene 01 (2496 images) выявил 29% background — значительно больше, чем у World-UAV после настройки. ### Анализ проблемных зон На 2496 изображениях scene 01 (UAV_VisLoc) были обнаружены 3 систематических паттерна ложного background: | Паттерн | Примеры | RGB характеристика | Текущее покрытие (11 кл.) | |---|---|---|---| | **Распаханные поля** | crop_0_11, crop_0_58, crop_10_49 | Однородная коричнево-серая текстура (R≈140, G≈120, B≈100) | 0% — ни `farmland`, ни `sand/gravel` не срабатывают | | **Тёмные/текстурированные крыши** | crop_0_97, crop_10_13 | Тёмные поверхности с солнечными панелями, промышленные объекты | ~50% — `building` ловит стены, но не крыши | | **Спортплощадки, теплицы** | crop_10_5 | Яркие прямоугольные объекты с уникальной текстурой | 0% — нет подходящего класса | | **Болотистый грунт / дамбы** | crop_0_0, crop_0_1 | Тёмно-зелёно-серый (R≈101, G≈103, B≈97), между водоёмами | 0% — слишком тёмный для `sand/gravel` | | **Экстремально тёмная вода** | crop_0_4, crop_0_6 | Почти чёрный (R<30, G<30, B<30) | 0% — SegEarth не видит воду при очень низкой яркости | ### Количественный анализ (scene 01, 11 классов → 16 классов) | Метрика | 11 классов | 16 классов (ожид.) | |---|---|---| | background % | 29.0% | ~10-15% | | Изображений >50% bg | 475 / 2496 (19%) | ~100-150 | | 100% background | ~50 | ~20-30 (экстремально тёмные) | ### 5 добавленных классов и обоснование | ID | Промпт | Обоснование | Что покрывает | |---|---|---|---| | 11 | `bare soil and plowed field` | **Главная потеря** (~15-20% пикселей bg). `farmland` ловит только зелёные поля с посевами. Распаханная земля (коричневая, без растительности) — отдельный семантический класс. В UAV_VisLoc много сельских сцен с обработанными полями без всходов. | Распаханные поля, голая земля, стройплощадки | | 12 | `roof and rooftop` | `building` обучен на стены/фасады. Крыши сверху (вид с БПЛА/спутника) — другая текстура: черепица, металл, солнечные панели, плоские бетонные крыши. SegEarth не уверен в `building` для тёмных крыш → background. | Крыши всех типов, солнечные панели на крышах | | 13 | `sports field and playground` | Спортплощадки имеют уникальную геометрию (прямоугольники, разметка, цветные покрытия), не покрываемую ни одним из базовых классов. Для CVGL — сильный localization landmark. | Теннисные корты, футбольные поля, баскетбольные площадки | | 14 | `muddy ground and wetland` | Болотистая земля между водоёмами (дамбы, берега, русла). Слишком тёмная для `sand/gravel`, слишком сухая для `water`. Специфична для UAV_VisLoc (прибрежные сцены). | Мокрый грунт, заболоченные участки, дамбы | | 15 | `embankment and levee` | Насыпные сооружения (дамбы, набережные, обваловки) — линейные структуры из грунта вдоль водоёмов. Геометрически уникальны для matching. | Земляные дамбы, насыпи, обваловки каналов | ### Почему `threshold=0.1` (а не 0.15 как в World-UAV) UAV_VisLoc содержит больше экстремальных сцен: - Тёмная вода (почти чёрная) — confidence по `water` = 0.12-0.14 - Мокрый грунт — confidence по `bare soil` = 0.11-0.13 - При threshold=0.15 эти пиксели уходят в background, при 0.1 — корректно классифицируются ### Неустранимый background (~5-10%) Остаётся background для изображений, где SegEarth-OV3 **физически не может** сегментировать: - Почти чёрные кадры (ночная вода, тень) — нет визуальной информации - Однородные текстуры без семантических признаков - Это нормально — background здесь семантически корректен ### Конфигурация (unified 17 классов) ```python from scripts.seg_classes import UNIFIED_PROMPTS SegConfig(threshold=0.1, prompts=UNIFIED_PROMPTS) # UNIFIED_PROMPTS содержит 17 классов (ID 0-16) # UAV_VisLoc: активны все кроме 16 (swimming pool — редко) ``` ### Расширенная палитра (16 классов) | ID | Класс | RGB | Цвет | |:--:|:---|:---|:---| | 0 | background | (0, 0, 0) | Black | | 1 | building | (220, 40, 40) | Red | | 2 | road | (160, 160, 160) | Gray | | 3 | vegetation | (30, 180, 30) | Green | | 4 | water | (30, 120, 220) | Blue | | 5 | sand and gravel ground | (180, 140, 80) | Tan | | 6 | rocky terrain | (120, 100, 80) | Brown | | 7 | farmland | (200, 200, 50) | Yellow | | 8 | railway | (100, 60, 120) | Purple | | 9 | parking lot | (255, 165, 0) | Orange | | 10 | sidewalk | (200, 200, 200) | Light gray | | 11 | bare soil | (140, 100, 50) | Dark tan | | 12 | rooftop | (180, 60, 60) | Dark red | | 13 | sports field | (50, 200, 150) | Teal | | 14 | muddy/wetland | (80, 100, 70) | Olive | | 15 | embankment | (170, 130, 100) | Sandy brown | --- ## Конфигурация для GTA-UAV-LR: 14 классов ### Характеристики датасета GTA-UAV-LR — синтетический датасет, сгенерированный из игрового движка GTA V (Grand Theft Auto V). | Параметр | Значение | |---|---| | Drone изображения | 33 763 шт., 512x384 px, RGB PNG | | Satellite изображения | 14 640 шт., 256x256 px, **RGBA** PNG | | Итого | 48 403 изображения | | Высоты полёта | 100, 200, 300, 400, 500, 600 м | | Локация | Карта GTA V (Лос-Сантос и окрестности) | | Сцены | Город, пригород, сельская местность, побережье, горы, пустыня | | Формат аннотаций | JSON (cross-area, same-area, train/test splits) | **Особенности:** - **Satellite RGBA:** alpha-канал обозначает границы карты GTA V. Прозрачные пиксели (alpha=0) = за пределами игрового мира. При обработке конвертируется в RGB (прозрачное → чёрный). - **Drone не квадратные:** 512x384 → resize в 512x512 (потеря aspect ratio, но это синтетика — не критично). - **Синтетические текстуры:** GTA V рендерит реалистичные но не фотореалистичные текстуры. SegEarth-OV3 справляется хорошо — текстуры достаточно близки к реальным для open-vocabulary grounding. - **Бассейны** — характерная особенность пригородов GTA V (Vinewood Hills, Rockford Hills). Яркий бирюзовый цвет, уникальная геометрия — сильный localization cue для CVGL. ### Выбор 14 классов 11 базовых классов (совпадают с World-UAV) + 3 специфичных: | ID | Промпт | Обоснование | |---|---|---| | 11 | `bare soil and plowed field` | GTA V содержит много пустырей, стройплощадок, грунтовых дорог в пригородах (Sandy Shores, Grapeseed). Без этого класса ~10-15% уходит в background. | | 12 | `roof and rooftop` | Плоские крыши коммерческих зданий, вертолётные площадки (Maze Bank Tower). GTA V рендерит крыши с детализированными текстурами (кондиционеры, антенны), которые `building` не ловит сверху. | | 13 | `swimming pool` | Бассейны во дворах вилл — один из самых характерных визуальных элементов пригородов GTA V. Яркий бирюзовый цвет на сером/зелёном фоне — сильнейший landmark для cross-view matching. `water` не различает бассейн от океана. | ### Почему не добавлены | Класс | Причина | |---|---| | `highway` | Покрыт `road` — SegEarth не различает шоссе и обычную дорогу | | `beach` | Покрыт `sand and gravel ground` | | `mountain` | Покрыт `rocky terrain` + `vegetation` | | `sports field` | Есть в GTA V, но редко виден сверху (стадионы закрыты) | | `muddy ground` | Не актуален для GTA V (нет болот в Лос-Сантосе) | ### Конфигурация (unified 17 классов) ```python from scripts.seg_classes import UNIFIED_PROMPTS SegConfig(threshold=0.15, prompts=UNIFIED_PROMPTS) # + seg_fix_dark_water=True, seg_reclassify_wetland=True ``` ### Результаты post-processing (проверено на 128 satellite + drone) | Метрика | Без post-processing | С post-processing | |---|---|---| | Satellite background | 57.6% | **5.3%** | | Satellite >50% bg images | 56.7% | **1%** | | Satellite water | 3.7% | **58.5%** | | Drone wetland (ложный) | 14.3% | **0%** | | Drone background | 11.4% | ~8% | Два правила: 1. **Dark water fix** (`seg_fix_dark_water=True`): если background-пиксели имеют mean_rgb < 0.24 и std < 0.18, переклассифицировать в water (class 4). Пороги калиброваны на GTA-UAV ocean: mean ~0.12-0.18, std ~0.10-0.15. 2. **Wetland reclassify** (`seg_reclassify_wetland=True`): промпт "muddy ground and wetland" ложно срабатывает на холмистой местности GTA V (трава + грунт). Переклассификация по цвету: зелёный → vegetation (3), коричневый → bare soil (11). --- ## Оценка влияния на производительность - Инференс: ~1.8–2.2x медленнее (11 vs 5 text prompts) - На 973K изображений: дополнительные ~8–12 часов на RTX 4090 - Background на terrain: сокращение с 60–90% до ~10–20% - Background на urban: сокращение с 30–50% до ~5–15% ## Методология анализа Просмотрено ~50 кадров с равномерной выборкой: - По 1–3 кадра из каждой страны (разные города/районы) - По 1 кадру из каждого типа terrain (первая доступная локация) - Кадры выбирались из середины траектории (frame 30) для репрезентативности - Дополнительно просмотрены кадры из начала/конца траектории для Мюнхена (полный обзор 76 кадров) - Тестирование проведено в 3 итерации с подбором формулировок промптов и порога confidence