如何在TF / Keras中实现滑动窗口模型以进行图像分割?

问题描述 投票:2回答:1

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

现在,我想尝试一种滑动窗口方法,例如从原始图像中提取64x64色块(无需重新缩放),并以此训练模型。我不确定如何有效地执行此操作。

在训练阶段,我已经有了一个在线随机扩增对象(keras序列)。我应该在其中添加补丁程序提取过程吗?如果这样做,我将对numpy数组进行切片并产生它们,这听起来不是很有效。有更好的方法吗?

在预测阶段,我还是应该从numpy中的图像中提取补丁,并将其提供给模型?如果我选择重叠的窗口(例如,补丁的暗度为64x64,步幅为32x32),是否应该手动(以numpy的方式)对模型的原始补丁预测进行权重/平均/合并,以输出全面的分割?还是有更好的方法来处理此问题?

我正在使用TF 2.1 btw。任何帮助表示赞赏。

python tensorflow keras image-segmentation sliding-window
1个回答
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]])
© www.soinside.com 2019 - 2024. All rights reserved.