关于Unet绘制结果的一些问题

Some questions about the plotted results of a Unet

我正在学习this example about Unet。 是关于二进制分割的,我对代码有一些疑问:

  1. 这样做的意义是什么:

    #preprocess the mask 
    mask[mask >= 2] = 0 
    mask[mask != 0 ] = 1
    

    数据集包含"mask"张由三种颜色组成的图片(实际上它们被称为"trimaps")。作为测试,我尝试在这段代码前后绘制 mask ,似乎这些代码行的作用是将 mask 图片从三色转换为双色(background: purpleforegorund: yellow), 但我不知道如何。

  2. 在“Generators”部分的底部,有一张由三个子图片组成的图片。中间的子图像是 "black and white" 掩码。 将"mask"张图片的颜色从purple/yellow转换为black/white的代码行有哪些?

  3. 最后,我尝试通过代码行 plt.imshow(msk) 绘制 msk,而不是通过 plt.imshow( np.concatenate([img, msk], axis = 1)) 绘制它(如代码中所做的那样)。 但是通过plt.imshow(msk)绘制msk的结果是黑图,为什么?

  1. UNet,至少在其原始形式中,使用二进制掩码。您有包含三个区域、背景、对象和某种边缘的蒙版。该段代码使背景(标签 2)等于 0,对象及其边缘(标签 0 和 1)等于 1。这样你就有了一个二进制掩码用作基本事实。你看到它们是紫色和黄色的,因为 matplotlib 默认颜色映射是 viridis,它恰好在 0 时是紫色,在 1 时是黄色。并不是说这实际上是从那些掩码中丢弃了有用的信息,这些信息可能以某种方式用于训练更好的模型。但这可以稍微简化事情并更好地理解正在发生的事情。

  2. 蒙版预处理代码的最后一步将单色蒙版转换为 rgb。因此,当您使用彩色图像绘制它们时,您的蒙版可以是黑色的 (0, 0, 0) 或白色的 (1, 1, 1)

  3. 不确定,它应该可以工作,可能与 plt.imshow

  4. 中的默认规范化有关