Code-style guide and reference patterns for DL/CV research at the ЛИСАД laboratory (NADEZHDA / SOFIA CVGL projects). Files: - Стандарт написания кода для DL CV исследований (CVGL).md - Правила написания Python-кода (Gin-Config Strict Pattern).md - REQUIREMENTS_GIN_STYLE.md - Gin-Config Strict Pattern Reference Examples.md - Переход от argparse и dataclass к gin-config.md - gin-parse.md - Рекомендуемые gin-config категории.md - config_loader_reference.py - README.md (this commit) - .gitignore (Python artifacts)
4.9 KiB
4.9 KiB
В 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
# ЧТО и КУДА
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
# НА ЧЁМ
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
# КАКИМИ МОДЕЛЯМИ
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
# КАК ПРЕДОБРАБАТЫВАТЬ
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
# ЧТО СЕГМЕНТИРОВАТЬ
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 корректна — я рекомендую её без изменений.