使用Union-Find对边界框进行分区

问题描述 投票:0回答:1

我想分割一个边界框数组(坐标为[ymin, xmin, ymax, xmax]),如本文所述[https://arxiv.org/pdf/1710.06677.pdf][1]。我的阈值将是union的交集,用于将两个边界框组合在一起。

我理解了Union-Find数据结构,并使用一些简单的列表示例对其进行了测试。但是,这些列表只包含整数作为列表元素而不是边界框,并且我的边界框分区实现不起作用。

我认为问题在于创建集合。因为有了一个简单的列表,我可以为列表索引分配一个整数。但我不能用边界框来做这件事,因此这些例子对我的情况不起作用。

有没有人可以帮我实现边界框的Union-Find数据结构?

来源我得到了帮助:

https://medium.com/100-days-of-algorithms/day-41-union-find-d0027148376d

https://www.geeksforgeeks.org/union-find/

https://www.cs.cmu.edu/~avrim/451f13/lectures/lect0912.pdf

A set union find algorithm

python object-detection object-detection-api union-find
1个回答
0
投票

我设法让它发挥作用。首先,我在所有边界框之间计算了IOU,并将那些> 0.9作为我的图的边缘。但是,此实现会因大量边界框而导致RecursionError: maximum recursion depth exceeded in comparison错误。

我使用https://medium.com/100-days-of-algorithms/day-41-union-find-d0027148376d 的实现来获取代码

def find(data, i):
   if i != data[i]:
       data[i] = find(data, data[i])
   return data[i]

def union(data, i, j):
   pi, pj = find(data, i), find(data, j)
   if pi != pj:
       data[pi] = pj

connections = []
for i in range(len(boxes)):
   for j in range(i + 1, len(boxes)):
       iou = compute_iou(boxes[i], boxes[j])

       if iou >= 0.9:
          connections.append((i,j))

# data is a representation of the bounding to make it
# possible to create Union-Find sets   
data = [bb for bb in range(len(boxes))] 


for i, j in connections:
    union(data, i, j)
© www.soinside.com 2019 - 2024. All rights reserved.