点在不规则图形内算法python_目标检测算法中规则矩形和不规则四边形IOU的Python实现...

交并比(Intersection-over-Union,IoU),目标检测中使用的一个概念,我们在进行目标检测算法测试时,重要的指标,是产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率,即它们的交集与并集的比值。最理想情况是完全重叠,即比值为1。

通常,我们所说的目标检测检测的框是规则的矩形框,计算IOU也非常简单,一般两种方法:

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

右下角的最小值减去左上角的最大值就是重叠矩形的宽,同比高。

上述规则四边形(矩形)IOU计算方式一的 Python实现

def calculate_regular_iou(rec1, rec2):

"""

computing IoU

:param rec1: (y0, x0, y1, x1), which reflects

(top,left, bottom,right)

:param rec2: (y0, x0, y1, x1)

:return: scala valueofIoU

"""

S_rec1 = (rec1[2] - rec1[0]) * (rec1[3] - rec1[1])

S_rec2 = (rec2[2] - rec2[0]) * (rec2[3] - rec2[1])

sum_area = S_rec1 + S_rec2

left_line = max(rec1[1], rec2[1])

right_line = min(rec1[3], rec2[3])

top_line = max(rec1[0], rec2[0])

bottom_line = min(rec1[2], rec2[2])

if left_line >= right_line ortop_line >= bottom_line:

return0

else:

intersect= (right_line - left_line) * (bottom_line - top_line)

return(intersect/ (sum_area -intersect)) * 1.0

if __name__ == '__main__':

# (top,left, bottom,right)

rect1 = [551, 26, 657, 45]

rect2 = [552, 27, 672, 46]

iou = calculate_regular_iou(rect1, rect2)

上述规则四边形(矩形)IOU计算方式二的 Python 实现

def compute_regular_iou_other(rec1, rec2):

"""

computing IoU

:param rec1: (y0, x0, y1, x1), which reflects

(top,left, bottom,right)

:param rec2: (y0, x0, y1, x1)

:return: scala valueofIoU

"""

areas1 = (rec1[3] - rec1[1]) * (rec1[2] - rec1[0])

areas2 = (rec2[3] - rec2[1]) * (rec2[2] - rec2[0])

left=max(rec1[1],rec2[1])

right=min(rec1[3],rec2[3])

top=max(rec1[0], rec2[0])

bottom = min(rec1[2], rec2[2])

w = max(0,right-left)

h = max(0, bottom -top)

returnw*h / (areas2 + areas1 - w*h)

if __name__ == '__main__':

# (top,left, bottom,right)

rect1 = [551, 26, 657, 45]

rect2 = [552, 27, 672, 46]

iou = compute_regular_iou_other(rect1, rect2)

但是,对于不规则四边形就不能通过上述这两种方式来计算,这里可以使用Python的 Shapely 库实现,Python 实现如下:

import numpyasnp

import shapely

fromshapely.errors import TopologicalError

fromshapely.geometry import Polygon,MultiPoint

def to_polygon(quadrilateral):

"""

:param quadrilateral: 四边形四个点坐标的一维数组表示,[x,y,x,y....]

:return: 四边形二维数组, Polygon四边形对象

"""

# 四边形二维数组表示

quadrilateral_array = np.array(quadrilateral).reshape(4, 2)

# Polygon四边形对象,会自动计算四个点,最后四个点顺序为:左上 左下  右下 右上 左上

quadrilateral_polygon = Polygon(quadrilateral_array).convex_hull

returnquadrilateral_array, quadrilateral_polygon

def calculate_iou(actual_quadrilateral, predict_quadrilateral):

"""

:param actual_quadrilateral: 预测四边形四个点坐标的一维数组表示,[x,y,x,y....]

:param predict_quadrilateral: 期望四边形四个点坐标的一维数组表示,[x,y,x,y....]

:return:

"""

# 预测四边形二维数组, 预测四边形 Polygon 对象

actual_quadrilateral_array, actual_quadrilateral_polygon = to_polygon(actual_quadrilateral)

# 期望四边形二维数组, 期望四边形 Polygon 对象

predict_quadrilateral_array, predict_quadrilateral_polygon = to_polygon(predict_quadrilateral)

# 合并两个box坐标,变为8*2 便于后面计算并集面积

union_poly = np.concatenate((actual_quadrilateral_array, predict_quadrilateral_array))

# 两两四边形是否存在交集

