我想对边界框数组(坐标为[ymin, xmin, ymax, xmax]
)进行分区,如本文[https://arxiv.org/pdf/1710.06677.pdf][1]中所述。我的门槛是将两个边界框组合在一起的联合上方的交集。
我了解了Union-Find数据结构,并通过一些简单的清单示例对其进行了测试。但是,这些列表只包含整数作为列表元素,而不是边界框,并且边界框分区实现不起作用。
我认为问题在于创建集合。因为有了简单的列表,我可以为列表索引分配一个整数。但是我无法使用边界框来执行此操作,因此这些示例不适用于我的情况。
有没有人可以帮助我实现边界框的Union-Find数据结构?
我得到帮助的来源:
https://medium.com/100-days-of-algorithms/day-41-union-find-d0027148376d
https://www.geeksforgeeks.org/union-find/
答案 0 :(得分: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)