Skip to content

v0.2.18 — YOLO region holes + abortable model load

Choose a tag to compare

@belkassaby belkassaby released this 25 Sep 14:32
· 837 commits to main since this release
9ba14a7

Released 2026-08-09.

Fixed

  • YOLO detections keep their interior voids. YoloDetectToolService built each Region from poly.exterior alone, so a mask with a hole through it was committed solid. This does not look like lost geometry, it looks like a detection that over-covers — which is the harder failure to notice.

    Holes now travel through the same view→image transform as the exterior; a ring left in view-local pixels lands elsewhere on the slide, frequently outside its own exterior. Each polygon already owned its own rings (the tracer emits them that way, and the segmenter service mapped them through), so a mask that splits into several polygons under thresholding needs no disambiguation — the rings were simply being dropped at the last step.

    Rings that simplification reduces below three points are dropped rather than emitted as geometry that bounds nothing, and holes is left unset rather than set to [], so a solid region does not round-trip through export as a donut with no rings.

Added

  • RetinalSegmenterService.getModel accepts an AbortSignal. The retinal checkpoint is ~590 MB; previously a cancel reached the inference but not the download, so the transfer kept running and the UI sat in "Cancelling" until it finished. segmentSemantic passes the run's own signal through.

    Cancellation lands within one graph compile rather than instantly: ORT session creation cannot be interrupted once started, so the signal is rechecked after the download and before the session is built.

    A cancel deliberately does not abort a load already in flight. That promise is shared — the toolbar tool and a host's pipeline both use this service — so one caller's cancel must not tear the model out from under another. A second caller joining an in-flight load simply waits.

Changed

  • jax-ai-js ^0.1.0 → ^0.1.1, which is where the signal plumbing lives: fetchModel already honoured a signal, but fromPretrained never passed one. No API breaks; the option is additive.

npm: @jax-data-science/sci-image-visualizer@0.2.18
Full diff: v0.2.17...v0.2.18