inter_status = actual_quadrilateral_polygon.intersects(predict_quadrilateral_polygon)

# 如果两四边形相交,则进iou计算

if inter_status:

try:

# 交集面积

inter_area = actual_quadrilateral_polygon.intersection(predict_quadrilateral_polygon).area

# 并集面积 计算方式一

#union_area = poly1.area + poly2.area - inter_area

# 并集面积 计算方式二

union_area = MultiPoint(union_poly).convex_hull.area

# 若并集面积等于0,则iou = 0

if union_area == 0:

iou = 0

else:

# 第一种计算的是: 交集部分/包含两个四边形最小多边形的面积

iou = float(inter_area) / union_area

#  第二种: 交集 / 并集(常见矩形框IOU计算方式)

# iou=float(inter_area) /(poly1.area+poly2.area-inter_area)

exceptshapely.errors.TopologicalError :

print('shapely.errors.TopologicalError occured, iou set to 0')

iou = 0

else:

iou = 0

returniou

if __name__ == '__main__':

actual_quadrilateral = [908, 215, 934, 312, 752, 355, 728, 252]

predict_quadrilateral =  [923, 308, 758, 342, 741, 262, 907, 228]

iou = calculate_iou(actual_quadrilateral, predict_quadrilateral)

print(iou)

避坑指南

运行代码抛出 WinError 126 错误

在使用Python中的使用 import shapely 时不会报错,但是在使用 from shapely.geometry import Polygon,MultiPoint 会报错,报错的详细信息如下图:

报错的主要原因就出现在 geos_c.dll 这里,看了网上很多文章大部分说是由于 geos_c.dll 文件缺失导致报错。尝试在网上找了几个 geos_c.dll 文件放到 C:\Windows\System32 下仍然没有解决问题。

最终解决方案:通过 pip uninstall Shapely 卸载原来安装的 Shapely 然后 在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,如上图,这里下载对应版本的whl文件安装,安装这个whl 就可以解决该问题。

whl文件下载404错误

在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely 下载制定版本的whl时,出现404错误。如下。

此时改用 chrome 浏览器重新尝试下载,即可解决。

【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派跑php,在树莓派4上部署nginx+php

本试验是基于树莓派的 buster 版本。一、安装 nginxapt install nginx -y完成安装之后,可以使用 dpkg -l | grep nginx 找到相关的安装包:通过分析 /var/lib/dpkg/status 可以得到 nginx 安装包的依赖关系:nginx --> nginx-full --> li…

只有python可以爬虫吗_无所不能的Python之爬虫那点事儿

今天给大家介绍一个有趣的新技术——爬虫。首先来讲一下啥是爬虫。爬虫也叫网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。通俗的来讲,爬虫就是一段程序,它来根据你的设定自己去互联网上浏览网页并把这些信…

java排队系统模型,MMC排队系统模型

MMC排队系统模型及应用M/M/C排队模型及其应用摘要:将随机服务系统中M/M/C排队模型应用到理发服务行业中。通过对某理发店进行调查,以10min为一个调查单位调查顾客到达数,统计了72个调查单位的数据,又随机调查了113名顾客服务时间&…

php 如何生成微信小程序,微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载...

源码名称:微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载购买须知:(请仔细阅读了解)【1】源码一律经测试无误。【2】不提供任何修改和编辑服务,不包安装调试,假如你什么都不懂的请不要拍。【3】假…

python excel格式刷_Excel格式刷怎么用?没你想的那么简单,你知道几种用法?

【温馨提示】亲爱的朋友,阅读之前请您点击【关注】,您的支持将是我最大的动力!Excel使用过程中,格式刷相信小伙伴们都知道,平常也没少用。Excel中格式刷可以帮助我们快速的复制单元格的格式,而不用再重新设…

php接受post接受不到数据,PHP $_POST接受不到数据,但$_GET可以接受数据

"HTML ajax端 $.ajax({ url:/login.php, data:{name:name, pwd:pwd}, type:POST, dataType:json, success:function(data){ console.dir(data) if(data.status 1) alert(data.mes) }else{ alert(data.mes) } } })php端:$sql "SELECT * FROM user WHERE …

python安装多个版本_Mac安装多个python版本

Mac安装多个python版本步骤如下:1、安装pyenv$sudo brew install pyenv然后在 .bash_profile 文件中添加命令:vi .bash_profile添加:eval "$(pyenv init -)"最后,更新一下环境变量命令:source .bash_profile…

