我有一個groundtruth對象(藍色; 1-4)和預測對象(紅色; a-d)列表的列表。要計算評估預測性能的指標,我需要將預測對象分配給groundtruth對象。不應該使用兩次對象!將預測對象/區域唯一地分配給groundtruth對象/區域
圖形右側顯示了問題的一些可能解決方案(X,Y,Z),其中紫色區域表示匹配對象之間的重疊。
爲了實現這一點,我將創建包含一個交叉點的交集矩陣(具有重疊率[交叉口/聯盟])中的所有對象。對於可視化例如它看起來像某物下面(例如意obj_2重疊0.3與OBJ_A,0.1與obj_b,0.3與obj_c,等等...):
intersection_matrix
| a b c d
--|-----------------
1 | 0.1 - - -
2 | 0.3 0.1 0.3
3 | - - 0.8 -
4 | - - - 0.5
該每個對象使用的約束只有一次轉換爲每行最多有一個條目。我首先認爲這很簡單,但讓它有一些思考,我覺得這很難以最佳方式解決。
作爲一個直截了當的實現,我開始使用一個算法迭代groundtruth對象,並指定最大「分數」的算法。
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,如示例中所示,這可能非常糟糕。迭代預測對象反而會導致解決方案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與最高得分。
- ......只要這並不妨礙其他物體上更高匹配
- 由閾值可能保護,以避免像
到目前爲止,我對這個想法糟糕的比賽。我現在的問題是:
- 這是否對應一個已知的(並且很好描述和解決的)算法問題?
- 是否已有算法/實現 此問題?
- 還是有沒有人有一個想法如何實現這個在 有限的和有效的方式?