zoukankan      html  css  js  c++  java
  • 转载:批量将.json文件转换成img.png;label.png;label_name.txt;label_viz.pgn;info.yaml文件

    labelme 安装

    conda create -n labelme python=3.6
    source activate labelme
    conda install pyqt
    pip install labelme

    转换为mask.png 格式

    直接修改labelme中的json_to_dataset.py文件

    import argparse
    import json
    import os
    import os.path as osp
    import warnings
    import copy
    import numpy as np
    import PIL.Image
    from skimage import io
    import yaml
    from labelme import utils
    
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('json_file')   # 标注文件json所在的文件夹
        parser.add_argument('-o', '--out', default=None)
        args = parser.parse_args()
    
        json_file = args.json_file
    
        list = os.listdir(json_file)   # 获取json文件列表
        for i in range(0, len(list)):
            path = os.path.join(json_file, list[i])  # 获取每个json文件的绝对路径
            filename = list[i][:-5]       # 提取出.json前的字符作为文件名,以便后续保存Label图片的时候使用
            extension = list[i][-4:]
            if extension == 'json':
                if os.path.isfile(path):
                    data = json.load(open(path))
                    img = utils.image.img_b64_to_arr(data['imageData'])  # 根据'imageData'字段的字符可以得到原图像
                    # lbl为label图片(标注的地方用类别名对应的数字来标,其他为0)lbl_names为label名和数字的对应关系字典
                    lbl, lbl_names = utils.shape.labelme_shapes_to_label(img.shape, data['shapes'])   # data['shapes']是json文件中记录着标注的位置及label等信息的字段
    
                    #captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
                    #lbl_viz = utils.draw.draw_label(lbl, img, captions)
                    out_dir = osp.basename(list[i])[:-5]+'_json'
                    out_dir = osp.join(osp.dirname(list[i]), out_dir)
                    if not osp.exists(out_dir):
                        os.mkdir(out_dir)
    
                    PIL.Image.fromarray(img).save(osp.join(out_dir, '{}_source.png'.format(filename)))
                    PIL.Image.fromarray(lbl).save(osp.join(out_dir, '{}_mask.png'.format(filename)))
                    #PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, '{}_viz.jpg'.format(filename)))
    
                    with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                        for lbl_name in lbl_names:
                            f.write(lbl_name + '
    ')
    
                    warnings.warn('info.yaml is being replaced by label_names.txt')
                    info = dict(label_names=lbl_names)
                    with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
                        yaml.safe_dump(info, f, default_flow_style=False)
    
                    print('Saved to: %s' % out_dir)
    
    
    if __name__ == '__main__':
        main()
    ## Labeleme png格式可视化:查看PennFudanPed数据集中的图片和mask等数据
    from PIL import Image
    mask = Image.open('label.png').convert('L')
    
    mask.putpalette([0, 0, 0,     # putpalette给对象加上调色板,相当于上色:背景为黑色,目标1为红色,目标2为黄色,目标3为橙色(如果你的图中有更多的目标,可以自行添加更多的调色值)
                     255, 0, 0,
                     255, 255, 0,
                     255, 153, 0])
    mask.show()  # 查看mask上色后的效果
    ## 也可以直接代码中将labelme json 转成mask数据,不用单独转了
    def __init__(self, root, transforms=None):
        self.root = root
        self.transforms = transforms
    
        self.imgs = list(sorted(os.listdir(os.path.join(root, 'PNGImages'))))
        self.jsons = list(sorted(os.listdir(os.path.join(root, 'JSONFiles'))))
    
    def __getitem__(self, idx):
        img_path = os.path.join(self.root, 'PNGImages', self.imgs[idx])
        json_path = os.path.join(self.root, 'JSONFiles', self.jsons[idx])
            
        img = Image.open(img_path).convert('RGB')
        data = json.load(open(json_path))
        #mask = Image.open(mask_path).convert('L')  # 使用mask.mode可以知道读进来的mask图片格式是I,也就是32位整形数据,因此要转化为L格式
        # 改成直接从json文件中读取的形式
        mask, label_names = utils.shape.labelme_shapes_to_label(img.size, data['shapes'])
    
        obj_ids = np.unique(mask)  # 去除数组中重复的数字,并进行排序
        obj_ids = obj_ids[1:]  # 去除第一个索引,因为它是背景
        masks = mask == obj_ids[:, None, None]  # split the color-encoded mask into a set of binary masks

    直接利用labelme中的函数:

    import argparse
    import json
    import os
    import os.path as osp
    import warnings
    import numpy as np
    import PIL.Image
    import yaml
    from labelme import utils
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('json_file')
        parser.add_argument('-o', '--out', default=None)
        args = parser.parse_args()
        json_file = args.json_file
        list = os.listdir(json_file) 
        for i in range(0, len(list)):
            path = os.path.join(json_file, list[i])
            if os.path.isfile(path):
                data = json.load(open(path))
                img = utils.img_b64_to_arr(data['imageData'])
                lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
                captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
                lbl_viz = utils.draw_label(lbl, img, captions)
                out_dir = osp.basename(list[i]).replace('.', '_')
                out_dir = osp.join(osp.dirname(list[i]), out_dir)
                if not osp.exists(out_dir):
                    os.mkdir(out_dir)
                PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
                PIL.Image.fromarray(lbl).save(osp.join(out_dir, 'label.png'))
                PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
                with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                    for lbl_name in lbl_names:
                        f.write(lbl_name + '
    ')
                warnings.warn('info.yaml is being replaced by label_names.txt')
                info = dict(label_names=lbl_names)
                with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
                    yaml.safe_dump(info, f, default_flow_style=False)
                print('Saved to: %s' % out_dir)
    if __name__ == '__main__':
        main()
  • 相关阅读:
    博士考试复习过程总结
    制作在Linux、Unix上以daemon方式启动Apusic的详细步骤(转)
    重开Blog
    给计算机的兄弟姐妹们补补身体→煲银耳粥
    被人夸成像设计师,高兴呐
    今天问题总结(Hibernate配置参数访问Oracle,Linux下的Apusic自启动)
    HDU ACM 1272 小希的迷宫
    Uva 10115 Automatic Editing
    HDU ACM 1162 Eddy's picture(MST)
    Uva 10474 Where is the Marble?(水题)
  • 原文地址:https://www.cnblogs.com/hansjorn/p/13557282.html
Copyright © 2011-2022 走看看