To run MAMMA on a new multi-view capture you bring two pieces:
- Multi-view footage — one video file (or image directory) per camera, organized into sequences.
- Calibration — per-camera intrinsics + extrinsics.
Then either let the GUI mint a capture descriptor for you, or hand-author one. Both paths end with the same pipeline-run command.
Pick a directory under data/ (gitignored) and use one of two layouts.
Videos (one .mp4 per camera per sequence):
data/<your-dataset>/
├── <sequence_1>/
│ └── videos/
│ ├── cam_01.mp4
│ ├── cam_02.mp4
│ └── …
├── <sequence_2>/
│ └── videos/
│ └── …
Image directories (one directory of frames per camera per sequence):
data/<your-dataset>/
├── <sequence_1>/
│ └── images/
│ ├── cam_01/
│ │ ├── 00000.jpg
│ │ └── …
│ ├── cam_02/
│ └── …
Camera names (cam_01, etc.) are yours to choose — they just have to match the names you list in the calibration and capture descriptor below.
Save it alongside the shipped examples (configs/examples/calib/<your-dataset>.yaml) or anywhere on disk you like. Three formats are accepted:
| Extension | Format |
|---|---|
.yaml / .yml |
Pinhole + radtan distortion, Hamilton [w, x, y, z] quaternion. |
.xcp |
Vicon export (5-parameter Vicon radial distortion). |
.json |
OpenCV-style: 3×3 intrinsics + 3×4 extrinsics + 5-param distortion. |
Minimal YAML (one block per camera):
cameras:
cam_01:
camera_model: pinhole
distortion_model: radtan # or vicon_radial_2 for Vicon exports
intrinsics: [fx, fy, cx, cy]
distortion_coeffs: [k1, k2, p1, p2, k3]
resolution: [width, height]
translation: [tx, ty, tz] # in metres
rotation_quaternion: [w, x, y, z] # Hamilton convention
cam_02:
…The keys under cameras: must match the camera names you use in your footage filenames (or image-dir names) and in the capture descriptor below.
A capture JSON tells the runner where your footage lives and which cameras + sequences belong to it. Two ways:
GUI (recommended). Open the Captures tab in the GUI (bash gui/scripts/dev.sh), click + New capture, point it at your footage root + calibration file. The backend auto-detects sequences (each subfolder) and cameras (from the first sequence's subfolders) and writes the JSON for you.
Manual. Create the file at e.g. configs/examples/captures/<your-dataset>.json:
{
"capture_root": "../../../data/<your-dataset>",
"calib": "../calib/<your-dataset>.yaml",
"cam_fps": 30,
"videos_subdir": "videos",
"cams": ["cam_01", "cam_02", "cam_03", "cam_04"],
"sequences": {
"000": { "name": "<sequence_1>" },
"001": { "name": "<sequence_2>" }
}
}Notes:
- Paths in
capture_rootandcalibare resolved relative to the capture JSON file's parent directory. Use absolute paths if your JSON lives outsideconfigs/examples/captures/. - For the image-directory layout, set
"videos_subdir": "images"(or whatever your per-camera subdirectory is called). cam_fpsis read byma_capand stamped into the per-camera NPZs the rest of the pipeline consumes.
python -m inference run \
--cfg configs/examples/presets/quick.yaml \
--capture configs/examples/captures/<your-dataset>.json \
--out-tag run01 -vquick.yaml runs a 30-frame slice (start_frame: 60, end_frame: 90) for a fast end-to-end check. Switch to presets/full.yaml for full-frame runs.
Or use the GUI's Tasks board: pick the preset + your capture, click Run.
Outputs land under output/ma_*/run01/<your-dataset>/<sequence>/… — see CONFIGS.md → Output path layout for the per-segment meaning.
If you only want to run one sequence and don't want to author the capture descriptor, you can pass the footage + calibration + sequence name directly. The runner synthesizes the capture in memory:
python -m inference run \
--cfg configs/examples/presets/quick.yaml \
--footage data/<your-dataset> \
--seq_name <sequence_1> \
--calib configs/examples/calib/<your-dataset>.yaml \
--out-tag run01 -vCameras and the videos-subdir layout are auto-detected from <footage>/<seq_name>/. Equivalent to building a capture JSON for one sequence and running with --capture, but no file written to disk. One sequence per invocation.
- Capture JSON + preset schema:
docs/CONFIGS.md - Pipeline step → builder mapping:
docs/steps.md - What each step produces: README → Pipeline