Skip to content

Fusion Strategies

Gaurav14cs17 edited this page Jun 21, 2026 · 1 revision

Fusion Strategies

FlashFusion provides multiple fusion strategies for combining predictions from multiple models.

Available Strategies

Strategy Key Best For
Weighted Box Fusion wbf Detection ensembles (best mAP)
Voting Ensemble voting Classification consensus
Cascade Fusion cascade Sequential refinement
Stacking Ensemble stacking Learned combination
NMS Fusion nms Fast duplicate removal

Weighted Box Fusion (WBF)

WBF merges overlapping boxes using confidence-weighted averaging. It produces more accurate localizations than NMS by averaging coordinates rather than selecting a single box.

from flashfusion.strategies import WeightedBoxFusion

wbf = WeightedBoxFusion(
    weights=[0.6, 0.4],       # per-model importance
    iou_threshold=0.55,        # clustering threshold
    skip_box_threshold=0.01,   # minimum confidence
    conf_type="avg",           # 'avg', 'max', 'box_and_model_avg'
)

fused = wbf.fuse(model_outputs)

How WBF Works

  1. Collect all boxes from all models with associated weights
  2. Sort by weighted confidence
  3. Cluster overlapping boxes (IoU > threshold) with same class
  4. Compute weighted average coordinates for each cluster
  5. Return cluster centers as fused detections

Voting Ensemble

Majority voting for classification or box selection based on agreement across models.

from flashfusion.strategies import VotingEnsemble

voting = VotingEnsemble()
fused = voting.fuse(model_outputs)

Cascade Fusion

Sequential pipeline where each stage refines the previous output.

from flashfusion.strategies import CascadeFusion

cascade = CascadeFusion()
# Stage 1 proposes, Stage 2 refines
fused = cascade.fuse([coarse_output, refined_output])

NMS Fusion

Standard Non-Maximum Suppression applied across all model predictions.

from flashfusion.strategies import NMSFusion

nms = NMSFusion()
fused = nms.fuse(model_outputs)

Stacking Ensemble

Learned meta-model that combines base model outputs.

from flashfusion.strategies import StackingEnsemble

stacking = StackingEnsemble()
fused = stacking.fuse(model_outputs)

Strategy Factory

Use get_strategy() to instantiate by name:

from flashfusion.strategies import get_strategy

strategy = get_strategy("wbf", weights=[0.5, 0.5], iou_threshold=0.6)

Custom Strategies

Register your own strategy via the registry:

from flashfusion.registry import STRATEGIES

@STRATEGIES.register("my_fusion")
class MyFusion:
    def fuse(self, predictions, weights=None):
        # Your fusion logic here
        ...

Strategy Comparison

Use the benchmark example to compare strategies:

python examples/benchmark_fusion.py --device cuda

Clone this wiki locally