[英]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.