Image U网keras中的多尺度分割掩模输出

Image U网keras中的多尺度分割掩模输出,image,tensorflow,keras,unity3d-unet,Image,Tensorflow,Keras,Unity3d Unet,这就是模型,输入为单个图像,输出为图像的不同比例,即i、1/2 i、1/4 i和1/8 i,模型(输入=[inputs],输出=[out6、out7、out8、out9]) 我不知道如何创建火车数据集。假设y_序列的输入是形状(50,192,256,3)的数据,其中3=图像的通道,192是宽度,256是高度,共有50个,但是如何创建一个包含4个组件的y_序列?我尝试过使用zip,然后将其转换为numpy,但这不起作用…如果您一定希望模型学习生成多尺度遮罩,那么您可以尝试使用UNET向下采样以生成

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


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

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

如果要为您的
模型创建
[遮罩、遮罩半、遮罩四分之一、遮罩八]
。fit
,这是遮罩图像的原始+重新缩放版本列表,您可能需要尝试快速降采样方法(取决于数据集的大小)

在这里,我使用了
skimage.transform.pyramid\u reduce
将一个掩码的采样率降低到其比例的一半、四分之一和八分之一。该方法使用插值(样条曲线),但可以通过参数进行控制。查看更多详细信息

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)

在单个图像/遮罩上进行测试-

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轴上的比例变化----------------->

谢谢您的努力,但您误解了我的问题。我想创造多尺度的y_火车。假设我们有一个图像,它是大小为192x256x1(即灰度)的分割遮罩,现在我想将一些对象传递到模型的输出遮罩,该模型将具有图像的所有4个比例。我不确定该怎么做,也就是说,如何在多尺度下将遮罩材料传递到模型中。假设我想向模型传递一个单尺度遮罩,那么它将是一个大小为40x192x256x1的张量对象,其中40是我为y_train创建的图像数,但我不知道如何创建一组多尺度的y_列车,并同时通过它们。这会像将4个单独的numpy数组列表传递给模型一样,还是类似于numpy数组的zip对象……您的分段掩码是否具有原始大小?如果是,则它是一个图像,您可以通过一个金字塔来创建其他3个输出,供您的模型进行训练。。正如我上面所建议的。是的,我有原始大小的分割蒙版,只想通过U-NetYes对分割蒙版进行增量重建。是的,我的朋友,请检查答案中生成图像_一半、图像_四分之一和图像_八分之一的部分
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)