Initial commit — gin-config strict-pattern coding standard

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)
This commit is contained in:
2026-04-27 17:12:38 +03:00
commit 3278322a17
10 changed files with 1970 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
В 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 корректна — я рекомендую её без изменений.