Combine¶
For a full guide including backend selection, usage examples, and per-category postprocessing, see the Postprocessing Backends page.
sahi.postprocess.combine
¶
Postprocessing strategies for combining predictions from sliced inference.
Classes¶
GreedyNMMPostprocess
¶
Bases: NMMPostprocess
Postprocessor using Greedy Non-Maximum Merging (NMM).
Similar to NMM but uses a greedy strategy: each kept prediction only merges boxes that directly overlap with it (no transitive merging). This is faster than full NMM and produces tighter merged boxes.
Source code in sahi/postprocess/combine.py
LSNMSPostprocess
¶
Bases: PostprocessPredictions
Postprocessor using Locality-Sensitive NMS from the lsnms package.
Uses a spatial index for fast neighbor lookup, making it efficient for
large numbers of predictions. Only supports IoU metric (not IoS).
Requires the lsnms package (pip install lsnms>0.3.1).
Note
This postprocessor is experimental and not recommended for production use.
Source code in sahi/postprocess/combine.py
Functions¶
__call__(object_predictions)
¶
Apply Locality-Sensitive NMS to suppress overlapping predictions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
object_predictions
¶ |
list[ObjectPrediction]
|
List of ObjectPrediction instances to suppress. |
required |
Returns:
| Type | Description |
|---|---|
list[ObjectPrediction]
|
List of suppressed ObjectPrediction instances. |
Raises:
| Type | Description |
|---|---|
ModuleNotFoundError
|
If the lsnms package is not installed. |
NotImplementedError
|
If match_metric is not "IOU". |
Source code in sahi/postprocess/combine.py
NMMPostprocess
¶
Bases: PostprocessPredictions
Postprocessor using Non-Maximum Merging (NMM) with transitive merging.
Instead of discarding overlapping detections, merges their bounding boxes, masks, and scores. Uses non-greedy transitive merging: if A overlaps B and B overlaps C, all three are merged even if A does not directly overlap C.
Source code in sahi/postprocess/combine.py
Functions¶
__call__(object_predictions)
¶
Apply Non-Maximum Merging to merge overlapping predictions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
object_predictions
¶ |
list[ObjectPrediction]
|
List of ObjectPrediction instances to merge. |
required |
Returns:
| Type | Description |
|---|---|
list[ObjectPrediction]
|
List of merged ObjectPrediction instances. |
Source code in sahi/postprocess/combine.py
NMSPostprocess
¶
Bases: PostprocessPredictions
Postprocessor using Non-Maximum Suppression (NMS).
Keeps the highest-scored prediction among overlapping boxes and discards the rest. Does not merge bounding boxes or masks.
Source code in sahi/postprocess/combine.py
Functions¶
__call__(object_predictions)
¶
Apply Non-Maximum Suppression to suppress overlapping predictions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
object_predictions
¶ |
list[ObjectPrediction]
|
List of ObjectPrediction instances to suppress. |
required |
Returns:
| Type | Description |
|---|---|
list[ObjectPrediction]
|
List of suppressed ObjectPrediction instances. |
Source code in sahi/postprocess/combine.py
PostprocessPredictions
¶
Bases: ABC
Abstract base class for postprocessing object prediction lists.
Subclasses implement a specific strategy (NMS, NMM, greedy NMM, etc.) to reduce overlapping detections produced by sliced inference.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
float
|
Minimum overlap value (IoU or IoS) to consider two predictions as matching. |
0.5
|
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
bool
|
If True, apply postprocessing across all categories. If False, apply per category independently. |
True
|
Source code in sahi/postprocess/combine.py
Functions¶
__call__(predictions)
abstractmethod
¶
Apply postprocessing to the list of predictions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
predictions
¶ |
list[ObjectPrediction]
|
List of ObjectPrediction instances to postprocess. |
required |
Returns:
| Type | Description |
|---|---|
list[ObjectPrediction]
|
List of postprocessed ObjectPrediction instances. |
Source code in sahi/postprocess/combine.py
__init__(match_threshold=0.5, match_metric='IOU', class_agnostic=True)
¶
Initialize the postprocessor with configuration parameters.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
match_threshold
¶ |
float
|
Minimum overlap value (IoU or IoS) to consider two predictions as matching. |
0.5
|
match_metric
¶ |
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
class_agnostic
¶ |
bool
|
If True, apply postprocessing across all categories. If False, apply per category independently. |
True
|
Source code in sahi/postprocess/combine.py
Functions¶
batched_greedy_nmm(predictions, match_metric='IOU', match_threshold=0.5)
¶
Apply greedy non-maximum merging independently per category.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to merge a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
dict[int, list[int]]
|
Dict mapping each kept index to a list of indices merged into it. |
Source code in sahi/postprocess/combine.py
batched_nmm(predictions, match_metric='IOU', match_threshold=0.5)
¶
Apply non-maximum merging (non-greedy, transitive) independently per category.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to merge a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
dict[int, list[int]]
|
Dict mapping each kept index to a list of indices merged into it. |
Source code in sahi/postprocess/combine.py
batched_nms(predictions, match_metric='IOU', match_threshold=0.5)
¶
Apply non-maximum suppression independently per category.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to suppress a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
list[int]
|
List of indices of the kept predictions, sorted by score descending. |
Source code in sahi/postprocess/combine.py
greedy_nmm(predictions, match_metric='IOU', match_threshold=0.5)
¶
Greedy non-maximum merging for axis-aligned bounding boxes.
Instead of discarding overlapping boxes, merges them into the highest-scored box. Dispatches to the resolved backend.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to merge a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
dict[int, list[int]]
|
Dict mapping each kept index to a list of indices merged into it. |
Source code in sahi/postprocess/combine.py
nmm(predictions, match_metric='IOU', match_threshold=0.5)
¶
Non-maximum merging (non-greedy, transitive) for axis-aligned bounding boxes.
Unlike greedy NMM, this variant allows transitive merging: if box A merges with B and B merges with C, all three are merged together. Dispatches to the resolved backend.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to merge a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
dict[int, list[int]]
|
Dict mapping each kept index to a list of indices merged into it. |
Source code in sahi/postprocess/combine.py
nms(predictions, match_metric='IOU', match_threshold=0.5)
¶
Non-maximum suppression for axis-aligned bounding boxes.
Dispatches to the resolved backend (numpy, numba, or torchvision).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
|
ndarray
|
Array of shape (N, 6) with columns [x1, y1, x2, y2, score, category_id]. |
required |
|
str
|
Overlap metric, "IOU" or "IOS". |
'IOU'
|
|
float
|
Minimum overlap to suppress a lower-scored box. |
0.5
|
Returns:
| Type | Description |
|---|---|
list[int]
|
List of indices of the kept predictions, sorted by score descending. |