我正在编写代码,从对象检测模型对边界框执行非最大值抑制。我有一个地理定位边界框的主列表,它们是geolocated_annotations =[[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]]
坐标的嵌套列表。(x3,y3)和(x4,y4)坐标是边界框的地理位置。我在深度学习模型中使用了一个嵌入式NMS函数,结果是keep=[[x1, y1, x2, y2]]
坐标的嵌套列表。keep
中的结果没有最后两个坐标,因为嵌入函数没有考虑地理位置
我想将keep
列表与geolocated_annotations
列表进行比较,从keep
中找到所有(x1,y1)和x2,y2)坐标,它们等于geolocated_annotations
中的(x1,y1)和(x2,y2)坐标。来自keep
的这两个坐标与来自geolocated_annotations
的地理位置坐标相关联,因此如果(x1,y1)和(x2,y2)值相等,则主列表中的(x3,y3)和(x4,y4)值可以与它们关联。我需要以一个包含所有四个(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4)坐标的列表结束
我有一个半工作代码,但它最终在最终列表中保留了比keep
列表中更多的坐标。循环遍历所有坐标也需要很长时间
这两个列表的一个更全面的示例:
geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]
keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
[624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
[624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]
这是我的起始代码:
bboxes_keep=[]
for i in geolocated_annotations:
for j in keep:
if i[0][0]==j[0] and i[0][1]==j[1] and i[1][0]==j[2] and i[2][1]==j[3]:
bboxes_keep.append(i)
预期产出示例:
bboxes_keep=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)]]
关于如何使我的代码更加精炼和准确,有什么想法吗
一般来说,字典查找是开始优化此类问题的最简单方法。因为您有成对的浮点,所以在另一个dict中包含dict的数据存储是实现快速查找的一种方法。我的示例将其与try/except配对,这样,如果x或y不匹配,就会引发异常。请注意,数据存储也是这样设置的:如果有多个点具有相同的x坐标,则所有可能的y值都将在一个键下的字典中
注意:我不得不对这两个列表的结构做一些假设,因为正如评论员所指出的,您的示例中似乎有一些错误。如果我的假设不正确,请修复您的代码并让我知道
相关问题 更多 >
编程相关推荐