我想计算10幅图像:左上角,右上角,左下角,右下角,中心,以及所有图像都是镜像的。图像存储在Numpy数组blob
中,形状为N x Channels x Height x Width
,其中N
是源图像的数量。
切片的左上角存储在tls
中,切片的右下角点存储在brs
中。以下代码提取作物以及每种作物的水平镜像版本:
m = 10 if mirror else 5
crops_shape = ((blob.shape[0] * m,) + blob.shape[1:-2] + crop_dimensions)
crops = np.empty(shape=crops_shape, dtype=blob.dtype)
for i in range(0, blob.shape[0]):
p = i * m
for k, (tl, br) in enumerate(zip(tls, brs)):
crops[p + k] = blob[i, ..., tl[0]:br[0], tl[1]:br[1]]
if mirror:
crops[p + 5:p + 10] = crops[p:p + 5, ..., ::-1]
return crops
对于单个图像,blob
例如可以具有形状(1,3,226,226)。所有作物都具有相同的大小,例如(227x227),因此结果数组crops
在这种情况下将具有形状(10,3,227,227)(当mirror
为真时)
不幸的是,当blob
是float32
数组时,上面的方法太慢(大约1.5ms /图像)。有没有办法让这更快?