如何在TF/Keras中实现用于图像分割的滑动窗口模型



我正在使用基于U-net的模型进行语义图像分割。输入图像具有不同的尺寸(在每个轴中在300-600像素之间(。到目前为止,我的方法是将图像重新缩放到标准的暗度,然后从那里开始工作。

现在我想尝试一种滑动窗口的方法,从原始图像中提取例如64x64补丁(无需重新缩放(,并在此基础上训练模型。我不确定如何有效地实现这一点。

对于训练阶段,我已经有了一个用于随机变换的在线增强对象(keras Sequence(。我应该在那里添加补丁提取过程吗?如果我这样做,我将对numpy数组进行切片并生成它们,这听起来效率不高。有更好的方法吗?

对于预测阶段,我应该再次从numpy中的图像中提取补丁,并将其提供给模型吗?如果我选择重叠的窗口(例如补丁dims 64x64和steps 32x32(,我是否应该手动(以numpy(加权/平均/合并模型中的原始补丁预测,以输出全尺寸分割?或者有更好的方法来处理这个问题吗?

顺便说一句,我正在使用TF 2.1。任何帮助都将不胜感激。

尽管在训练模型之前将图像分割成更小的补丁听起来效率不高,但它有一个巨大的好处。在训练开始之前,优化器会打乱所有数据样本,从而生成一个偏差较小的模型。然而,如果您一个接一个地为模型提供图像,然后优化器将其分解为更小的补丁,那么它仍然是在单个图像的补丁上进行训练的。

为了有效地将图像分割成小块,您可以使用:

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]])

最新更新