1.6.0
soma 1.6.0 turns detection into a first-class, benchmarked task, adds annotation-restricted MIL bags, migrates the dense path onto slide2vec 5.2 streaming extraction with fp16 caching, hardens dense-cache correctness and speed, and ships a restructured docs site with executable tutorials. It also carries several breaking config renames (see below).
Added
- Detection, end-to-end, benchmarked on OCELOT 2023. The frozen-encoder → dense token grid → heatmap-regression → F1@δ detection path is now validated on a real cell-detection dataset with an honest, published-comparable number. Includes curation (#143), multi-resolution rendering (#156), oracle-bound greedy reporting (#155), a reproduction harness with
--setconfig overrides (#169), encoder×spacing variant configs (#158), the frozen-probe selection→confirmation campaign + results (#206), and a benchmark docs page (#157). Point-matcher assignment is now the matching primitive (#181). - Detection qualitative artifacts. Consolidated eval +
DetectionArtifactWriterwith plain overlays and manifest/metrics CSVs (#182), per-class match-status overlays (#183), opt-in heatmap overlays + npz sidecar (#184), and H&E-legible overlays with eval-only artifact regeneration (#185). - Annotation-restricted MIL bags. A tumor-only (mask-restricted) merged bag per slide for
dataset_type=slide(#115) anddataset_type=patient(#116), driven by masks/sampling inPreprocessingConfig. - fp16 dense-grid cache — dense grids can be stored at half precision, ~halving cache footprint (#166, unified under
cache.dtypein #179). evaluation.holdout_testto skip test-split evaluation on tune-only / model-selection runs (#178).
Changed
- Dense extraction migrated onto slide2vec 5.2
iter_regions_densestreaming; soma's sliding/blend fork deleted (#162). Per-slide memory is now flat (constant RSS), removing the OOM failure mode on large slides. Dependency floor raised toslide2vec[fm]>=5.2.0(#159, #179). - Dense-cache correctness & speed: fixed experiment identity for dense/artifact configs (#129), unified cache-backed dense source handling (#134), tightened cache-completion + metadata-refresh semantics (#135), fast cache scan via a single listing + gated sidecar validation (#141), resumable extraction that encodes only missing samples (#142), encoder skipped when the cache is already complete (#177), and shared dense fold planning extracted (#131).
- Docs restructured into a task / method / benchmark site — component homes (#196), slide-level task pages + Tasks index (#195), dense task pages + methods matrices (#199), a benchmark layer covering the EVA suite + OCELOT refit (#201), landing re-grid + consistency passes (#204, #205), and CI that skips the Dockerized suite on docs-only PRs (#198). Adds two executable walkthrough tutorials: decoder-free attention-probing segmentation (#202) and multi-encoder composite (#203).
- Housekeeping: aligned package metadata + public API discovery (#128), implementation-backed docs config examples (#130), all example configs load (#117), OCELOT configs use a relative
output/path and drop theexpandable_segmentshint (#160, #168).
Breaking
- Tissue threshold is now a per-class
preprocessing.min_coveragemap; the scalar is gone (#107). masks/samplingrelocated intoPreprocessingConfig(#113); the reservedbackgroundrule was dropped from the masks vocabulary (#114).- Cache dtype unified behind
cache.dtypefor pooled + dense storage, replacing the dense-onlycache.dense_dtype(#179). save_probabilitiesrenamed with symmetric dense-artifact eval flags (#180).- Checkpoint metrics renamed to
selected(1-based peak epoch, history shim removed) (#133, #136).