【语义分割】——SUN_RGBD数据集解析

地址:http://rgbd.cs.princeton.edu/

简介:
虽然RGB-D传感器已经在一些视觉任务上实现了重大突破,比如3D重建,但我们还没有在高级场景理解上实现类似的性能飞跃。造成这种情况的主要原因之一可能是缺乏一个具有合理大小的基准,其中包括用于培训的3D注释和用于评估的3D度量标准。在本文中,我们提出了一个RGB-D基准套件,目的是为了在所有主要场景理解任务中推进最新的技术水平。我们的数据集由四个不同的传感器捕获,包含10,000张RGB-D图像,其规模与PASCAL VOC类似。整个数据集被密集地注释,包括146,617个2D多边形和58,657个具有精确对象方向的3D边框,以及一个3D房间布局和场景类别。这个数据集使我们能够训练需要大量数据的算法来完成场景理解任务,使用直接和有意义的3D度量来评估它们,避免对小测试集进行过拟合,并研究交叉传感器的偏差。

这里我们主要解析其语义分割的部分

1. 语义标注解析

这里我们主要解析其语义分割的部分。目标是得到原始图像,语义label图像,语义可视化图像,类别label.txt文件。

Code(参考自:prepare_dataset.py):

import os
import os.path as osp
import shutil
from PIL import Image
from scipy.io import loadmat
import matplotlib.pyplot as plt
import numpy as np
import random
from tqdm import tqdm
import h5py
import scipy

imgpath = './SUNRGBD'
SUNRGBDMeta_dir = './SUNRGBDtoolbox/Metadata/SUNRGBDMeta.mat'
SUNRGBD2Dseg_dir = './SUNRGBDtoolbox/Metadata/SUNRGBD2Dseg.mat'
labeltxt   = "./label.txt"
imagepath = './images'
labelpath = './labels'
visualpath = './visual'
for path in [imagepath, labelpath, visualpath]:
    if not osp.exists(path):
        os.makedirs(path)

bin_colormap = np.random.randint(0, 255, (256, 3))      # 可视化的颜色
bin_colormap = bin_colormap.astype(np.uint8)

labels = []
processed = []
# load the data from the matlab file
SUNRGBD2Dseg = h5py.File(SUNRGBD2Dseg_dir, mode='r', libver='latest')
SUNRGBDMeta = scipy.io.loadmat(SUNRGBDMeta_dir, squeeze_me=True,
                                struct_as_record=False)['SUNRGBDMeta']
seglabel = SUNRGBD2Dseg['SUNRGBD2Dseg']['seglabel']

# classlabels
seg37list = SUNRGBD2Dseg['seg37list']
for i in range(seg37list.size):
    classstring = np.array(SUNRGBD2Dseg[seg37list[i][0]]).tostring().decode('utf-8')
    classstring = classstring.replace("\x00", "")
    print(classstring)
    labels.append(classstring)

with open(labeltxt, 'w') as f:
    content = ','.join(labels)
    f.write(content)

for i, meta in tqdm(enumerate(SUNRGBDMeta)):
    meta_dir = '/'.join(meta.rgbpath.split('/')[:-2])
    real_dir = meta_dir.split('/n/fs/sun3d/data/SUNRGBD/')[1]
    rgb_path = os.path.join(real_dir, 'image/' + meta.rgbname)

    # rgbimage
    srcname = osp.join(imgpath, rgb_path)
    t = "sun_{}".format(meta.rgbname)
    dstname = osp.join(imagepath, t)
    shutil.copy(srcname, dstname)
    rgbimg = Image.open(srcname)


    # labelimage
    label = np.array(
        SUNRGBD2Dseg[seglabel[i][0]][:].transpose(1, 0)).\
        astype(np.uint8)
    labelname = osp.join(labelpath, t.replace(".jpg", ".png"))
    labelimg = Image.fromarray(label, 'L')
    labelimg.save(labelname)

    # debug show
    # plt.subplot(1, 2, 1)
    # plt.imshow(rgbimg)
    # plt.subplot(1, 2, 2)
    # plt.imshow(labelimg)
    # plt.show()

    # visualimage
    visualname = osp.join(visualpath, t.replace(".jpg", ".png"))
    visualimg  = Image.fromarray(label, "P")
    palette = bin_colormap          #long palette of 768 items
    visualimg.putpalette(palette) 
    visualimg.save(visualname, format='PNG')

可视化结果:
在这里插入图片描述
labellist
共有37个类别,

wall,floor,cabinet,bed,chair,sofa,table,door,window,bookshelf,picture,counter,blinds,desk,shelves,curtain,dresser,pillow,mirror,floor_mat,clothes,ceiling,books,fridge,tv,paper,towel,shower_curtain,box,whiteboard,person,night_stand,toilet,sink,lamp,bathtub,bag

2. 关键点解析

2.1 h5py数据的解析

要先索引到,然后再从总的数据中读取SUNRGBD2Dseg[]
np.array(SUNRGBD2Dseg[seglabel[i][0]][:].transpose(1, 0))

2.2 PIL灰度图以platte保存成彩图
关键是用:putpalette(palette)指定颜色

bin_colormap = np.random.randint(0, 255, (256, 3))      # 可视化的颜色
bin_colormap = bin_colormap.astype(np.uint8)
visualimg  = Image.fromarray(label, "P")
palette = bin_colormap          #long palette of 768 items
visualimg.putpalette(palette) 
visualimg.save(visualname, format='PNG')

版权声明:本文为CSDN博主「农夫山泉2号」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011622208/article/details/111152218

农夫山泉2号

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

DeepLabV2网络简析

论文名称:Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 论文下载地址&

Yolov5同时进行目标检测和分割分割

基于yolov5(v6.0分支)的多任务检测和分割模型。
之前很早就萌生idea在yolov5基础上添加一个分割头用于语义分割,近期正好也有论文YLOLOP是这么做的.
这里基于yolov5最新分支修改,主要改动