GenerlizedRCNN
[:, None, None] : Shape [3] -> [3, 1, 1]
Numpy中的*运算符表示元素积(element-wise product,对应位置相乘)
- a = np.array([1,2,3])
- b = np.array([2,2,2])
- a * b
- array([ 2., 4., 6.])
两个矩阵a、b,将它们的维度从后往进行比较,如果所有维度满足以下条件之一才能进行广播。
相等
其中有一个为1
boxes1 # shape[N,4]
boxes2 # shape[M,4]
lt = torch.max(boxes1[:, None, :2], boxes2[:, :2]) # left-top [N,M,2]
rb = torch.min(boxes1[:, None, 2:], boxes2[:, 2:]) # right-bottom [N,M,2]
- 这里把第一个boxes1的第二个维度加一个,变成[N,1,4], 这样遇到第二个boxes就会自动广播为[N,M,4]:把每一行进行了复制M可以看出行,这样boxes1的[:,M,4]每一列都是相同的比如[1,2,3]->[[1,2,3],[1,2,3]]
- 再次广播,boxes2遇到boxes1,后面两个维度完全一样了,这样就是boxes2变成了[N,M,4],相当于把boxes2整个进行了N次复制
- 这样boxes1的[:,M,4]其实只是一个box的[xmin,ymin,xmax,ymax]重复M次,本质只有一个坐标
- boxes2的[0,:,:]相当于原始的boxes2,这样就相当于拿boxes1的第一个box坐标(行)和boxes2的所有坐标进行了对比(计算)