繁体   English   中英

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

[英]How to implement a sliding window model in TF/Keras for image segmentation?

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

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

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

对于预测阶段,我是否应该从 numpy 中的图像中提取补丁,并将它们提供给模型? 如果我选择重叠窗口(例如补丁变暗 64x64 和步幅 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]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM