U Net 中 keras 的多尺度分割掩码输出

Multi Scale Segmentation mask outputs in keras in U Net

这是模型,输入为单个图像,输出图像的不同比例,即 I、1/2 I、1/4 I 和 1/8 I,Model(inputs=[inputs], outputs=[out6, out7, out8, out9])

我不确定如何创建火车数据集。假设 y_train 的输入是形状为 (50, 192, 256, 3) 的数据,其中 3 = 图像的通道,192 是宽度,256 是高度,共有 50 个,但是如何创建一个包含 4 个组件的 y_train?我试过使用 zip 然后将其转换为 numpy,但这不起作用...

如果您一定希望模型学习生成多尺度掩码,那么您可以尝试使用 UNET 进行下采样以生成用于监督学习的缩放掩码。您可以使用基于插值的方法以最小损失自动调整图像大小。 Here is a post 我将基准与多种此类方法进行比较。

如果您想为 model.fit 创建 [masks, masks_half, masks_quarter, masks_eighth],这是蒙版图像的原始 + 重新缩放版本的列表,您可能想尝试一种快速下采样方法(取决于大小你的数据集)。

在这里,我使用 skimage.transform.pyramid_reduce 将蒙版下采样到其比例的一半、四分之一和八分之一。该方法使用插值(样条),但可以通过参数控制。查看 this 了解更多详情。

from skimage.transform import pyramid_reduce

masks = np.random.random((50, 192, 256, 3))

masks_half = np.stack([pyramid_reduce(i, 2, multichannel=True) for i in masks])
masks_quater = np.stack([pyramid_reduce(i, 4, multichannel=True) for i in masks])
masks_eighth = np.stack([pyramid_reduce(i, 8, multichannel=True) for i in masks])

print('Shape of original',masks.shape)
print('Shape of half scaled',masks_half.shape)
print('Shape of quater scaled',masks_quater.shape)
print('Shape of eighth scaled',masks_eighth.shape)
Shape of original (50, 192, 256, 3)
Shape of half scaled (50, 96, 128, 3)
Shape of quater scaled (50, 48, 64, 3)
Shape of eighth scaled (50, 24, 32, 3)

测试单个 image/mask -

from skimage.data import camera
from skimage.transform import pyramid_reduce

def plotit(img, h, q, e):
    fig, axes = plt.subplots(1,4, figsize=(10,15))
    axes[0].imshow(img)
    axes[1].imshow(h)
    axes[2].imshow(q)
    axes[3].imshow(e)
    axes[0].title.set_text('Original')
    axes[1].title.set_text('Half')
    axes[2].title.set_text('Quarter')
    axes[3].title.set_text('Eighth')

img = camera() #(512,512)
h = pyramid_reduce(img, 2)   #Half
q = pyramid_reduce(img, 4)   #Quarter
e = pyramid_reduce(img, 8)   #Eighth

plotit(img, h, q, e)

注意 x 轴和 y 轴的比例变化 -------------------->