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中的Cookie模块使用
Jul 06 Python
详解Python如何获取列表(List)的中位数
Aug 12 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
tensorflow实现简单的卷积网络
May 24 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
python获取交互式ssh shell的方法
Feb 14 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
wxpython布局的实现方法
Nov 01 Python
Python列表操作方法详解
Feb 09 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
Django视图、传参和forms验证操作
Jul 15 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之uniqid()函数用法
2014/11/03 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
学习vue.js计算属性
2016/12/03 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
python连接oracle数据库实例
2014/10/17 Python
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
python 使用get_argument获取url query参数
2017/04/28 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
如何写出好的Java代码
2014/04/25 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
重阳节慰问信
2015/02/15 职场文书
大学入学感言
2015/08/01 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
python 远程执行命令的详细代码
2022/02/15 Python