6

我正在试验 FCN(全卷积网络),并试图重现原始论文(Long 等人 CVPR'15)中报告的结果。

在那篇论文中,作者报告了 PASCAL VOC 数据集的结果。下载并解压 2012 年的 train-val 数据集(http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar )后,我注意到其中有 2913 个 png 文件SegmentationClass和SegmentationObject子目录中相同数量的文件。

这些 png 文件中的像素值似乎是 32 的倍数(例如 0、128、192、224...),不在 0 到 20 之间。我只是想知道它们之间的对应关系是什么像素的像素值和地面实况标签。还是我在看错误的文件?

4

3 回答 3

1

原始问题中提到的值看起来像“颜色图”值,可以通过模块中的getpalette()函数获得。PIL Image

对于 VOC 图像的注释值,我使用以下代码片段来检查它们:

import numpy as np
from PIL import Image

files = [ 
        'SegmentationObject/2007_000129.png',
        'SegmentationClass/2007_000129.png',
        'SegmentationClassRaw/2007_000129.png', # processed by _remove_colormap()
                                                # in captainst's answer...
        ]

for f in files:
    img = Image.open(f)
    annotation = np.array(img)
    print('\nfile: {}\nanno: {}\nimg info: {}'.format(
        f, set(annotation.flatten()), img))

代码中使用的三张图片如下所示(分别从左到右):

在此处输入图像描述

代码的对应输出如下:

file: SegmentationObject/2007_000129.png
anno: {0, 1, 2, 3, 4, 5, 6, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F59538B35F8>

file: SegmentationClass/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F5930DD5780>

file: SegmentationClassRaw/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=L size=334x500 at 0x7F5930DD52E8>

我从上面的输出中学到了两件事。

首先, SegmentationObject文件夹中图像的注释值由对象的数量分配。在这种情况下,有 3 个人和 3 辆自行车,注释值是从 1 到 6。但是,对于SegmentationClass文件夹中的图像,它们的值由对象的类值分配。所有的人都属于15级,所有的自行车都是2级

其次,正如mkisantal已经提到的,在np.array()操作之后,调色板被移除(我通过观察结果“知道”它,但我仍然不了解引擎盖下的机制......)。我们可以通过检查输出来确认这一点image mode

  • 两者都有同时SegmentationObject/2007_000129.png_SegmentationClass/2007_000129.pngimage mode=P

  • SegmentationClassRaw/2007_000129.pngimage mode=L。(参考:PIL Image 的模式

于 2020-04-25T12:23:31.497 回答
1

刚刚下载了 Pascal VOC。数据集中的像素值如下:

  • 0:背景

  • [1 .. 20] 区间:分段对象,类 [Aeroplane, ..., Tvmonitor]

  • 255:空类别,用于边界区域(5px)和遮盖困难的物体

您可以在此处找到有关数据集的更多信息。

Captainist 之前的回答讨论了使用调色板保存的 png 文件,我认为这与原始问题无关。链接的 tensorflow 代码只需加载一个使用颜色图(调色板)保存的 png,然后将其转换为 numpy 数组(在此步骤中调色板丢失),然后再次将数组另存为 png。在这个过程中数值不会改变,只是调色板被移除。

于 2019-03-19T17:17:49.403 回答
1

我知道这个问题是前段时间提出的。但是在尝试使用 tensorflow deeplab 的 PASCAL VOC 2012 时,我提出了一个类似的问题。

如果您查看 file_download_and_convert_voc2012.sh,有几行标有“ # Remove the colormap in ground truth annotations ”。这部分处理原始 SegmentationClass 文件并生成原始分割图像文件,其每个像素值介于 0 : 20 之间。(如果您可能会问为什么,请查看这篇文章:Python:使用 PIL 加载 png 文件给出了奇怪的结果

注意这个神奇的功能:

def _remove_colormap(filename):
  """Removes the color map from the annotation.

  Args:
    filename: Ground truth annotation filename.

  Returns:
    Annotation without color map.
  """
  return np.array(Image.open(filename))

我不得不承认我不完全理解操作

np.array(Image.open(filename))

我在下面展示了一组图像供您参考(从上到下:原始图像、分割类和分割原始类)

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2018-08-03T15:15:53.807 回答