BACK TO PROJECTSCOMPUTER VISION / ARCHITECTURE

B2 + TINYHIRES

SMALL OBJECT SEGMENTATION

Специализированная архитектура сегментации tiny objects: shared MiT-B2 encoder + лёгкий high-resolution encoder TinyHiRes + strong FPN decoder при строгом compute budget 97.45 GFLOPs.

SegFormerMiT-B2TinyHiResPyTorch
KEY METRICS
  • 0.487
    TINY MASK DICE
    baseline B2: 0.324
  • +50%
    RELATIVE IMPROVEMENT IN TINY-MASK DICE
  • 97.45
    GFLOPs FULL REPLACEMENT PIPELINE
  • 10,370
    VALIDATION IMAGES
SLUG: tinyhires-segmentationTYPE: TINYHIRESSTACK: SegFormer · MiT-B2 · TinyHiRes · PyTorch

01 / PROBLEM

Базовый SegFormer-B2 показывает сильное качество на крупных масках, но существенно хуже работает на tiny objects. На полной validation из 10,370 изображений 256 tiny examples дают baseline tiny mean Dice 0.3241403566 (≈0.324). Нужно поднять качество без кратного роста вычислений и без второй тяжёлой модели.

02 / APPROACH

Не увеличивать backbone, а добавить высокочастотную ветку: shared MiT-B2 encoder переиспользуется, к нему подключается лёгкий TinyHiRes encoder на 1024×1024, а стандартный decoder заменяется на сильный FPN decoder. Полный strict compute остаётся ≈97.45 GFLOPs.

03 / BASELINE

SegFormer-B2 @ 512×512: полная validation 10,370 images, 256 tiny examples, tiny mean Dice 0.3241403566 → 0.324.

BASELINE0.324
TINYHIRES0.487

RELATIVE IMPROVEMENT IN TINY-MASK DICE ≈ +50%

04 / ARCHITECTURE

Shared MiT-B2 encoder (hidden states 64/128/320/512) работает от 512×512 ветки. Параллельно 1024×1024 вход идёт в TinyHiRes encoder: stem Conv 3→24 kernel 3 stride 2 + GroupNorm + GELU + DepthwiseBlock; feature levels h2=24ch, h4=40ch, h8=64ch; stages 24→40 (stride 2), 40→40, 40→64 (stride 2), 64→64 на lightweight depthwise блоках (depthwise 3×3 conv → GroupNorm → GELU → pointwise 1×1 conv → GroupNorm → residual → GELU; при mismatch — skip через 1×1 conv + GroupNorm).

05 / FUSION & DECODER

Все уровни B2 проецируются в 128 channels через 1×1 Conv + GroupNorm + GELU; top-down FPN p4 → p3+up(p4) → p2+up(p3) → p1+up(p2). Fusion: p1+h8→x128, x128↑+h4→x256, x256↑+h2→x512. Decoder widths 1/8:128, 1/4:96, 1/2:64, depths 2/2/4, residual bottleneck stacks (GroupNorm → GELU → 1×1 reduction → 3×3 spatial conv → 1×1 expansion → layer scale → residual; dilations 1,2,1,3 циклически). Heads: mask_head, boundary_head (края маски), aux128/aux256 (deep supervision), presence_head.

06 / PRESENCE HEAD

Concatenation global pooled final B2 feature + global pooled high-resolution feature → LayerNorm → Linear→192 → GELU → Dropout 0.10 → Linear→1. Маска предсказывается только если presence_probability ≥ presence_threshold — меньше false positives на empty images.

07 / LOSS

Комбинация: weighted BCE + Dice + Tversky (positive samples base mask component ≈ 0.25 / 0.55 / 0.20), explicit empty-mask loss (для negative samples усиленный penalty за false-positive pixels), deep supervision aux128/aux256 c весами 0.40/0.60 (маска downsampled с max-pooling behavior, чтобы tiny edits не исчезали полностью), boundary loss, presence loss, area constraint: log area error + oversize penalty (pred_area > 1.35 × true_area) + undersize penalty (pred_area < 0.70 × true_area) — training regularisation, а не точное физическое ограничение.

08 / COMPUTE

Strict FLOPs рассчитаны через torch.utils.flop_counter.FlopCounterMode: MiT-B2 encoder @512 = 40.470839296 GFLOPs, additional TinyHiRes + strong decoder = 56.980365696 GFLOPs, итого replacement pipeline = 97.451204992 GFLOPs → 97.45 GFLOPs. Важно: TinyHiRes replacement architecture переиспользует MiT-B2 encoder и заменяет стандартный B2 decoder, сохраняя полный strict compute примерно на уровне 97.45 GFLOPs. Комбинация «стандартный B2 decoder + TinyHiRes» ≈178.10 strict GFLOPs использовалась только как diagnostic/ablation mode.

09 / RESULTS

TinyHiRes branch tiny Dice 0.4866728384 против baseline 0.3241403566 → 0.324 → 0.487. Relative improvement ≈50% in tiny-mask Dice (не percentage points).

BASELINE0.324
TINYHIRES0.487

RELATIVE IMPROVEMENT IN TINY-MASK DICE ≈ +50%

10 / ENGINEERING DECISIONS

  • Одно augmented-изображение питает обе ветви: 1024×1024 → TinyHiRes, 512×512 → MiT-B2; mask 1024×1024; интерполяция image bilinear, mask nearest
  • Mask size groups: empty (area ≤ 0), tiny (0 < area < 0.01), small (0.01 ≤ area < 0.05), medium (0.05 ≤ area < 0.20), large (area ≥ 0.20)
  • Умеренные context-safe augmentations: HorizontalFlip p=0.50; Affine scale 0.94–1.06, translation ±2.5%, rotation ±4°, shear ±2°; RandomBrightnessContrast; HueSaturationValue; JPEG compression; GaussNoise OR GaussianBlur
  • Boundary head локализует края маски; aux heads дают deep supervision