CW-BASS v2 — Cityscapes (Saturation-Aware Pseudo-Label Selection)
CW-BASS v2 model family — Pascal VOC · Cityscapes · ADE20K · 🌐 Project page · 💻 Code
Cityscapes checkpoint for CW-BASS v2, a saturation-aware pseudo-label selection method over a DINOv2-Base encoder. CW-BASS v2 combines confidence-weighted boundary-aware self-training, a held-out calibration slice (unbiased noise estimate), and a self-adaptive confidence floor, arbitrated by a one-pass reliability gate: it measures π_kept = Pr[correct | c ≥ τ] on a held-out slice and uses strict filtering when π_kept ≥ τ, the adaptive floor otherwise. See the Pascal model and the paper for the full method.
On Cityscapes the teacher is near-saturated, so the gate selects strict filtering (a near-tie with the adaptive rules). This checkpoint is the model that rule produces.
- Backbone: DINOv2-Base (ViT-B/14) + DPT-lite decoder, 19 Cityscapes classes.
- This checkpoint: Cityscapes 1/8 split, single seed, EMA teacher (eval) weights, crop 686.
- Rule the gate selected here: strict (τ = 0.95).
Results (honest framing)
| Split | CW-BASS v2 (gate→strict) | UniMatch V2-B (reported) |
|---|---|---|
| 1/16 | 83.16 | 83.6 |
| 1/8 | 83.96 | 84.3 |
| 1/4 | 83.99 | 84.5 |
CW-BASS v2 sits at or slightly below the published UniMatch V2-B figures (single seed, best EMA). On this near-saturated teacher the adaptive rules tie strict (spread ≈ 0.5 mIoU), so the gate's choice of strict is a safe, no-regret default rather than an accuracy lever — consistent with the paper's thesis. These cells are single-seed (see the paper's Cityscapes table).
Usage
import torch
from torchvision import transforms as T
from PIL import Image
from model.semseg.dino_segmentor import DINOv2Segmentor # from the CW-BASS v2 code
from core.inference import whole_inference
model = DINOv2Segmentor(backbone='dinov2_vitb14', nclass=19, pretrained=False).eval()
sd = torch.load('cwbassv2_cityscapes_dinov2b_1over8.pth', map_location='cpu')
model.load_state_dict(sd, strict=False) # training-only proj_head is inference-unused
norm = T.Compose([T.ToTensor(), T.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])
img = norm(Image.open('example.jpg').convert('RGB')).unsqueeze(0)
with torch.no_grad():
pred = whole_inference(model, img).argmax(1) # [1, H, W], 19 Cityscapes classes
For large Cityscapes images, core.inference.slide_inference (sliding-window) is also available.
Run it locally with the Gradio app in the repo's demo/ folder.
Citation
@article{tarubinga2026cwbassv2,
title = {CW-BASS v2: Saturation-Aware Pseudo-Label Selection for
Semi-Supervised Segmentation under Foundation-Model Teachers},
author = {Tarubinga, Ebenezer},
year = {2026},
journal = {arXiv preprint arXiv:2608.12773},
eprint = {2608.12773},
archivePrefix = {arXiv},
primaryClass = {cs.CV}
}
