【意味分割】複数種類の意味分割データセットを一括作成


操作手順
  • 実行json_to_dataset.pyファイル、バッチjsonをdataset
  • に変換
  • 実行get_jpg_and_png.pyファイル、対応するpng階調図
  • を生成する
    注意:3.16.2バージョンのlabelmeを使用して、ブロガーは4.2.10バージョンのlabelmeを試したことがあります.drawはありません.pyファイル.ブロガーは3.16.2バージョンのdrawを試した.pyファイルを4.2.10フォルダの下のutilsファイルにコピーして、自分で構築してもだめで、間違いを報告します.drawを変更しなければなりません.pyファイルの内容ですね.
    以下のコードはすべてのコードで、直接実行できます.
    1. json_to_dataset.pyコード(jsonをdatasetに一括変換):
    # -*- encoding: utf-8 -*-
    """
    @File    : json_to_dataset.py.py
    @Time    : 2020/5/28 18:09
    @Author  : ligang
    @WeChat   : by15188607997
    @Software: PyCharm
    @explain:     json      dataset
    """
    
    import argparse
    import json
    import os
    import os.path as osp
    import warnings
    
    import PIL.Image
    import yaml
    
    from labelme import utils
    import base64
    
    def main(frompath, outputpath):
        count = os.listdir(frompath)
        for i in range(0, len(count)):
            path = os.path.join(frompath, count[i])
            if os.path.isfile(path) and path.endswith('json'):
                data = json.load(open(path))
                if data['imageData']:
                    imageData = data['imageData']
                else:
                    imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                    print(imagePath)
                    with open(imagePath, 'rb') as f:
                        imageData = f.read()
                        imageData = base64.b64encode(imageData).decode('utf-8')
                img = utils.img_b64_to_arr(imageData)
                label_name_to_value = {'_background_': 0}
                for shape in data['shapes']:
                    label_name = shape['label']
                    if label_name in label_name_to_value:
                        label_value = label_name_to_value[label_name]
                    else:
                        label_value = len(label_name_to_value)
                        label_name_to_value[label_name] = label_value
    
                # label_values must be dense
                label_values, label_names = [], []
                for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                    label_values.append(lv)
                    label_names.append(ln)
                assert label_values == list(range(len(label_values)))
    
                lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
    
                captions = ['{}: {}'.format(lv, ln)
                            for ln, lv in label_name_to_value.items()]
                lbl_viz = utils.draw_label(lbl, img, captions)
                out_dir = osp.basename(count[i]).replace('.', '_')
                out_dir = osp.join(osp.dirname(count[i]), out_dir)
                out_dir = osp.join(outputpath, out_dir)
    
                if not osp.exists(out_dir):
                    os.mkdir(out_dir)
    
                PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
    
                utils.lblsave(osp.join(out_dir, 'label.png'), lbl)
                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 label_names:
                        f.write(lbl_name + '
    '
    ) warnings.warn('info.yaml is being replaced by label_names.txt') info = dict(label_names=label_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__': # 、json frompath = "./before/" # outputpath = "./output" if not osp.exists(outputpath): os.mkdir(outputpath) main(frompath, outputpath)

    結果:出力されたoutputファイルに保存され、labelme_と同じ役割を果たします.json_to_Dataset作用.上のコードはロットです.
    2. get_jpg_and_png.pyコード(対応するpng階調図を生成):
    注意:class_name.txtファイルのクラスは手動で記入する必要があります.
    # -*- encoding: utf-8 -*-
    """
    @File    : get_jpg_and_png.py
    @Time    : 2020/5/28 18:07
    @Author  : ligang
    @WeChat   : by15188607997
    @Software: PyCharm
    """
    
    
    import os
    from PIL import Image
    import numpy as np
    
    
    def main(frompath_jpg, outputpath_json, output_jpg, output_png, path_allclass):
        #       
        count = os.listdir(frompath_jpg)
        for i in range(0, len(count)):
            #        jpg  
            #        png
            if count[i].endswith("jpg"):
                path = os.path.join(frompath_jpg, count[i])
                img = Image.open(path)
                img.save(os.path.join(output_jpg, count[i]))
    
                #      png
                path = outputpath_json + count[i].split(".")[0] + '_' + count[i].split(".")[1] + "_json/label.png"
                img = Image.open(path)
    
                #       
                class_txt = open(path_allclass, "r")
                class_name = class_txt.read().splitlines()
                # ["bk","cat","dog"]
                #   json        ,      
                with open(outputpath_json + count[i].split(".")[0] + '_' + count[i].split(".")[1] + "_json/label_names.txt", "r") as f:
                    names = f.read().splitlines()
                    # ["bk","dog"]
                    new = Image.new("RGB", [np.shape(img)[1], np.shape(img)[0]])
                    for name in names:
                        # index_json json       ,   
                        index_json = names.index(name)
                        # index_all     
                        index_all = class_name.index(name)
                        #            
                        new = new + np.expand_dims(index_all * (np.array(img) == index_json), -1)
    
                new = Image.fromarray(np.uint8(new))
                new.save(os.path.join(output_png, count[i].replace("jpg", "png")))
                print(np.max(new), np.min(new))
    
    
    if __name__ == '__main__':
        #    (          )  :
        # _background_(   )
        # Albatross
        # _Yellowthroat
        path_allclass = "./before/class_name.txt"
        #    、json     
        frompath_jpg = "./before/"
        #         
        outputpath_json = "./output/"
        #   jpg       
        output_jpg = "./traindata/jpg/"
        #   jpg       
        output_png = "./traindata/png/"
        if not os.path.exists(output_jpg):
            os.makedirs(output_jpg)
        if not os.path.exists(output_png):
            os.makedirs(output_png)
        main(frompath_jpg, outputpath_json, output_jpg, output_png, path_allclass)
    

    結果:結果はtraindataフォルダに保存されます.生成されたpngピクチャは二値化図である.画素の変化は(1,1,1)から始まる目には見えないので,色取り器で色取り検証を行うことができる.