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数组的处理代码
Jan 04 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
python实现网站的模拟登录
Jan 04 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
pow在python中的含义及用法
Jul 11 Python
python自动识别文本编码格式代码
Dec 26 Python
Python sqlite3查询操作过程解析
Feb 20 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 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
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
详解node和ES6的模块导出与导入
2020/02/19 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
Python素数检测实例分析
2015/06/15 Python
Python操作MongoDB详解及实例
2017/05/18 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
python树的同构学习笔记
2019/09/14 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
产品促销活动策划书
2014/01/15 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Golang 并发编程 SingleFlight模式
2022/04/26 Golang