python shapely.geometry.polygon任意两个四边形的IOU计算实例


Posted in Python onApril 12, 2020

在目标检测中一个很重要的问题就是NMS及IOU计算,而一般所说的目标检测检测的box是规则矩形框,计算IOU也非常简单,有两种方法:

1. 两个矩形的宽之和减去组合后的矩形的宽就是重叠矩形的宽,同比重叠矩形的高

2. 右下角的minx减去左上角的maxx就是重叠矩形的宽,同比高

然后 IOU = 重叠面积 / (两矩形面积和—重叠面积)

然,不规则四边形就不能通过这种方式来计算,找了好久数学资料,还是没找到答案(鄙人数学渣渣),最后看了白翔老师的textBoxes++论文源码后,知道python的shapely包可以直接做到,下面给出的代码和注释:

import numpy as np 
import shapely
from shapely.geometry import Polygon,MultiPoint #多边形
 
line1=[2,0,2,2,0,0,0,2]  #四边形四个点坐标的一维数组表示,[x,y,x,y....]
a=np.array(line1).reshape(4, 2)  #四边形二维坐标表示
poly1 = Polygon(a).convex_hull #python四边形对象,会自动计算四个点,最后四个点顺序为:左上 左下 右下 右上 左上
print(Polygon(a).convex_hull) #可以打印看看是不是这样子
 
line2=[1,1,4,1,4,4,1,4]
b=np.array(line2).reshape(4, 2)
poly2 = Polygon(b).convex_hull
print(Polygon(b).convex_hull)
 
union_poly = np.concatenate((a,b))  #合并两个box坐标,变为8*2
#print(union_poly)
print(MultiPoint(union_poly).convex_hull)   #包含两四边形最小的多边形点
if not poly1.intersects(poly2): #如果两四边形不相交
  iou = 0
else:
  try:
    inter_area = poly1.intersection(poly2).area  #相交面积
    print(inter_area)
    #union_area = poly1.area + poly2.area - inter_area
    union_area = MultiPoint(union_poly).convex_hull.area
    print(union_area)
    if union_area == 0:
      iou= 0
    #iou = float(inter_area) / (union_area-inter_area) #错了
    iou=float(inter_area) / union_area
    # iou=float(inter_area) /(poly1.area+poly2.area-inter_area)
    # 源码中给出了两种IOU计算方式,第一种计算的是: 交集部分/包含两个四边形最小多边形的面积 
    # 第二种: 交集 / 并集(常见矩形框IOU计算方式) 
  except shapely.geos.TopologicalError:
    print('shapely.geos.TopologicalError occured, iou set to 0')
    iou = 0
 
print(a)
 
print(iou)

具体原理还没弄明白,还在研究中,研究完再给出来(当然数学渣渣能不能研究出来有待商榷*—*)

补充知识:python 二维坐标多边形 计算多边形中心点,以及距该中心点最远的距离

我就废话不多说了,还是直接看代码吧!

def center_geolocation(geolocations):
	'''
	输入多个经纬度坐标(格式:[[lon1, lat1],[lon2, lat2],....[lonn, latn]]),找出中心点
	:param geolocations:
	:return:中心点坐标 [lon,lat]
	'''
	#求平均数 同时角度弧度转化 得到中心点
	x = 0	# lon
	y = 0	# lat
	z = 0
	lenth = len(geolocations)
	for lon, lat in geolocations:
		lon = radians(float(lon))
		# radians(float(lon))  Convert angle x from degrees to radians
		# 	          把角度 x 从度数转化为 弧度
		lat = radians(float(lat))
		x += cos(lat) * cos(lon)
		y += cos(lat) * sin(lon)
		z += sin(lat)
		x = float(x / lenth)
		y = float(y / lenth)
		z = float(z / lenth)
	return (degrees(atan2(y, x)), degrees(atan2(z, sqrt(x * x + y * y))))
 
#得到离中心点里程最近的里程
 
def geodistance(lon1,lat1,lon2,lat2):
	'''
	得到两个经纬度坐标距离 单位为千米 (计算不分前后顺序)
	:param lon1: 第一个坐标 维度
	:param lat1: 第一个坐标 经度
	:param lon2: 第二个坐标 维度
	:param lat2: 第二个坐标 经度
	:return: distance 单位千米
	'''
	# lon1,lat1,lon2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)
	lon1, lat1, lon2, lat2 = map(radians, [float(lon1), float(lat1), float(lon2), float(lat2)]) #经纬度转换成弧度
	dlon=lon2-lon1
	dlat=lat2-lat1
	a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
	distance=2*asin(sqrt(a))*6371*1000 #地球平均半径,6371km
	distance=round(distance/1000,3)
	print(distance)
	return distance
 
def getMaxestDistance(geolocations,centre):
	'''
	中心点 距离 多个经纬度左边 最远的距离
	:param geolocations: 多个经纬度坐标(格式:[[lon1, lat1],[lon2, lat2],....[lonn, latn]])
	:param centre: 中心点  centre [lon,lat]
	:return: 最远距离 千米
	'''
	distantces=[]
	for lon, lat in geolocations:
		d=geodistance(lat,lon,centre[1],centre[0])
		distantces.append(d)
	# print(distantces)
	return max(distantces)
 
def getOnePolyygen(geolocations):
	'''
	输入多个经纬度坐标(格式:[[lon1, lat1],[lon2, lat2],....[lonn, latn]]),找出距该多边形中心点最远的距离
	:param geolocations:多个经纬度坐标(格式:[[lon1, lat1],[lon2, lat2],....[lonn, latn]])
	:return:center,neartDistance 多边形中心点 最远距离
	'''
	center=center_geolocation(geolocations) # 得到中心点
	neartDistance=getMaxestDistance(geolocations,center)
	# print(center,"-----------------",neartDistance)
	return center,neartDistance

以上这篇python shapely.geometry.polygon任意两个四边形的IOU计算实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 探针的实现原理
Apr 23 Python
Python聊天室程序(基础版)
Apr 01 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
python3爬虫怎样构建请求header
Dec 23 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
python实现人像动漫化的示例代码
May 17 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
Python绘制散乱的点构成的图的方法
Apr 21 Python
Python求凸包及多边形面积教程
Apr 12 #Python
python实现人脸签到系统
Apr 13 #Python
python实现IOU计算案例
Apr 12 #Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 #Python
python 已知三条边求三角形的角度案例
Apr 12 #Python
python实现输入三角形边长自动作图求面积案例
Apr 12 #Python
Python3如何判断三角形的类型
Apr 12 #Python
You might like
php实现按照权重随机排序数据的方法
2015/01/09 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
php 中的closure用法详解
2017/06/12 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
jQuery实现日历效果
2020/09/11 jQuery
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
Python多线程实例教程
2014/09/06 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
项目专员岗位职责
2013/12/04 职场文书
庆七一活动方案
2014/01/25 职场文书
总经理司机职责
2014/02/02 职场文书
同事打架检讨书
2014/02/04 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
学校志愿者活动总结
2014/06/27 职场文书
就业导师推荐信范文
2015/03/27 职场文书
担保书格式范文
2015/09/22 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
django中websocket的具体使用
2022/01/22 Python
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL