如何在PASCAL VOC 12中创建标记图像作为基本事实?

时间:2017-09-18 23:11:55

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

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

Tensorflow: How to create a Pascal VOC style image

还有其他更多用户友好代码或算法来解决我的问题吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我刚遇到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))将根据加载的枕头图像对象的mode将枕头图像对象转换为numpy数组。在这里,我检查了已加载的Pascal VOC标签/类图像(例如datasets/pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClass/2011_003078.png)是否具有模式 P:调色板(表示8位像素,已使用颜色映射到任何其他模式)调色板)。因此,由于'P' mode,将该PIL Image对象转换为numpy数组,会将每个像素值映射到一个索引(即,对应于PASCAL VOC中定义的class or label)到256的调色板数组中RGB值。

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

答案 2 :(得分:0)

它是@Harsh和@ ccj5351的组合。 VOC2012标签被嵌入到图像中,这意味着您要做的就是读取它们并识别像素值。就像使用<div> <input type="range" id="slider" name="volume" min="0" max="11" /> <label for="slider">slider</label> </div>这样简单,它将返回数组中的唯一值。例如,如果它返回4个唯一值,则有4个类(包括背景)。您还必须先删除颜色图。看看Tensorflow's approach,可能会有帮助。

答案 3 :(得分:0)

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

encode_segmap() 为您完成。