Design principles#

MuFASA is built on three principles. The colors on this page mark where each one shows up, in the architecture and in a complete example.

Detection level

MuFASA works on detections, not raw signals. Only the Input and Output nodes deal with files and formats. Everything in between works on Locations and Maps.

Explicit architecture

A fusion system is a graph of nodes that connect wherever their data types match. The wiring is the code, and every stage stays inspectable.

Rapid prototyping

A complete graph takes about ten lines of Python, with every parameter in plain sight. The same graph runs on recorded data and, with streaming inputs, on live data.

Where MuFASA sits#

A Fusion Graph sits between your perception and your decision support. Its Input and Output nodes form the boundary to the outside world, and its Processing nodes hold the fusion logic.

Sensors & perception

Cameras, radar, …

Input nodes

Translate detections

Processing nodes

Fuse and detect

Output nodes

Translate results

Decision support

Alarms, operators

The principles in an example#

This graph fuses two sensors with a static prior and turns the result into alarms.

from mufasa import Graph, BoundingBox
from mufasa.io.inputs import GeoJsonInput
from mufasa.io.outputs import GeoJsonOutput
from mufasa.nodes import StaticMap, POM, BayesianFusion, Threshold

# Input nodes
track_a = GeoJsonInput("sensor_a.geojson")
track_b = GeoJsonInput("sensor_b.geojson")
static = StaticMap("priors.geojson")

# Processing nodes
pom_a = POM(decay_s=5)(track_a)
pom_b = POM(decay_s=1)(track_b)
fused = BayesianFusion()(pom_a, pom_b, static)
alarms = Threshold(threshold=0.7)(fused)

# Output nodes
out = GeoJsonOutput("alarms.geojson")(alarms)

# Fusion Graph
bbox = BoundingBox(48.268, 16.426, 48.27, 16.4275)
graph = Graph(inputs=[track_a, track_b], outputs=[out],
              crs="EPSG:32639", bbox=bbox, resolution=(10, 10))
graph.run()
GJIGeoJsonInputLocation family: ObservationObservationGJIGeoJsonInputLocation family: ObservationObservationSMStaticMapMap family: BayesianMapBayesianMapPOMPOMLocation family: ObservationObservationMap family: BayesianMapBayesianMapPOMPOMLocation family: ObservationObservationMap family: BayesianMapBayesianMapBFBayesianFusionMap family: BayesianMapBayesianMapMap family: BayesianMapBayesianMapTHThresholdMap family: BayesianMapBayesianMapLocation family: ObservationObservationGJOGeoJsonOutputLocation family: LocationLocation