在YOLO系列的目标检测模型的后处理,有一个生成meshgrid网格的操作,这时是调用torch.meshgrid函数实现的,不过在numpy里也有meshgrid函数。然而它们之间其实是有差异的,下面做一个实验,代码如下:
import numpy as np
import torch
def make_anchors_torch(h,w):
x = torch.arange(w) # shift x
y = torch.arange(h) # shift y
sy, sx = torch.meshgrid(y, x)
return torch.stack((sx, sy), -1).view(-1, 2)
def make_anchors_numpy(h,w):
x = np.arange(0, w) # shift x
y = np.arange(0, h) # shift y
sy, sx = np.meshgrid(y, x)
# sx, sy = np.meshgrid(x, y)
return np.stack((sx, sy), axis=-1).reshape(-1, 2)
if __name__=='__main__':
h, w = 80, 80
anchors_torch = make_anchors_torch(h,w)
anchors_numpy = make_anchors_numpy(h,w)
mean_diff = np.mean(np.abs(anchors_numpy - anchors_torch.numpy()))
print(mean_diff)
运行这个程序,最后打印的差异值是26.6625
这说明在numpy库里的meshgrid函数,y不是在x前面的。交换一下x,y的顺序,也就是把上面的make_anchors_numpy函数注释的那一行 sx, sy = np.meshgrid(x, y) 打开,重新运行程序,这时候打印的差异值是0
在使用meshgrid函数时要小心这个差异。