java .item,javabb-javaitem-cloud

JavaItem-Cloud项目介绍JavaItem-Cloud是一个新开发的微服务架构平台,基于最新流行的技术SpringBoot、SpringCloud & SpringCloud Alibaba、Vue、Vuex、ElementUI。系统特性后端使用当前流行技术,SpringBoot、SpringCloud、SpringCloud Alibaba、Myb…

软件使用手册模板_我的印象笔记使用手册(精简说明)

在之前的一文中,我已经详细写过我的印象笔记使用的方法了,这次呢,再做一个更新的使用情况和更清楚明了和精简的说明。不居竹:我的印象笔记使用手册​zhuanlan.zhihu.com文章目录:1、知识管理收集知识整理知识输出知识2…

java 响应事件,用java响应颜色事件

我正在构建一个java应用程序来解决难题 . 我编码的方式基本上是程序将采取屏幕截图,在屏幕截图中找到一个像素,并通过机器人功能将鼠标移动到桌面上的那个位置 . 我理解屏幕截图背后的理论,将其存储在一个数组中,探索数组直到一个…

怎样保存python源程序_五分钟教会你如何编写、保存与运行 Python 程序

第一步接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序。Python教程本章将会教你如何编写、保存与运行 Python 程序。通过 Python 来运行的你的程序有两种方法——使用交互式解释器提示符或直接运行一个源代码文件。我们将了解如何使用他们二者的功能。使用…

matlab实验8数据分析与多项式计算,hashidamatlab实验八数据处理与多项式计算.doc

实验八电子二班张秀云 一、实验目的〔据处理与多项式计算1、掌握数据统计和分析的方法2、掌握数值插值与曲线拟合的方法及其应用3、掌握多项式的常用运算二、实验内容1、利用MATLAB提供的rand函数生成30000个符合均匀分布的随机 数,然后检验随机数的性质&#xff1a…

微信群定时发消息 python_Python实现每天定时发微信问候语

IT学习乐园甄选优质技术文档,服务群众!作者:varlemon来源:https://www.cnblogs.com/connect/p/python-wechat-iciba.html图源:网络编辑:IT技术头条免责声明:1.本公众号所转载文章均来自公开网络…

php页面添加链接,怎么给一个PHP密码访问页面加超链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$password "1234"; // 这里是密码$p "";if(isset($_COOKIE["isview"]) and $_COOKIE["isview"] $password){$isview true;}else{if(isset($_POST["pwd"])){if($_POST["…

python 硬件模拟_如何编写一个硬件模拟器?

当下是短视频的时代,随着5g进程的加速推动,短视频已经成为了很多自媒体人变现的主要途径B站,抖音,快手,西瓜视频等等各大平台都砸钱鼓励平台创作者创作视频,因为平台流量大,我们就可以通过一些技…

通信之道从微积分到5gpdf_保送清华成博士,华为12年搞通信,他为何如此看待 5G ?| 人物志...

作者 | 伍杏玲 胡巍巍出品 | CSDN(ID:CSDNnews)一位通信专家,清华读了博士,北大从事博士后研究工作,但却只有12年工作经历?明明家里几套房,却热爱骑车出行?他是?他是国内小有名气的通…

manifest php,Laravel PackageManifest.php: Undefined index: name

问题Im just trying to deploy my application and I just ran composer update on my server and I got the following error:In PackageManifest.php line 122:Undefined index: nameHow can I fix this issue?回答1:i had the same problem.In my case downgrading the com…

python使用spark-sql读取数据并可视化_使用Spark SQL读取HBase上的数据

近日,由华为团队开发的1、基于部分评估技术,该项目具有强大的数据剪枝和智能扫描特点;2、支持自定义过滤规则、协处理器等以便支持超低延迟的处理;3、支持SQL、DataFrame;4、支持更多的SQL(比如二级索引、布隆过滤、主…

mysql封装 javabean,利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删改查、JavaBean反射原理,附源码)...

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查。其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口:1、public Connection getConnection() 获得数据库的…

react实现异步插件_React-loadable实现组件进行异步加载

React 项目打包时,如果不进行异步组件的处理,那么所有页面所需要的 js 都在同一文件中(bundle.js),整个js文件很大,从而导致首屏加载时间过长.所有,可以对组件进行异步加载处理,可以使用 React-loadable实现…