我有一个groundtruth对象列表(蓝色; 1-4)和一个预测对象列表(红色; a-d)。要计算评估预测性能的指标,我需要将预测对象分配给groundtruth对象。不应该使用任何对象两次!
图形右侧显示问题的一些可能解决方案(X,Y,Z),其中紫色区域表示匹配对象之间的重叠。
为了实现这一点,我创建了一个交叉矩阵,其中包含所有对象的交叉点(具有重叠比[交点/联合])。对于可视化示例,它看起来像下面(例如,意味着obj_2与obj_a重叠0.3,与obj_b重叠0.1,与obj_c重叠0.3,等等......)
intersection_matrix
| a b c d
--|-----------------
1 | 0.1 - - -
2 | 0.3 0.1 0.3
3 | - - 0.8 -
4 | - - - 0.5
每个对象仅使用一次的约束转换为最多具有一个条目的每个行和列。我首先想到这很简单,但考虑到这一点,我发现这很难以最佳方式解决。
作为一个简单的实现,我开始使用一种算法迭代groundtruth-objects并为其分配一个最大"得分"。
for i = 1:length(groundtruth_objects)
highest_overlap = max(intersect_matrix(i,:));
% take prediction_object with highest overlap as match
match = find(intersect_matrix_iou(i,:) == highest_overlap);
% remove matched objects from intersect_matrix (to avoid further matches)
intersect_matrix(i,:) = 0; % remove groundtruth_object
intersect_matrix(:,match) = 0; % remove prediction_object
% save matched pair as entry in match matrix (which is the solution)
match_matrix(i,match) = highest_overlap;
end
这会导致解决方案X,如示例中所示,这可能非常糟糕。迭代于prediction_object而不是导致解决方案Y,这在这里相当不错,但同样糟糕。
Solution X Solution Y Solution Z
| a b c d | a b c d | a b c d
--|----------------- --|----------------- --|-----------------
1 | 0.1 - - - 1 | - - - - 1 | 0.1 - - -
2 | - - 0.3 - 2 | 0.3 - - - 2 | - 0.1 - -
3 | - - - 0.1 3 | - - 0.8 - 3 | - - 0.8 -
4 | - - - - 4 | - - - 0.5 4 | - - - 0.5
问题是,为了确定匹配是否真的适合某个对象,检查相同的候选者是否在另一个对象上更好地匹配是有意义的(它具有更高的分数或者可能根本不被覆盖的分数。但它很快变得复杂,如图中左侧所示:
我认为对于最佳解决方案,需要迭代进行,如图中所示。
说明最优性的可能(且有意义的)规则是
到目前为止我对此的看法。我现在的问题是:
答案 0 :(得分:0)
是的,这是Assignment problem。
Hungarian method是一种旨在解决分配问题的算法。它允许涉及某个分数/优先级,这可以通过重叠来表示。
有多种语言实现。在这种情况下可能适合的MATLAB实现是this one。