我想实现一个语义分割网络并使用PASCAL VOC 12进行训练。基本事实被编码为颜色而不是标签,我正在寻找将其转换为标签的方法。另外,我已阅读以下链接:
Tensorflow: How to create a Pascal VOC style image
还有其他更多用户友好代码或算法来解决我的问题吗?
答案 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() 为您完成。