交并比(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

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

  1. 路面裂痕检测YOLO算法、目标检测算法实现地面裂缝检测

    道路裂纹检测YOLO算法,目标检测,目标识别,裂纹检测 路面裂痕检测YOLO算法.目标检测算法实现地面裂缝检测 车头定位 交通标志识别 车道线识别 自己标注数据,训练模型,效果很好4360063193 ...

  2. 基于haar特征的adaboost算法_目标检测算法介绍

    什么是目标检测 目标检测是指从图像中找出目标,包括检测和识别两个过程,现实中由于环境的复杂性以及各类物体的形状.外观以及光照,遮挡等因素的干扰,所以目标检测一直也是计算机视觉最常见的挑战之一. 目标检 ...

  3. 2018目标检测最新算法+经典目标检测算法

    干货 CVPR2018的目标检测总结(论文+开源代码)https://blog.csdn.net/wfei101/article/details/80861681 目标检测算法集合(论文+开源代码)h ...

  4. ap 目标检测算法map_目标检测算法的评估指标:mAP定义及计算方式

    前面依次介绍了: 本节介绍目标检测算法的评估指标:mAP定义及计算方式 mAP:mean Average Precision,平均精度均值,即AP(Average Precision)的平均值,它是目 ...

  5. 目标检测算法 2020_One-stage目标检测算法综述

    yolo-v1: YOLO 就是使用回归这种做法的典型算法. 首先将图片 Resize 到固定尺寸,然后通过一套卷积神经网络,最后接上 FC 直接输出结果,这就他们整个网络的基本结构. 更具体地做法, ...

  6. keras优化算法_目标检测算法 - CenterNet - 代码分析

    代码出处 吃水不忘打井人,分析github上的基于keras的实现: xuannianz/keras-CenterNet​github.com 代码主体结构 模型训练的主函数流程如下所示,该流程也是使 ...

  7. 学习笔记之——基于深度学习的目标检测算法

    国庆假期闲来无事~又正好打算入门基于深度学习的视觉检测领域,就利用这个时间来写一份学习的博文~本博文主要是本人的学习笔记与调研报告(不涉及商业用途),博文的部分来自我团队的几位成员的调研报告(由于隐私 ...

  8. YOLO目标检测算法的深入理解

    YOLO框架概述 YOLO(You only look once)是一种目标检测算法,目标检测算法分为两大任务:目标分类和定位,YOLO创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看 ...

  9. 目标检测算法的大体框架-------backbone、head、neck

        在基于深度学习算法的目标检测算法其实大体上都是由三部分组成的,即backbone.head.neck.整个算法的设计流程基本都是:输入->backbone->neck->he ...

最新文章

  1. 支持取消操作和暂停操作的Backgroundworker
  2. 关于Ubuntu下面的 完全删除卸载说明
  3. python orm框架sqlalchemy_python ORM框架:SqlAlchemy
  4. motionVFX mRevealer Glitch Mac(fcpx插件:30个故障干扰马赛克毛刺失真特效)
  5. 贴吧备份到本地浏览html,获取贴吧对应页html及写入文件
  6. SCCM 2007系列教程之四在工作组环境内实现SCCM客户端
  7. shell替换某个目录下某个文件类型里的内容
  8. 深信服短信认证云信通短信配置说明
  9. NestJS生成二维码
  10. VBA实例6 CorelDraw 批量生成设备位号、连续编号
  11. [橘汁仙剑网出品]仙剑奇侠传六全剧情视频动画配音版[1080P][720P][H264]
  12. PowerDesigner修改设置表格背景色
  13. 常用域名管理后台网址
  14. oracle Parallel模式-Parallel用法(/*+PARALLEL(n)*/)
  15. 微信公众号推送天气教程,自动定时推送【Java版】开发者和小白详细教程
  16. hbase数据库scan操作_HBase最佳实践之Scan
  17. js IP地址正则校验
  18. JavaScript对象及函数
  19. 笨办法学python练习十四
  20. TeX/LaTeX 常用宏包

热门文章

  1. Django 模板系统2
  2. launchMode
  3. 什么时候使用CountDownLatch
  4. Arcgis for javascript不同的状态下自定义鼠标样式
  5. MongoDB 语法陷阱(转自51CTO)
  6. Nginx启动后无法访问页面
  7. python pip gpl_python pip怎么更新包
  8. python画图配色_python matplotlib包图像配色方案分享
  9. 计算机 运行新ie 命令,(新)计算机应用基础IE浏览器设置学习笔记——精品.doc
  10. oracle 批量 重建索引,Oracle重建索引Shell脚本、SQL脚本分享