想要利用IoU来评价实例分割后的结果
查看maskrcn源码,发现了一个叫compute_iou的函数,却不知道要怎么调用(参数之类的)
请问如何遍历每一个预测掩码的IoU值
需要具体一点。谢谢!
比如能够参考的URL。
你贴的截图里面算法就是计算IoU的,box是你要计算和boxes(其他矩形框)的Iou,其中x1,x2,y1,y2就是在计算box和boxes多个矩形之间的交集,。用一个矩形举例来说,比如A(下图红色)和B(下图蓝色),y1=max(A.y1,B.y1)就是求交集C(黄色)的y1值,其他y2=min(A.y2,B.y2)就是求C的y2值,其他两个x位置同理,看懂这个就知道x1,x2,y1,y2是在干什么了,。只不过 boxes[:, 0]中有个冒号,你可以看做事遍历boxes中的每一个矩形都和box求一次交集,如果有交集的话,下面的计算
intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)
的值就是大于0,如果没有交集这个值就是0(没有交集的话,上面计算出来的 x2<x1||y2<y1,所以maxinum的结果是0),也就是说intersection 就是交集的面积。而union就不说了,计算A 和B区域的面积,下面的IoU计算公式,最底下的图片就是最形象的计算IoU的
模型训练不会返回一个result吗,for遍历不就行了吗,不过我没用过mask_rcnn,级联rcnn用过一次
我觉得不管什么模型,iou计算都是一样的,都是交集比并集,你只要找到你的预测框和真实框就行了,其余套公式
compute_iou函数:用给定框的数组计算给定框的 IoU
box:一维向量 [y1, x1, y2, x2]
boxes:盒子[盒子数量:boxes_count,(y1,x1,y2,x2)]
box_area:浮动数值类型 (“盒子”的面积)
boxes_area:数组[boxes_count]。
可以参考:https://blog.csdn.net/u010598525/article/details/108667524
看一下yolo5源码就知道了,简单来说就是交并比
我以为只有box能计算iou值,但我看了maskrcnn后,发现该模型对mask进行了iou的计算,该方法巧妙之处在于
mask1与mask2必须有相同的height and width,而后在同一个位置的值累加,即交叉面积,而后将mask1与mask2
所有值累加为并集,而后计算类似于box的iou计算了。
然而,我为了简化,将变量a看作mask,并将mask1与mask2均等于a,以下是详细代码:
import numpy as np
a=np.array([[1,0,1,0,1,1],[1,0,1,0,1,0]])
print(a > .5)
masks = np.reshape(a > .5, (-1, 1)).astype(np.float32) # flatten two dimension,but line only one
print('masks=',masks)
area1 = np.sum(masks, axis=0) # 计算mask_面积
print('mask_area1=',area1)
mask_intersections = np.dot(masks.T, masks)
print('mask_intersections=',mask_intersections)
union = area1[:, None]+area1[None,:]-mask_intersections
print(union)
iou_mask=union/mask_intersections
print('iou_mask=',iou_mask)