Files
DarkRoom/core/dr-segment/Cargo.toml
T
dtourolle d15c41e699 Add dr-inference-engine and route every model session through it
One crate names the runtime, the providers and the devices; dr-face and
dr-segment ask it for a session by role. It hands ort an API table once
per process — from a libonnxruntime it dlopens when the app names a
directory holding one, otherwise from tract — so the Rust build stays
free of C on every target and a package can install the runtime as a
file (docs/inference.md §3).

Sessions live in a registry behind a Model handle that holds the bytes,
not the session: every use refreshes a timestamp and a reaper unloads
whatever sat idle past the decay. A scan that runs the detector on each
image never lets it go idle; a click in the develop view lets the
segmenter go after thirty seconds; a handle used after that reloads,
and reloads on a higher rung if a compiled engine has landed meanwhile.

The probe walks the platform's ladder by building strict sessions and
timing them against the CPU provider, caches the choice against a
fingerprint of the runtime, driver, hardware and models, and compiles
engines for the selected rung in the background, smallest model first.
Nothing in this commit turns the native path on: the apps still run on
tract until they call init with a runtime directory.
2026-09-19 16:02:37 +02:00

58 lines
2.3 KiB
TOML

[package]
name = "dr-segment"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
# Guards against a Git LFS pointer being embedded in place of the weights.
build = "build.rs"
[dependencies]
thiserror.workspace = true
log.workspace = true
# Inference. `ort` is the API; **what runs it is `dr-inference-engine`'s
# business** — tract, or an ONNX Runtime the app found on disk, on whichever
# provider the device has (docs/inference.md). This crate never names either.
ort = { workspace = true, optional = true }
dr-inference-engine = { workspace = true, optional = true }
ndarray = { workspace = true, optional = true }
[dev-dependencies]
# The example reads an ordinary JPEG, because the thing worth looking at is
# whether detections land on a real photograph. Pure Rust, and already in the
# tree for embedded previews.
zune-jpeg.workspace = true
env_logger.workspace = true
[features]
# On by default: a local adjustment that cannot select a subject is half the
# feature, and the whole point of the tract backend is that enabling this costs
# no C dependency on any platform.
default = ["semantic", "embedded-model"]
# Arm B — the ONNX runtime and the instance decoder.
#
# Separable because the watershed half is genuinely independent of it: with
# this off, `dr-segment` is a pure-CPU graph algorithm crate with no model to
# carry, which is what the headless hierarchy tests want.
semantic = ["dep:ort", "dep:dr-inference-engine", "dep:ndarray"]
# Compile the weights into the binary.
#
# Separate from `semantic` because the two answer different questions. Android
# hands the app no filesystem path to read a model from (ARCH §6.9), so there
# it must be embedded; a desktop packager pointing at a system model directory,
# or a test that only needs the decoder, wants the runtime without the 11 MB.
embedded-model = ["semantic"]
# Compile the *scene* model in too, and off by default where `embedded-model`
# is on.
#
# The asymmetry is its size. At 24 MB it is more than twice the instance model,
# and Android reaches it the way it reaches the face weights — unpacked from
# APK assets at first launch — rather than by carrying it in the binary. This
# feature is for a desktop build with nowhere else to read it from, and for
# tests that want the real graph.
embedded-scene-model = ["semantic"]