我正在使用基于U-net的模型进行语义图像分割。输入图像具有不同的尺寸(每个轴在300-600像素之间)。到目前为止,我的方法是将图像重新缩放为标准暗淡,然后从那里开始工作。
现在,我想尝试一种滑动窗口方法,例如从原始图像中提取64x64色块(无需重新缩放),并以此训练模型。我不确定如何有效地执行此操作。
在训练阶段,我已经有了一个在线随机扩增对象(keras序列)。我应该在其中添加补丁程序提取过程吗?如果这样做,我将对numpy数组进行切片并产生它们,这听起来不是很有效。有更好的方法吗?
在预测阶段,我还是应该从numpy中的图像中提取补丁,并将其提供给模型?如果我选择重叠的窗口(例如,补丁的暗度为64x64,步幅为32x32),是否应该手动(以numpy的方式)对模型的原始补丁预测进行权重/平均/合并,以输出全面的分割?还是有更好的方法来处理此问题?
我正在使用TF 2.1 btw。任何帮助表示赞赏。
尽管听起来像在训练模型之前将图像分割成较小的补丁效率不高,但它有一个巨大的好处。在训练开始之前,优化器会对所有数据样本进行混洗,从而导致偏向较少的模型。但是,如果您将模型一张一张地送入模型,然后优化器将其分成较小的补丁,则仍将在单个图片的补丁上对其进行训练。
为了有效地将图像分成小块,您可以使用:
skimage.util.view_as_windows(arr_in, window_shape, step=1)
您可以定义窗口形状和滚动窗口的步长。例如:
>>> import numpy as np
>>> from skimage.util.shape import view_as_windows
>>> A = np.arange(4*4).reshape(4,4)
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> window_shape = (2, 2)
>>> B = view_as_windows(A, window_shape)
>>> B[0, 0]
array([[0, 1],
[4, 5]])
>>> B[0, 1]
array([[1, 2],
[5, 6]])