批量化处理labelme 语义分割标注的文件

单一化处理

经过labelme标注会生成和图像同样数据的json文件,在json文件下执行单个文件处理的命令

labelme_json_to_dataset ADE_train_00008815.json

会生成四个文件,分别为img.png,label.png,label.names.txt,label_viz.png.如图所示


img.png
label.png
label_viz.png
  • 注意不要认为只需要执行多次上述单个文件处理命令,就可以进行批量处理。同一标签在不同执行过程中会生成不同的颜色,主要原因是单步命令执行时,只按此图像中的标签类别个数进行分配颜色。因此这种方式无法进行批量化处理。

批量化处理

labelme仓库地址:https://github.com/wkentaro/labelme
在examples/semantic_segmentation路径下,可以参考README进行操作批量化处理。
即运行labelme2voc.py,会生成VOC格式文件目录。生成文件在SegmentationClassPNG文件下,保留了可视化比标注图片。
这种处理方式有个问题,是生成的label图像中标签位置的像素值并不是和lable类别名一致。在一些训练过程中,还需要进一步处理。因此可将代码修改如下:


from __future__ import print_function

import argparse
import glob
import os
import os.path as osp
import sys

import imgviz
import numpy as np

import labelme
import PIL.Image


def lblsave_unre(filename,out_png_unre_file, lbl):
    import imgviz

    if osp.splitext(filename)[1] != '.png':
        filename += '.png'
    # Assume label ranses [-1, 254] for int32,
    # and [0, 255] for uint8 as VOC.
    if lbl.min() >= -1 and lbl.max() < 255:
        lbl_pil = PIL.Image.fromarray(lbl.astype(np.uint8), mode='P')
        lbl_pil.save(out_png_unre_file)
        colormap = imgviz.label_colormap()
        lbl_pil.putpalette(colormap.flatten())
        lbl_pil.save(filename)
    else:
        raise ValueError(
            '[%s] Cannot save the pixel-wise class label as PNG. '
            'Please consider using the .npy format.' % filename
        )

def main():
    #标注文件路径
    input_dir = '/media/suyuan/U/data/annotation/select_0427/'
    #输出路径
    output_dir = '/media/suyuan/U/data/annotation/out_0427'
    #标签txt文件,里面含有按列排列的类别名
    labels = '/media/suyuan/U/data/annotation/labels_0427.txt'
    noviz = True


    if osp.exists(output_dir):
        print('Output directory already exists:', output_dir)
    else:
        os.makedirs(output_dir)
        os.makedirs(osp.join(output_dir, 'JPEGImages'))
        os.makedirs(osp.join(output_dir, 'SegmentationClass'))
        os.makedirs(osp.join(output_dir, 'SegmentationClassPNG'))
        if not noviz:
            os.makedirs(
                osp.join(output_dir, 'SegmentationClassVisualization')
            )
    print('Creating dataset:', output_dir)

    class_names = []
    class_name_to_id = {}
    for i, line in enumerate(open(labels).readlines()):
        class_id = i - 1  # starts with -1
        class_name = line.strip()
        class_name_to_id[class_name] = class_id
        if class_id == -1:
            assert class_name == '__ignore__'
            continue
        elif class_id == 0:
            assert class_name == '_background_'
        class_names.append(class_name)
    class_names = tuple(class_names)
    print('class_names:', class_names)
    out_class_names_file = osp.join(output_dir, 'class_names.txt')
    with open(out_class_names_file, 'w') as f:
        f.writelines('\n'.join(class_names))
    print('Saved class_names:', out_class_names_file)

    for filename in glob.glob(osp.join(input_dir, '*.json')):
        print('Generating dataset from:', filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]
        out_img_file = osp.join(
            output_dir, 'JPEGImages', base + '.png')
        out_lbl_file = osp.join(
            output_dir, 'SegmentationClass', base + '.npy')
        out_png_file = osp.join(
            output_dir, 'SegmentationClassPNG', base + '.png')
        out_png_unre_file = osp.join(
            output_dir, 'SegmentationClassPNG', base + '_nyu.png')
        if not noviz:
            out_viz_file = osp.join(
                output_dir,
                'SegmentationClassVisualization',
                base + '.jpg',
            )

        with open(out_img_file, 'wb') as f:
            f.write(label_file.imageData)
        img = labelme.utils.img_data_to_arr(label_file.imageData)

        #
        lbl, _ = labelme.utils.shapes_to_label(
            img_shape=img.shape,
            shapes=label_file.shapes,
            label_name_to_value=class_name_to_id,
        )

        #labelme.utils.lblsave(out_png_file, lbl)
        lblsave_unre(out_png_file,out_png_unre_file,lbl)

        np.save(out_lbl_file, lbl)

        
        if not noviz:
            viz = imgviz.label2rgb(
                label=lbl,
                img=imgviz.rgb2gray(img),
                font_size=15,
                label_names= class_names,
                loc='rb',
            )
            imgviz.io.imsave(out_viz_file, viz)


if __name__ == '__main__':
    main()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • 当我们制作自己的图像分割数据集时,一般都需要对数据集进行像素级标注,生成mask(对应原图像的每个像素的类别图,一...
    Ziyun_Wang阅读 8,768评论 0 0
  • 一劳永逸的生活,我想每个人都会想过。 外婆前几年会问到“你毕业要分配到哪里?”,以前的工作都是包分配,大家对工作生...
    君好么阅读 739评论 3 2
  • 最近学习node,在做登录功能的时候接触到了redis,但是经常忘记redis常用的几个命令行,所以今天把我经常用...
    晚饭总吃撑阅读 360评论 0 1
  • 今天的走势,怎么说,和我的想法有些差别。上涨我是预料到了但13点后下来了,这就是没估计到的。 说几个好耍的事,一个...
    那一叶秋阅读 146评论 0 1
  • 外面不知何时又下起了雨,而我也不知道为什么特别喜欢雨。 因为雨带着清晰的空气的味道,而特别是黄昏的时候,我喜欢一个...
    曾宝弘阅读 183评论 0 3