release: 4.12.1 — iOS rect-aspect detection (multiarray decode)
Brings the iOS multiarray-decode + parametrized model-input-dim work that
was lost from the v4.12.0 squash. Without this, ultralytics yolo26 end2end
CoreML exports (rect 512×384 / 640×480 / 960×736) silently produced zero
detections on iOS — Vision delivered VNCoreMLFeatureValueObservations that
the library's Vision-only filterIsInstance dropped on the floor.
Library
- FrameProcessor.analyseBufferForAll: when Vision returns a raw multiarray
(shape [1, 300, 6], yolo26n end2end output), decode it into AnalysisObjects
with class labels "basketball" / "basketball_hoop" and bbox coords mapped
back to oriented source pixel space.
- Coordinates from the end2end output are pixel-space over the model input,
not normalized — divide by modelInputW/H before scaling to source.
- modelInputW/Height are read from the ObjectModel (set via
CustomObjectModel.ios.kt parsing the `_<W>x<H>` filename suffix), so
rect-640 and rect-960 work without further code changes.
- ImageDetector.ios.kt gets the same letterbox + multiarray decode path
for the standalone (non-AVCapture) entry point.
Sample app — iOS unattended test harness
- iosApp.swift parses `-test_model`, `-test_duration_sec`,
`-start_at_wall_ms`, `-finish_on_stop` launch args and threads them
through MainViewControllerWithAutoSpec → LocalExperimentAutoSpec.
- ExperimentLogger.ios.kt writes per-frame detection JSON to
NSDocumentDirectory/experiment_logs/ (was a no-op stub).
- ExperimentAuto.ios.kt logs progress via NSLog and exits on finish so
back-to-back captures cold-start cleanly.
- App.kt: replace System.currentTimeMillis() with
Clock.System.now().toEpochMilliseconds() so commonMain compiles for iOS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
release: 4.12.1 — iOS rect-aspect detection (multiarray decode)
Brings the iOS multiarray-decode + parametrized model-input-dim work that
was lost from the v4.12.0 squash. Without this, ultralytics yolo26 end2end
CoreML exports (rect 512×384 / 640×480 / 960×736) silently produced zero
detections on iOS — Vision delivered VNCoreMLFeatureValueObservations that
the library's Vision-only filterIsInstance dropped on the floor.
Library
- FrameProcessor.analyseBufferForAll: when Vision returns a raw multiarray
(shape [1, 300, 6], yolo26n end2end output), decode it into AnalysisObjects
with class labels "basketball" / "basketball_hoop" and bbox coords mapped
back to oriented source pixel space.
- Coordinates from the end2end output are pixel-space over the model input,
not normalized — divide by modelInputW/H before scaling to source.
- modelInputW/Height are read from the ObjectModel (set via
CustomObjectModel.ios.kt parsing the `_<W>x<H>` filename suffix), so
rect-640 and rect-960 work without further code changes.
- ImageDetector.ios.kt gets the same letterbox + multiarray decode path
for the standalone (non-AVCapture) entry point.
Sample app — iOS unattended test harness
- iosApp.swift parses `-test_model`, `-test_duration_sec`,
`-start_at_wall_ms`, `-finish_on_stop` launch args and threads them
through MainViewControllerWithAutoSpec → LocalExperimentAutoSpec.
- ExperimentLogger.ios.kt writes per-frame detection JSON to
NSDocumentDirectory/experiment_logs/ (was a no-op stub).
- ExperimentAuto.ios.kt logs progress via NSLog and exits on finish so
back-to-back captures cold-start cleanly.
- App.kt: replace System.currentTimeMillis() with
Clock.System.now().toEpochMilliseconds() so commonMain compiles for iOS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>