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获取远程图片大小和尺寸的方法
Mar 26 Python
Python实现命令行通讯录实例教程
Aug 18 Python
Python入门_学会创建并调用函数的方法
May 16 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
python调用staf自动化框架的方法
Dec 26 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
python实现两个字典合并,两个list合并
Dec 02 Python
python 爬取疫情数据的源码
Feb 09 Python
Python3列表List入门知识附实例
Feb 09 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php 冒泡排序 交换排序法
2011/05/10 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
指导老师鉴定意见
2015/06/05 职场文书
网络妈妈观后感
2015/06/08 职场文书
2015中学教学工作总结
2015/07/22 职场文书
TV动画《间谍过家家》公开PV
2022/03/20 日漫