⽬标检测基本概念理解之IoU(交并⽐)以及Python代码实现
⽬标检测基本概念理解之IoU(交并⽐)
交并⽐理解
在检测任务中,使⽤交并⽐(InterctionofUnion,IoU)作为衡量指标。这⼀概念来源于数学中的集合,⽤来描述两个集合A和B之间
的关系,它等于两个集合的交集⾥⾯所包含的元素个数,除以它们的并集⾥⾯所包含的元素个数,具体计算公式如下:
我们将⽤这个概念来描述两个框之间的重合度。两个框可以看成是两个像素的集合,它们的交并⽐等于两个框重合部分的⾯积除以它们合并
起来的⾯积。下图“交集”中青⾊区域是两个框的重合⾯积,图“并集”中蓝⾊区域是两个框的相并⾯积。⽤这两个⾯积相除即可得到它们
之间的交并⽐,如图所⽰。
假设两个矩形框A和B的位置分别为:
假如位置关系如图所⽰:
如果⼆者有相交部分,则相交部分左上⾓坐标为:
相交部分右下⾓坐标为:
计算先交部分⾯积:
矩形框A和B的⾯积分别是:
计算相并部分⾯积:
IoU=
A∪B
A∩B
A:[x,y,x,y]a1a1a2a2
A:[x,y,x,y]b1b1b2b2
x=1max(x,x),y1=a1b1max(y,y)a1b1
x=2min(x,x),y2=a2b2min(y,y)a2b2
intertion=max(x−2x+11.0)∗(y−2y+11.0)
S=A(x−a2x+a11.0)∗(y−a2y+a11.0)
S=B(x−b2x+b11.0)∗(y−b2y+b11.0)
union=S+AS−Bintertion
计算交并⽐:
为了直观的展⽰交并⽐的⼤⼩跟重合程度之间的关系,⽰意了不同交并⽐下两个框之间的相对位置关系,从IoU=0.95到IoU=0.
Python代码实现
计算IoU,矩形框的坐标形式为xyxy
#计算IoU,矩形框的坐标形式为xyxy
#(x1,y1)是矩形框左上⾓的坐标,(x2,y2)是矩形框右下⾓的坐标
defbox_iou_xyxy(box1,box2):
#获取box1左上⾓和右下⾓的坐标
x1min,y1min,x1max,y1max=box1[0],box1[1],box1[2],box1[3]
#计算box1的⾯积
s1=(y1max-y1min+1.)*(x1max-x1min+1.)
#获取box2左上⾓和右下⾓的坐标
x2min,y2min,x2max,y2max=box2[0],box2[1],box2[2],box2[3]
#计算box2的⾯积
s2=(y2max-y2min+1.)*(x2max-x2min+1.)
#计算相交矩形框的坐标
xmin=m(x1min,x2min)#左上⾓的横坐标
ymin=m(y1min,y2min)#左上⾓的纵坐标
xmax=m(x1max,x2max)#右下⾓的横坐标
ymax=m(y1max,y2max)#右下⾓的纵坐标
#计算相交矩形的⾼度、宽度、⾯积
inter_h=m(ymax-ymin+1.,0.)
inter_w=m(xmax-xmin+1.,0.)
interction=inter_h*inter_w
#计算相并⾯积
union=s1+s2-interction
#计算交并⽐
iou=interction/union
returniou
bbox1=[100.,100.,200.,200.]
bbox2=[120.,120.,220.,220.]
iou=box_iou_xyxy(bbox1,bbox2)
print('IoUis{}'.format(iou))
IoUis0.47407
计算IoU,矩形框的坐标形式为xywh
IoU=
union
intertion
#计算IoU,矩形框的坐标形式为xywh
#(x,y)(x,y)(x,y)是矩形框中⼼点的坐标,www是矩形框的宽度,hhh是矩形框的⾼度。
defbox_iou_xywh(box1,box2):
#获取box1左上⾓的坐标
x1min,y1min=box1[0]-box1[2]/2.0,box1[1]-box1[3]/2.0
#获取box1右下⾓的坐标
x1max,y1max=box1[0]+box1[2]/2.0,box1[1]+box1[3]/2.0
#获取box1的⾯积
s1=box1[2]*box1[3]
#获取box2左上⾓的坐标
x2min,y2min=box2[0]-box2[2]/2.0,box2[0]-box2[2]/2.0
#获取box2右下⾓的坐标
x2max,y2max=box2[0]+box2[2]/2.0,box2[0]+box2[2]/2.0
#获取box2的⾯积
s2=box2[2]*box2[3]
#计算相交矩形框的坐标
xmin=m(x1min,x2min)#左上⾓的横坐标
ymin=m(y1min,y2min)#左上⾓的纵坐标
xmax=m(x1max,x2max)#右下⾓的横坐标
ymax=m(y1max,y2max)#右下⾓的纵坐标
inter_h=m(ymax-ymin,0.)
inter_w=m(xmax-xmin,0.)
interction=inter_h*inter_w
union=s1+s2-interction
iou=interction/union
returniou
bbox1=[100.,100.,200.,200.]
bbox2=[120.,120.,220.,220.]
iou=box_iou_xywh(bbox1,bbox2)
print('IoUis{}'.format(iou))
IoUis0.6931
本文发布于:2022-12-31 11:59:27,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/65323.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |