怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序

怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序_第1张图片

作者:陈洪瀚 /洪瀚笔记知乎专栏

摘要:介绍了PSACAL VOC分割标签的索引格式,用图表详细展示索引值和对应的颜色和类别;然后使用python程序分别调用opencv和pillow库如何快速读取索引表,并对索引图像(实际应用中是网络输出的类别标号)着色。(相比其他程序利用列表手工定义调色板的方法,本文通过读取标签图片获取调色,更加便捷。)

一. 准备实验数据

  1. 下载PASCAL VOC 2012数据集(训练和验证集)。Download the training/validation data (2GB tar file) 下载地址http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html

二. 运行环境

Numpy, pillow, pypng, opencv-python 通过pip install 安装

三. 图片格式

PASCAL VOC分割任务中,共有20个类别的对象,其他内容作为背景类。图1 是PASCAL VOC的原图片,图2是针对图1分割的标注,其中红色代表飞机类,黑色是背景,飞机边界部分用米黄色(看着像白色)线条描绘,表示分割模糊区。其中,分割标签都是png格式的图像,该图像其实是单通道的颜色索引图像,即每个像素的值为0~255的整数,对于VOC的标签图像而言,0代表背景,255代表边界,其他1~20为20个类别。具体见图3 所示。该图像除了有一个单通道和图像大小一样的索引图像外,还存储了256个颜色值列表(调色板),每一个索引值对应调色板里一个RGB颜色值,因此,一个单通道的索引图+调色板就能表示彩色图。

程序完成的内容主要包括读取分割标签图像,并获取图像的调色板信息。对于分割后的标签图像用调色板进行着色。这里用一个长条状矩阵索引图像(numpy生成)模拟分割模型得到的图像,32x704(32x22)个像素。即22个32x32个色块拼接而成,每个色块代表一类颜色。20个类+背景+边界。

怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序_第2张图片
图1 原图

怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序_第3张图片
图2 分割标签

怎么拿img标签的data_PASCAL VOC数据集-分割标签索引颜色对照及程序_第4张图片
图3 图像类别-索引值-调色板对应关系

四. 程序

  1. 采用opencv库完成,由于opencv读图像函数没有读调色板信息功能,这里用pypng库来完成。调色板着色采用opencv的cv2.applyColorMap()函数完成。
# With OpenCV
# because opencv can not redad color palette direclty, so, pip install pypng and import
import cv2
import png
import numpy
label_path = r'./VOCdevkit/VOC2012/SegmentationClass/2007_000033.png'
png_data = png.Reader(label_path)
color_palette = png_data.read()[3]['palette']

color_palette = numpy.array(color_palette)
color_palette = numpy.reshape(color_palette,(256,1,3)).astype(numpy.uint8)

output_arr = numpy.zeros((32,22*32),dtype=numpy.uint8)
for i in range(21):
    output_arr[:,i*32:(i+1)*32]=i
output_arr[:,21*32:22*32]=255

output_img=cv2.applyColorMap(output_arr,color_palette)
output_img=cv2.cvtColor(output_img,cv2.COLOR_BGR2RGB)
cv2.imwrite('output_img.png',output_img)

2. 采用pillow库完成,这里用getpalette()库来读取图片的调色板信息。着色采用getpalette()函数完成。

from PIL import Image
import numpy
label_path = r'./VOCdevkit/VOC2012/SegmentationClass/2007_000033.png'
label_img = Image.open(label_path)
color_map = label_img.getpalette()
color_map_arr = numpy.array(color_map)
color_palette = numpy.reshape(color_map_arr,(256,1,3)).astype(numpy.uint8)

output_arr = numpy.zeros((32,22*32),dtype=numpy.uint8)
for i in range(21):
    output_arr[:,i*32:(i+1)*32]=i
output_arr[:,21*32:22*32]=255

output_img = Image.fromarray(output_arr,mode='L')
output_img.putpalette(color_palette)
output_img.save('output_img.png')

c6868c9e9c6f341d5866ad0a62d0810a.png
图4 生成的图像

你可能感兴趣的:(怎么拿img标签的data)