python不使用for计算两组、多个矩形两两间的iou方式
解决问题:不使用for计算两组、多个矩形两两间的iou
使用numpy广播的方法,在python程序中并不建议使用for语句,python中的for语句耗时较多,如果使用numpy广播的思想将会提速不少。
代码:
defcalc_iou(bbox1,bbox2): ifnotisinstance(bbox1,np.ndarray): bbox1=np.array(bbox1) ifnotisinstance(bbox2,np.ndarray): bbox2=np.array(bbox2) xmin1,ymin1,xmax1,ymax1,=np.split(bbox1,4,axis=-1) xmin2,ymin2,xmax2,ymax2,=np.split(bbox2,4,axis=-1) area1=(xmax1-xmin1)*(ymax1-ymin1) area2=(xmax2-xmin2)*(ymax2-ymin2) ymin=np.maximum(ymin1,np.squeeze(ymin2,axis=-1)) xmin=np.maximum(xmin1,np.squeeze(xmin2,axis=-1)) ymax=np.minimum(ymax1,np.squeeze(ymax2,axis=-1)) xmax=np.minimum(xmax1,np.squeeze(xmax2,axis=-1)) h=np.maximum(ymax-ymin,0) w=np.maximum(xmax-xmin,0) intersect=h*w union=area1+np.squeeze(area2,axis=-1)-intersect returnintersect/union
程序中输入为多个矩形[xmin,ymin,xmax,ymax]格式的数组或者list,输出为numpy格式,例:输入的shape为(3,4)、(5,4)则输出为(3,5)各个位置为boxes间相互的iou值。后面会卡一个iou的阈值,然后就可以将满足条件的索引取出。如:
defdelete_bbox(bbox1,bbox2,roi_bbox1,roi_bbox2,class1,class2,idx1,idx2,iou_value): idx=np.where(iou_value>0.4) left_idx=idx[0] right_idx=idx[1] left=roi_bbox1[left_idx] right=roi_bbox2[right_idx] xmin1,ymin1,xmax1,ymax1,=np.split(left,4,axis=-1) xmin2,ymin2,xmax2,ymax2,=np.split(right,4,axis=-1) left_area=(xmax1-xmin1)*(ymax1-ymin1) right_area=(xmax2-xmin2)*(ymax2-ymin2) left_idx=left_idx[np.squeeze(left_arearight_area,axis=-1)] bbox1=np.delete(bbox1,idx1[left_idx],0) class1=np.delete(class1,idx1[left_idx]) bbox2=np.delete(bbox2,idx2[right_idx],0) class2=np.delete(class2,idx2[right_idx]) returnbbox1,bbox2,class1,class2
IOU计算原理:
ymin=np.maximum(ymin1,np.squeeze(ymin2,axis=-1)) xmin=np.maximum(xmin1,np.squeeze(xmin2,axis=-1)) ymax=np.minimum(ymax1,np.squeeze(ymax2,axis=-1)) xmax=np.minimum(xmax1,np.squeeze(xmax2,axis=-1)) h=np.maximum(ymax-ymin,0) w=np.maximum(xmax-xmin,0) intersect=h*w
计算矩形间min的最大值,max的最小值,如果ymax-ymin值大于0则如左图所示,如果小于0则如右图所示
以上这篇python不使用for计算两组、多个矩形两两间的iou方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。