简体   繁体   English

非矩形四边形上并集的交点

[英]Intersection over union on non rectangular quadrilaterals

I am working on the problem of parking space detection.我正在研究停车位检测的问题。 To detect empty parking space I am using intersection over union.为了检测空车位,我使用了联合交叉口。 But, parking spaces aren't always rectangular.但是,停车位并不总是矩形的。 So, I have made a labeling tool that can draw polygons of various shapes.所以,我做了一个标注工具,可以画出各种形状的多边形。 Now, I want to know if there is any python library that provides IOU functionality?现在,我想知道是否有任何提供 IOU 功能的 python 库? If not is there any alternative?如果没有,还有其他选择吗?

在此处输入图像描述

You should use the shapely Python library:您应该使用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 

There is a slight improvement that can be made to ibarrond's answer .可以对ibarrond 的回答稍作改进。 Finding the union of our two quadrilaterals is a costly operation.找到两个四边形的并集是一项代价高昂的操作。 Instead, we can find the area of the union by first adding the areas of both quadrilaterals.相反,我们可以通过首先将两个四边形的面积相加来找到并集的面积。 This will over-count the area where the quadrilaterals overlap, but we can correct this by subtracting the area of the intersect, which we already calculated:这将高估四边形重叠的面积,但我们可以通过减去我们已经计算过的相交面积来纠正这个问题:

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

The following code verifies that this improvement gives the same result, and then it times both versions.以下代码验证此改进是否提供相同的结果,然后对两个版本进行计时。 Function IOU1 contain's ibarrond's code, and function IOU2 contains the improvement. Function IOU1包含 ibarrond 的代码,function 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)

Here's the result I obtained:这是我得到的结果:

time for IOU1:  20.0208661
time for IOU2:  11.0288122

Note that the exact times will vary based on the hardware and the current background activity.请注意,确切时间将根据硬件和当前后台活动而有所不同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM