ZFTurbo / Weighted-Boxes-Fusion

Set of methods to ensemble boxes from different object detection models, including implementation of "Weighted boxes fusion (WBF)" method.
MIT License
1.7k stars 237 forks source link

Incorrect allows_overflow=False mode #38

Closed Sergey-Zlobin closed 2 years ago

Sergey-Zlobin commented 2 years ago

Example:

from ensemble_boxes import *

weigths = [0.2, 0.2, 0.2, 0.2, 0.2]
pred_boxes = []
pred_scores = []
pred_labels = []
for _ in range(5):
    pred_boxes.append([[0.    , 0.    , 0.0001, 0.0001]])
    pred_scores.append([1.])
    pred_labels.append([0])

pred_boxes, pred_scores, pred_labels = weighted_boxes_fusion(
    pred_boxes,
    pred_scores,
    pred_labels,
    weights=weigths,
    iou_thr=0.4,
    skip_box_thr=0.,
    allows_overflow=False
)
print(pred_scores)

Actual result: score [0.2] Expected result: score [1]

Probably we need to change the line weighted_boxes[i][1] = weighted_boxes[i][1] min(weights.sum(), len(clustered_boxes)) / weights.sum() -> weighted_boxes[i][1] = weighted_boxes[i][1] min(len(weights), len(clustered_boxes)) / weights.sum()

Sergey-Zlobin commented 2 years ago

Workaround: use conf_type='box_and_model_avg' instead of default conf_type='avg'

ZFTurbo commented 2 years ago

Looks fine. Thank you

shanggdlk commented 2 years ago

Example:

from ensemble_boxes import *

weigths = [0.2, 0.2, 0.2, 0.2, 0.2]
pred_boxes = []
pred_scores = []
pred_labels = []
for _ in range(5):
    pred_boxes.append([[0.    , 0.    , 0.0001, 0.0001]])
    pred_scores.append([1.])
    pred_labels.append([0])

pred_boxes, pred_scores, pred_labels = weighted_boxes_fusion(
    pred_boxes,
    pred_scores,
    pred_labels,
    weights=weigths,
    iou_thr=0.4,
    skip_box_thr=0.,
    allows_overflow=False
)
print(pred_scores)

Actual result: score [0.2] Expected result: score [1]

Probably we need to change the line weighted_boxes[i][1] = weighted_boxes[i][1] min(weights.sum(), len(clustered_boxes)) / weights.sum() -> weighted_boxes[i][1] = weighted_boxes[i][1] min(len(weights), len(clustered_boxes)) / weights.sum()

Sorry, I didn't get the point of this line:

Probably we need to change the line 
weighted_boxes[i][1] = weighted_boxes[i][1] * min(**weights.sum()**, len(clustered_boxes)) / weights.sum() -> weighted_boxes[i][1] = weighted_boxes[i][1] * min(**len(weights),** len(clustered_boxes)) / weights.sum()

In the above example, weights.sum()=1, len(clustered_boxes)) = 1, len(weights) = 5. So both two lines have the same output, did I misunderstand something here?

Thank you!

ZFTurbo commented 2 years ago

For line 1 variable is 1. For line 2 variable is 5. Why result must be the same?

shanggdlk commented 2 years ago

For line 1 variable is 1. For line 2 variable is 5. Why result must be the same? my bad, misreading the variable. Thanks for the clarification!