【问题标题】:Intersection over union on non rectangular quadrilaterals非矩形四边形上并集的交点
【发布时间】:2019-10-17 14:41:05
【问题描述】:

我正在研究停车位检测问题。为了检测空车位,我使用了联合交叉口。但是,停车位并不总是矩形的。所以,我做了一个标注工具,可以画出各种形状的多边形。现在,我想知道是否有任何提供 IOU 功能的 python 库?如果没有,还有其他选择吗?

【问题讨论】:

  • 所以你想计算两个多边形的 IoU 作为一种我猜对的盒子?
  • @denis_lor 是的。一个框是来自 Mask RCNN 模型的正方形,另一个是非矩形多边形。

标签: python computer-vision object-detection


【解决方案1】:

您应该使用shapely Python 库:

from shapely.geometry import box, Polygon

# Define Each polygon 
pol1_xy = [[130, 27], [129.52, 27], [129.45, 27.1], [130.13, 26]]
pol2_xy = [[30, 27.200001], [129.52, 27.34], [129.45, 27.1], [130.13, 26.950001]]
polygon1_shape = Polygon(pol1_xy)
polygon2_shape = Polygon(pol2_xy)

# Calculate Intersection and union, and tne IOU
polygon_intersection = polygon1_shape.intersection(polygon2_shape).area
polygon_union = polygon1_shape.union(polygon2_shape).area
IOU = polygon_intersection / polygon_union 

【讨论】:

  • 顶点的顺序重要吗?
  • 它不会,只要你在两种情况下顺时针或逆时针列出它们
【解决方案2】:

可以对ibarrond's answer 进行轻微改进。找到两个四边形的并集是一项代价高昂的操作。相反,我们可以通过首先将两个四边形的面积相加来找到并集的面积。这将高估四边形重叠的面积,但我们可以通过减去我们已经计算过的相交面积来纠正这个问题:

def IOU(pol1_xy, pol2_xy):
    # Define each polygon
    polygon1_shape = Polygon(pol1_xy)
    polygon2_shape = Polygon(pol2_xy)

    # Calculate intersection and union, and the IOU
    polygon_intersection = polygon1_shape.intersection(polygon2_shape).area
    polygon_union = polygon1_shape.area + polygon2_shape.area - polygon_intersection
    return polygon_intersection / polygon_union

以下代码验证此改进是否提供相同的结果,然后对两个版本进行计时。函数IOU1 包含ibarrond 的代码,函数IOU2 包含改进。

from shapely.geometry import Polygon
from timeit import timeit

def IOU1(pol1_xy, pol2_xy):
    # Define each polygon
    polygon1_shape = Polygon(pol1_xy)
    polygon2_shape = Polygon(pol2_xy)

    # Calculate intersection and union, and the IOU
    polygon_intersection = polygon1_shape.intersection(polygon2_shape).area
    polygon_union = polygon1_shape.union(polygon2_shape).area
    return polygon_intersection / polygon_union

def IOU2(pol1_xy, pol2_xy):
    # Define each polygon
    polygon1_shape = Polygon(pol1_xy)
    polygon2_shape = Polygon(pol2_xy)

    # Calculate intersection and union, and tne IOU
    polygon_intersection = polygon1_shape.intersection(polygon2_shape).area
    polygon_union = polygon1_shape.area + polygon2_shape.area - polygon_intersection
    return polygon_intersection / polygon_union

if __name__ == '__main__':
    # Define test coordinates:
    pol1_xy = [[130, 27], [129.52, 27], [129.45, 27.1], [130.13, 26]]
    pol2_xy = [[30, 27.200001], [129.52, 27.34], [129.45, 27.1], [130.13, 26.950001]]

    # Test that results are the same (except for minor rounding differences):
    assert abs(IOU1(pol1_xy, pol2_xy) - IOU2(pol1_xy, pol2_xy)) < 1e-16

    # Determine speeds of both functions:
    t1=timeit('IOU1(pol1_xy, pol2_xy)', number=100000,
              setup='from __main__ import IOU1, pol1_xy, pol2_xy')
    t2=timeit('IOU2(pol1_xy, pol2_xy)', number=100000,
              setup='from __main__ import IOU2, pol1_xy, pol2_xy')
    print('time for IOU1:  %s' %t1)
    print('time for IOU2:  %s' %t2)

这是我得到的结果:

time for IOU1:  20.0208661
time for IOU2:  11.0288122

请注意,具体时间会因硬件和当前后台活动而异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 2013-05-23
    • 1970-01-01
    • 2019-12-14
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多