Set up the detection system
Live 3D object segmentation on top of the synced multi-device cloud, and what to do when things go wrong.
How 3D segmentation works
2D detection (Python). Each camera's color frame goes to a small, standalone detector service - FastAPI plus Ultralytics YOLO11-seg - that returns per-pixel instance masks.
3D fusion (C++, in-process). The
flowbitserverdetectmodule lifts those masked pixels into a shared world voxel grid and returns typed world-space instances the viewer overlays on the cloud. Detection runs on one synchronized frame group, so an object seen by several cameras fuses into a single instance instead of ghosting across views.
The detector is the only Python piece and is optional. If it is not running, the viewer still renders the live cloud and reports segmentation unavailable.
Full notes are in
<prefix>/detector/INSTALL.md. This page is the summary.
GPU requirements for the detector
The detector is a separate PyTorch process, so the SDK's RTX 3060 rule does not bind it.
Aspect | Requirement |
|---|---|
GPU needed? | Optional. Run setup with |
Recommended GPU | Any NVIDIA CUDA GPU with compute capability ≥ 7.5 (RTX 20-series / T4 or newer) for the default wheels (Windows |
VRAM |
|
System CUDA toolkit | Not required. PyTorch bundles its own CUDA runtime. Only the NVIDIA driver must be recent enough for that wheel's CUDA ( |
Shares the SDK's GPU? | Yes. It can also run on a separate machine — point |
One-time detector setup
Installs a private .venv with CUDA PyTorch and Ultralytics, and fetches the YOLO11-seg weight.
[!NOTE] The weights are AGPL-3.0 and are therefore not shipped. Running setup fetches them locally and accepts the AGPL terms on this machine.
[!TIP] If PowerShell refuses with "File …\setup.ps1 cannot be loaded. The file is not digitally signed", run this first, in the same terminal:
setup.ps1 installs a CUDA build of PyTorch, default wheel index cu128. Override with -TorchIndexUrl "https://download.pytorch.org/whl/cu126", or force CPU-only with -TorchIndexUrl "".
Run the detector service
Leave it in its own terminal. It listens on port 8901.
Verify
[ ]
http://127.0.0.1:8901/healthreturns{"status":"ok"}
The first detection loads the weights lazily and takes a few seconds; later requests are fast.
Run the segment viewer
viewer_opengl_segment is built with the other examples — no extra flag. It takes the same fixed-device-list arguments as the streaming viewer.
Key | Action |
|---|---|
| Segment once, on demand |
| Toggle continuous segmentation |
| Start / stop recording |
Configure detect_config.json
Loaded at startup - edit and restart, no rebuild. Keys prefixed with ? are inline documentation.
Key | Default | Meaning |
|---|---|---|
|
| Base URL of the Python service. Point it elsewhere to run the detector remotely |
|
| Must attach masks for the voxel path. A box-only model produces no masks and fusion sees nothing |
|
| Whitelist of COCO classes run and returned. Empty means detector defaults |
|
| Default for all cameras. |
|
| Per-device override for a mixed-orientation rig: |
|
|
|
|
| Timeout for one detector request |
| — | Fusion tunables: |
Troubleshooting
Symptom | Likely cause | Fix |
|---|---|---|
Nothing detected; log warns "detections carried no mask" | A box-only model is running | Set |
0 detections on a scene that clearly has objects | Camera mounted upside-down | Set |
Some cameras detect, others do not after | Mixed mounting orientations | List the differing cameras in |
Detector logs N detections but the viewer logs | 3D fusion discarding masks, usually floor removal cutting low objects | Set |
"Segmentation unavailable" at launch | Detector not started, or wrong | Start the detector or fix the URL, then press |
Build, link, runtime and streaming problems are on Use the SDK in your own project.