Computer vision applications on the SiMa.ai Modalix DevKit 3.0. Object detection, instance segmentation, fall detection and more: one pipeline, no setup step. Needs a Modalix DevKit 3.0 and Python 3.10 or later.
Quickstart
Every command here is typed on the board.
pip install sima-cli
# Login via SiMa.ai Portal
sima-cli login
# Install Neat core, once
sima-cli neat install core@v0.3.0
# Install sima-vision
pip install sima-vision
# Run object detection
sima-vision detect
The first run fetches a pretrained YOLO26 pack and a demo clip into ./assets, then runs.
Every run after that reuses them. Both come from one public GitHub release, so getting
them needs no login and no sima-cli.
| App | Fetched for you | Writes |
|---|---|---|
detect |
yolo26n-det-bf16-mla_tess-b1.tar.gz (21 MB) + a 1080p demo clip (13 MB) |
detections.mp4 |
segment |
yolo26n-seg-bf16-mla_tess.tar.gz (24 MB) + the same clip |
segmentation.mp4 |
fall |
the detection pack again + a shorter clip (1.2 MB) | falls.mp4 |
The annotated video is the only thing written. Stills are off unless you ask for them
with --save.
Instance segmentation · per-pixel masks, with the background blurred
sima-vision segment # background blurred, instances sharp
sima-vision segment --keep-classes person # only people stay sharp
sima-vision segment --anonymise # the other way round: blur the people
sima-vision segment --no-blur # a plain overlay, nothing blurred
Fall detection · tracks people and relabels the box when one goes down
sima-vision fall
sima-vision fall --classes person --confirm 2.0
The frame is the one detect draws: same palette, same boxes, same captions. A confirmed
fall changes one thing, the class the box is labelled with, so a person reading person 0.93 a second earlier now reads FALL 0.93. Each fall is also printed on the console and
counted in the run summary.
A confirmed fall re-arms only after sustained recovery.
Apps arguments
Every flag, and which apps take it. All of them are for the three apps, which run on the
DevKit. sima-vision <app> --help prints the same list.
| Flag | Apps | What it does |
|---|---|---|
--source, -s URI |
all | File, https URL, RTSP URL, or empty for the sample clip |
--source-type |
all | video, rtsp or usb. Default video |
--fps N |
all | Source frame rate. Default 0, read from the stream |
--width PX |
all | Source width. Default 0, read from the stream's SPS |
--height PX |
all | Source height. Default 0, read from the stream's SPS |
--model, -m PATH |
all | Compiled pack, or an https URL to one. Empty fetches this app's default |
--labels PATH |
all | Newline-separated class names. Defaults to the packaged COCO list |
--family NAME |
all | Detection head. Must match the model or every box is noise |
--conf T |
all | Minimum confidence. Default 0.30 |
--iou T |
all | Non-max suppression IoU. Default 0.60 |
--max-det N |
all | Top-K cap per frame. Default 50 |
--frames, -n N |
all | Stop after N frames. Default 0, runs until interrupted |
--timeout MS |
all | How long to wait for a frame before giving up. Default 20000 |
--video-path PATH |
all | Where the annotated recording is written |
--no-video |
all | Do not record |
--video-encoder |
all | sima (hardware H.264, default) or opencv (software, about ten times slower) |
--video-bitrate KBPS |
all | Target bitrate for the hardware encoder. Default 12000 |
--save |
all | Also write annotated stills. Off by default, so only the video is written |
--save-dir DIR |
all | Where annotated stills are written. Implies --save |
--save-every N |
all | Write every Nth still. Default 10 once stills are on; implies --save. 0 disables |
--no-save |
all | Do not write stills. Already the default; use it to override a config file |
--show-fps |
all | Show the FPS badge on the overlay (hidden by default) |
--no-hud |
all | Leave the frame-rate badge off the overlay |
--hud-scale N |
all | Frame-rate badge font size. Default 2.4, which is 1.5x the caption scale; 0 follows the caption scale exactly |
--hud-thickness N |
all | Badge stroke weight. Default 6, which is 1.5x the caption thickness; 0 follows it exactly |
--hud-bg B,G,R |
all | Badge fill colour. Default 132,28,193 (#C11C84) |
--hud-color B,G,R |
all | Badge text colour. Default 255,255,255 |
--hud-padding PX |
all | Gap between badge text and its edge, which is what sizes the badge. Default 22; 0 follows the caption padding |
--config, -c PATH |
all | Config file. Defaults to ./config.yaml |
--no-config |
all | Ignore any config file and use defaults plus these flags |
--validate |
all | Resolve and check the settings, then stop. Needs no board |
--quiet, -q |
all | Warnings, errors and the closing report only |
--profile |
all | Per-stage timings, when a run is slower than it should be |
--queue-depth N |
all | Neat's own queue depth. Below 4 the graph drops frames when the recorder falls behind. Default 4 |
--sink-queue-depth N |
all | Finished frames that may wait for the recorder. Host memory only. Default 12 |
--sink-queue-mb MB |
all | Memory budget for that backlog, which grows it to fit a known clip |
--output-buffers N |
all | Buffers each public output may hold. Default 1 |
--decoder-buffers N |
all | Buffers to ask the decoder for. Default 0, sized from the stream's reference frames |
--decoder-tuning |
all | Hardware decoder preset. Default default, which keeps every frame; auto drops frames in bursts |
--segment-frames N |
all | Frames per piece when a clip is too long for one decode. Default 150; 0 runs it whole |
--blur / --no-blur |
segment |
Blur the background and keep instances sharp. On by default; --no-blur draws a plain overlay |
--blur-method |
segment |
gaussian, pixelate or none. Default gaussian |
--blur-strength PX |
segment |
Gaussian kernel width at 1080p. Default 41 |
--keep-classes CLASS... |
segment |
Names or ids that stay sharp. Default: every detected class |
--anonymise, --anonymize |
segment |
Blur the instances instead of the background |
--mask-threshold T |
segment |
Mask cut-off as a probability. Default 0.5; lower grows instances |
--no-masks |
segment |
Blur around plain boxes instead. Needs no segment head |
--minimal |
segment |
Pull frames and do nothing else. Tells a slow app from a stalled graph |
--classes CLASS... |
fall |
Classes that can fall. Default person |
--confirm S |
fall |
How long a fall signal must hold before it counts. Default 1.5 |
--no-fall |
fall |
Track without judging falls, which is how you tune tracking first |
A config.yaml in the working directory is picked up on its own. Flags beat it, and it
beats the built-in defaults.
Your own model
A trained .pt has to be compiled into a .tar.gz pack before the board can run it. The
compiler is the afe package and exists only inside the Palette Model SDK container,
which is x86 Docker, which on Windows means WSL2. So the whole of this runs on your PC,
needs a community.sima.ai account and ~10 GB of disk, and
takes about 30 minutes the first time. Quickstart needs none of it.
Converting a trained .pt into a DevKit pack
# --- PowerShell, as Administrator -------------------------------------------
wsl --install -d Ubuntu
wsl -l -v # want: Ubuntu, Running, 2
# Install Docker Desktop, then Settings > Resources > WSL integration > Ubuntu.
# Without that toggle docker works in PowerShell and is missing inside Ubuntu.
wsl -d Ubuntu # everything below is Ubuntu. exit comes back
# --- Ubuntu ------------------------------------------------------------------
docker run hello-world # must print "Hello from Docker!"
sudo apt update && sudo apt install -y python3-venv python3-pip
python3 -m venv ~/sima # Ubuntu refuses a bare pip install
source ~/sima/bin/activate # new shells start outside it. Look for (sima)
pip install sima-cli
sima-cli login
sima-cli install ghcr:sima-neat/sdk:v2.0.0 # several GB, once per machine
cd /path/to/your/model # the folder holding best.pt
sima-cli sdk setup --workspace . # . is what gets mounted. 15-20 minutes
activate-model-compiler
# --- Model SDK shell ---------------------------------------------------------
pip install "sima-vision[compile]" # ultralytics, onnx, onnxsim
sima-vision compile best.pt # ONNX, bfloat16, tessellate, ELF. 10-15 minutes
# -> build/best_mpk.tar.gz
# --- on the DevKit -----------------------------------------------------------
sima-vision push build/best_mpk.tar.gz
sima-vision detect --model best_mpk.tar.gz
sima-vision detect --model https://example.com/my-model.tar.gz # a URL works too
Moving files
Output lands beside the run, on the board, and both commands are typed on your PC. Name the board once and neither command needs
--host:
$env:SIMA_VISION_DEVKIT="sima@<devkit-ip>"
sima-vision pull # everything the run left
sima-vision pull --into results/
sima-vision push my-clip.h264
Environment
| Variable | What it does |
|---|---|
SIMA_VISION_DEVKIT |
The board, as user@address, so push and pull stop asking |
SIMA_VISION_ASSETS |
Where clips and models are downloaded. Default ./assets |
SIMA_VISION_PYNEAT |
The pyneat virtualenv, when the search does not find it |
SIMA_VISION_PYNEAT_INDEX |
A pip index carrying a pyneat wheel, if your site publishes one |
SIMA_VISION_AUTO_INSTALL |
0 to look but never install |
SIMA_VISION_QUIET |
Non-empty is --quiet for every command |
SIMA_VISION_COLOR |
0 or 1 to force colour off or on. NO_COLOR also works |
Contributing
git clone https://github.com/RizwanMunawar/sima-projects.git
cd sima-projects
pip install -e ".[dev]"
ruff check sima_vision tests
pytest -q
The tests need no board.
License
The models used here for testing are Ultralytics YOLO26, under AGPL-3.0. All other parts of this repository are under Apache-2.0. See LICENSE.
Credits
- SiMa.ai for Modalix, the Palette SDK and Neat
- Ultralytics for the YOLO26 models
- Timothy Do for the Neat 0.4.0 port, frame-complete recordings and hardware H.264 recording
Metadata
Release files for sima-vision 26.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sima_vision-26.0.3.tar.gz | 242.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sima_vision-26.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 416.4 kB
Release files / sima_vision-26.0.3.tar.gz
| Download URL | sima_vision-26.0.3.tar.gz |
|---|---|
| Size | 242.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
19daef1b542e5d3494ae51451c96ec4990ce870c73c123e1c518f3994ea599af
|
|
BLAKE2b-256 checksum How to use checksums |
8fbfe6f3d48078e0a84d7e570b358a2d88f05fb3140f22c0f7cc085ac7f533a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency logRelease files / sima_vision-26.0.3-py3-none-any.whl
| Download URL | sima_vision-26.0.3-py3-none-any.whl |
|---|---|
| Size | 173.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4eb886c057d3c565ecf405dcec4cac0fdf3e6847b53a282514fe5ec738bc07bd
|
|
BLAKE2b-256 checksum How to use checksums |
044a7876e29b8630f5bc5cde981e274af6524881b6884800734d9992178387b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.
Transparency log