【问题标题】:How to create the labeled images in PASCAL VOC 12 as the ground truth?如何在 PASCAL VOC 12 中创建标记图像作为基本事实?
【发布时间】:2018-02-27 14:07:45
【问题描述】:

我想实现一个语义分割网络并使用 PASCAL VOC 12 对其进行训练。ground truth 被编码为颜色而不是标签,我正在寻找将其转换为标签的方法。另外,我已阅读以下链接:

Tensorflow: How to create a Pascal VOC style image

还有其他的用户朋友代码或算法可以解决我的问题吗?

【问题讨论】:

    标签: neural-network deep-learning keras image-segmentation


    【解决方案1】:

    您可以结帐this post。它只是在颜色图和索引之间创建一个映射器。它从背景(第一行)开始,遍历所有 20 个类(其他行)。

    encode_segmap() 帮你搞定。

    【讨论】:

      【解决方案2】:

      我刚刚在使用 PASCAL VOC 数据集时遇到了同样的问题。然后我在 Deeplab 的 TensorFlow 代码中检查了函数deeplab/datasets/remove_gt_colormap.py 用于加载和转换分割标签。

      from PIL import Image
      import tensorflow as tf
      import cv2
      
      def _remove_colormap_deeplab(filename):
        """Removes the color map from the annotation.
      
        Args:
          filename: Ground truth annotation filename.
      
        Returns:
          Annotation without the color map.
        """
        return np.array(Image.open(filename))
      
      def _save_annotation_deeplab(annotation, filename):
        """Saves the annotation as png file.
      
        Args:
          annotation: Segmentation annotation.
          filename: Output filename.
        """
        pil_image = Image.fromarray(annotation.astype(dtype=np.uint8))
        with tf.gfile.Open(filename, mode='w') as f:
            pil_image.save(f, 'PNG')
      
      

      据我了解(但不是 100% 确定),np.array(Image.open(filename)) 将根据加载的 Pillow Image 对象的 mode 将 Pillow Image 对象转换为 numpy 数组。这里我检查了加载的 Pascal VOC 标签/类图像,例如datasets/pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClass/2011_003078.png,具有模式 P: palette(意思是 8 位像素,使用调色板映射到任何其他模式) .因此,由于'P' mode,将此PIL Image 对象转换为numpy 数组,会将每个像素值映射到一个索引(即,对应于PASCAL VOC 中定义的class or label)到256 个RGB 值的调色板数组中。

      您也可以查看我的jupyter note了解详情。

      【讨论】:

        【解决方案3】:

        它是@Harsh 和@ccj5351 的组合。 VOC2012 标签嵌入到图像中,这意味着您所要做的就是读入它们并识别像素值。它可以像使用 np.unique(img) 一样简单,它将返回数组中的唯一值。例如,如果它返回 4 个唯一值,则有 4 个类(包括背景)。您还必须先删除颜色图。看看Tensorflow's approach,可能会有帮助。

        【讨论】:

          【解决方案4】:

          在 PASCAL VOC 12 中有 21 个类 - 20 个对象和 1 个背景。这些类被编码为像素值。例如,属于背景的像素具有值0。其余类按字母顺序从1 编码到20。例如,aeroplane 类的像素值等于1。在每个图像中,您可能有多个类。因此,如果您想获取类标签,只需使用 OpenCV 或 PIL 读取相应的 groundtruth 图像,并找到图像中存在的不同像素值。像素值将为您提供图像中存在的对象类。在任何图像中,不会有超过 3 或 4 个不同的类别。但是,同一类可以有多个实例。

          【讨论】:

          • 非常感谢,但仍然没有说明如何通过提供的代码将调色板更改为类的索引。
          • 你好 Harsh,png 图像有 3 个通道,所以在你的情况下飞机像素 (x,y,0) - (x,y,1) - (x,y,2) 都是它们等于 1?但在 Ground Truth 中,每张图像都有非常不同的颜色。你能解释一下吗?提前谢谢
          • 标签图像是单通道 8 位调色图像。在 8 位调色图像中,每个像素值都是 256 个 RGB 值数组的索引。选择 PASCAL VOC 中的调色板,以便相邻值映射到非常不同的颜色,以便在视觉检查期间更容易区分类别。
          • 我认为官方的 Matlab 代码(可以在 PASCAL VOC devkit 中找到)可以帮助我们将 RGB 颜色转换为标签。我还在 here 找到了 Python 版本。我将颜色图可视化功能更改为通过二维数组格式显示颜色图。请检查coderesult
          猜你喜欢
          • 2017-08-15
          • 2018-10-19
          • 1970-01-01
          • 2015-11-19
          • 2017-12-07
          • 2021-02-11
          • 1970-01-01
          • 2020-10-01
          • 2018-09-12
          相关资源
          最近更新 更多