【发布时间】:2017-08-31 20:07:48
【问题描述】:
我有一个真实对象列表(蓝色;1-4)和一个预测对象列表(红色;a-d)。为了计算用于评估预测性能的指标,我需要将预测对象分配给 groundtruth 对象。任何对象都不应该被使用两次!
右图显示了问题的一些可能解决方案(X、Y、Z),其中紫色区域表示匹配对象之间的重叠。
为了实现这一点,我创建了一个交集矩阵,其中包含所有对象的交集(具有重叠率 [Intersection/Union])。对于可视化的示例,它看起来如下所示(例如,表示 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_objects 进行迭代反而会导致解决方案 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
问题是,要确定一个匹配是否真的适合一个对象,检查同一个候选对象是否不会更好地匹配另一个对象(它具有更高的分数)是有意义的或者可能根本不包括在内)。但它很快就变得复杂了,如图左侧所示:
- 判断是否匹配obj_1 -> obj_a,我们需要检查obj_a,它也可以匹配obj_2。
- 为了判断,我们需要检查obj_b和obj_c,后者也可以是obj_3。
- 要判断,我们需要检查 obj_d,它也可以匹配 obj_4 ...
我认为要获得最佳解决方案,需要迭代地进行,如图所示。
说明最优性的可能(且有意义的)规则是
- 将预测 obj 与最高分匹配...
- ...只要这不会阻止其他对象的更高匹配度
- 可能受阈值保护以避免像 这样的错误匹配
到目前为止,我对此的看法。我现在的问题是:
- 这是否对应于一个已知的(并且经过充分描述和解决的)算法问题?
- 是否已经有算法/实现 这个问题?
- 或者有没有人知道如何在 有限且有效的方法?
【问题讨论】:
标签: image-processing machine-learning object-detection