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中optionParser模块的使用方法实例教程
Aug 29 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
python求最大连续子数组的和
Jul 07 Python
对Python中plt的画图函数详解
Nov 07 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 Python
Python使用永中文档转换服务
May 06 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
YB217、YB235、YB400浅听
2021/03/02 无线电
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
50个比较实用jQuery代码段
2011/09/18 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
Python中zfill()方法的使用教程
2015/05/20 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
Python数据正态性检验实现过程
2020/04/18 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
存储过程和sql语句的优缺点
2014/07/02 面试题
校园十大歌手策划书
2014/02/01 职场文书
师德个人剖析材料
2014/02/02 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
2015年少先队活动总结
2015/03/25 职场文书
房贷收入证明范本
2015/06/12 职场文书
运动会100米广播稿
2015/08/19 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL
windows系统搭建WEB服务器详细教程
2022/08/05 Servers