В REQUIREMENTS_GIN_STYLE.md уже есть 5 конфигов. Но для задачи аннотирования World-UAV я бы рекомендовал **именно эти 5** — они хорошо разделены по ответственности. Вот мой анализ: ## Рекомендуемые gin-config категории **5 конфигов — оптимальное число.** Каждый отвечает за одну ось изменчивости: |#|Конфиг|Ось изменчивости|Когда меняется| |:--|:--|:--|:--| |1|**PipelineConfig**|Что обрабатывать и куда сохранять|При смене датасета или запуске на новом subset'е| |2|**HardwareConfig**|На чём запускать|При переходе между GPU (4090 → A100 → Jetson)| |3|**ModelsConfig**|Какими моделями генерировать|При замене DA3→DA2, SegEarth→SegFormer| |4|**InputConfig**|Как предобрабатывать вход|При изменении resolution (256→384), edge метода| |5|**SegConfig**|Что сегментировать|При изменении OV-промптов для другого региона| **Принцип разделения:** если два параметра меняются **вместе** — в одном конфиге. Если **независимо** — в разных. Например: `batch_size` и `use_fp16` меняются вместе (при смене GPU), поэтому оба в `HardwareConfig`. А `prompts` и `image_size` независимы — разные конфиги. ### Содержимое каждого конфига: **1. `pipeline.gin` → PipelineConfig** ```gin # ЧТО и КУДА PipelineConfig.input_root = '/data/UAV-GeoLoc' PipelineConfig.output_root = '/data/UAV-GeoLoc-aug' PipelineConfig.stages = ['depth', 'edges', 'segmentation'] PipelineConfig.subset = 'Rot' # Country | Terrain | Rot | None PipelineConfig.source = None # query | db | None PipelineConfig.save_npy = True PipelineConfig.save_vis = True PipelineConfig.save_concat = False # 6ch concat (экономия 1.4TB) PipelineConfig.resume = True # пропуск обработанных PipelineConfig.log_level = 'INFO' ``` **2. `hardware.gin` → HardwareConfig** ```gin # НА ЧЁМ HardwareConfig.profile_name = 'rtx4090' HardwareConfig.total_ram_gb = 24.0 HardwareConfig.reserve_gb = 2.0 HardwareConfig.use_fp16 = True HardwareConfig.batch_size = 32 # None = auto HardwareConfig.num_workers = 4 ``` **3. `models.gin` → ModelsConfig** ```gin # КАКИМИ МОДЕЛЯМИ ModelsConfig.depth_model_id = 'depth-anything/DA3-BASE' ModelsConfig.depth_fallback_id = 'depth-anything/Depth-Anything-V2-Large-hf' ModelsConfig.seg_model_type = 'segearth-ov3' ModelsConfig.seg_fallback_type = 'segformer-b5' ModelsConfig.seg_fallback_id = 'nvidia/segformer-b5-finetuned-ade-640-640' ``` **4. `input.gin` → InputConfig** ```gin # КАК ПРЕДОБРАБАТЫВАТЬ InputConfig.image_size = 256 InputConfig.sobel_kernel_size = 3 InputConfig.edge_normalize = True InputConfig.imagenet_mean = [0.485, 0.456, 0.406] InputConfig.imagenet_std = [0.229, 0.224, 0.225] ``` **5. `segmentation.gin` → SegConfig** ```gin # ЧТО СЕГМЕНТИРОВАТЬ SegConfig.prompts = ['background', 'building', 'road', 'tree', 'water', 'vegetation', 'bare soil', 'grass', 'vehicle', 'shadow'] SegConfig.threshold = 0.3 SegConfig.default_resolution = 1008 # SAM3 input size ``` ### Что НЕ стоит выносить в gin |Параметр|Почему НЕ в gin| |:--|:--| |`INCOMPLETE_SCENES` (16 сцен)|Привязано к конкретному датасету, не параметр — константа в коде| |`EXCLUDE_DIRS`|Инфраструктурная константа, не меняется между экспериментами| |`EXTENSIONS` (.png, .jpg)|Константа формата данных| |Sobel-ядра (матрицы)|Математическая константа, не параметр| |Palette seed (42)|Определённость визуализации, не влияет на результат| ### Когда какой .gin менять |Сценарий|Какие .gin трогать| |:--|:--| |Запуск на Rot для smoke test|`pipeline.gin` (subset='Rot')| |Переход на A100|`hardware.gin` (total_ram_gb=80, batch_size=128)| |Замена DA3 на DA V2|`models.gin` (depth_model_id)| |Обработка только query (дрон)|`pipeline.gin` (source='query')| |Добавить класс "parking" в сегментацию|`segmentation.gin` (prompts)| |Изменить resolution на 384×384|`input.gin` (image_size=384)| Эта схема из REQUIREMENTS_GIN_STYLE.md корректна — я рекомендую её без изменений.