Procházet zdrojové kódy

fix: optimize block removal logic by tracking processed indices

myhloli před 3 měsíci
rodič
revize
259ab11e74
1 změnil soubory, kde provedl 10 přidání a 2 odebrání
  1. 10 2
      mineru/utils/model_utils.py

+ 10 - 2
mineru/utils/model_utils.py

@@ -259,13 +259,19 @@ def remove_overlaps_low_confidence_blocks(combined_res_list, overlap_threshold=0
         block_info.append((xmin, ymin, xmax, ymax, area, score, block))
 
     blocks_to_remove = []
+    marked_indices = set()  # 跟踪已标记为删除的block索引
 
     # 检查每个block内部是否有3个及以上的小block
     for i, (xmin, ymin, xmax, ymax, area, score, block) in enumerate(block_info):
-        # 查找内部的小block
+        # 如果当前block已标记为删除,则跳过
+        if i in marked_indices:
+            continue
+
+        # 查找内部的小block (仅考虑尚未被标记为删除的block)
         blocks_inside = [(j, j_score, j_block) for j, (xj_min, yj_min, xj_max, yj_max, j_area, j_score, j_block) in
                          enumerate(block_info)
-                         if i != j and is_inside(block_info[j], block_info[i], overlap_threshold)]
+                         if i != j and j not in marked_indices and is_inside(block_info[j], block_info[i],
+                                                                             overlap_threshold)]
 
         # 如果内部有3个及以上的小block
         if len(blocks_inside) >= 3:
@@ -279,6 +285,7 @@ def remove_overlaps_low_confidence_blocks(combined_res_list, overlap_threshold=0
                 for j, _, j_block in blocks_inside:
                     if j_block not in blocks_to_remove:
                         blocks_to_remove.append(j_block)
+                        marked_indices.add(j)  # 标记索引为已处理
 
                 # 扩展大block的边界以包含所有小block
                 new_xmin, new_ymin, new_xmax, new_ymax = xmin, ymin, xmax, ymax
@@ -298,6 +305,7 @@ def remove_overlaps_low_confidence_blocks(combined_res_list, overlap_threshold=0
             else:
                 # 保留小blocks,删除大block
                 blocks_to_remove.append(block)
+                marked_indices.add(i)  # 标记当前索引为已处理
     return blocks_to_remove