labelme批量json_to_dataset方法,并且把image和label分别保存在一个文件夹下

json文件批量转化为图像文件

1.将Anaconda所在路径\envs\Lib\site-packages\labelme\cli下的json_to_dataset.py文件替换为下述代码:

import argparse
import json
import os
import os.path as osp
import warnings
 
import PIL.Image
import yaml
 
from labelme import utils
import base64

import cv2
import numpy as np
from skimage import img_as_ubyte
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
    if args.out is None:
        out_dir = osp.basename(json_file).replace('.', '_')
        out_dir = osp.join(osp.dirname(json_file), out_dir)
    else:
        out_dir = args.out
    if not osp.exists(out_dir):
        os.mkdir(out_dir)
 
    count = os.listdir(json_file) 
    for i in range(0, len(count)):
        path = os.path.join(json_file, count[i])
        if os.path.isfile(path):
            data = json.load(open(path))
            
            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['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('.', '_')
            save_file_name = out_dir
            out_dir = osp.join(osp.dirname(count[i]), out_dir)

            if not osp.exists(json_file + '\\' + 'labelme_json'):
                os.mkdir(json_file + '\\' + 'labelme_json')
            labelme_json = json_file + '\\' + 'labelme_json'
            out_dir1 = labelme_json + '\\' + save_file_name
            if not osp.exists(out_dir1):
                os.mkdir(out_dir1)
 
            PIL.Image.fromarray(img).save(osp.join(out_dir1, save_file_name+'_img.png'))
            #PIL.Image.fromarray(lbl).save(osp.join(out_dir1, save_file_name+'_label.png'))
            utils.lblsave(osp.join(out_dir1, save_file_name+'_label.png'), lbl)
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir1, save_file_name+'_label_viz.png'))

            if not osp.exists(json_file + '\\' + 'mask_png'):
                os.mkdir(json_file + '\\' + 'mask_png')
            mask_save2png_path = json_file + '\\' + 'mask_png'

            if not osp.exists(json_file + '\\' + 'img_png'):
                os.mkdir(json_file + '\\' + 'img_png')
            img_save2png_path = json_file + '\\' + 'img_png'

            utils.lblsave(osp.join(mask_save2png_path, save_file_name+'_label.png'), lbl)
            PIL.Image.fromarray(img).save(osp.join(img_save2png_path, save_file_name+'_img.png'))


            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in label_names:
                    f.write(lbl_name + '\n')
 
            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=label_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir1)
if __name__ == '__main__':
    main()

2.打开Anaconda prompt,激活labelme 环境

conda activate labelme

3.进入 labelme_json_to_dataset.json所在的目录, 输入以下命令:

labelme_json_to_dataset  data\json

其中data\json表示待批量处理的json文件所在的文件夹目录。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: labelme批量json_to_dataset方法的实现步骤如下: 1. 首先,需要将所有的json文件放在同一个文件夹中。 2. 然后,使用Python的os模块遍历该文件夹中的所有json文件。 3. 对于每个json文件,使用labelme提供的json_to_dataset方法将其转换为对应的图片和标注文件。 4. 将生成的图片和标注文件保存到指定的文件夹中。 5. 最后,可以使用labelme提供的visualize_dataset方法查看生成的数据集是否正确。 需要注意的是,该方法需要安装labelme库,并且需要在命令行中执行。可以使用Python的subprocess模块调用命令行执行该方法。 ### 回答2: Labelme是一款常用的图像标注工具,可用于数据集的标注和分割。在使用过程中,我们常常需要将标注之后的json文件转化为可供机器学习使用的二进制格式,即dataset,以便于模型的训练。本文将介绍如何实现批量json_to_dataset方法,以提高json文件转换效率。 一、json_to_dataset方法 json_to_datasetLabelme自带的将json文件转化为dataset方法。其命令行格式为: ```python labelme_json_to_dataset [FLAGS] input_json_file(s) ``` 其中,FLAGS为可选的标识符,input_json_file(s)为需要转换的json文件的路径。该方法会将json文件转化为多个二进制格式的图片(.png)和对应的标注(.json)。 二、批量json_to_dataset方法实现 在使用Labelme进行标注的过程中,我们经常会得到多个json文件,需要将它们全部转化为dataset。一般情况下,我们可以通过循环调用json_to_dataset方法来实现批量转换。例如,在Windows系统中,可以使用以下命令: ```python for json_file in *.json: labelme_json_to_dataset %s --out-put=data/%s \ --flags="--labels labels.txt" ``` 该命令将自动遍历当前文件夹下的所有json文件,并执行转换操作。 但是,多次调用Labelme的json_to_dataset方法会导致效率低下,尤其是对于大量的文件转换,会耗费大量时间和计算资源。因此,我们可以使用Python脚本来实现批量json_to_dataset方法。 在Python脚本中,我们可以使用os模块进行文件处理及路径管理,使用subprocess模块来执行Labelme的json_to_dataset方法。具体的步骤如下: 1. 定义需要转换的文件路径和输出路径。例如,我们将待转换的json文件存放在work_path目录下,在output_path目录下存放转换后的dataset文件。代码如下: ```python import os work_path = "E:/json_files" output_path = "E:/datasets" json_files = os.listdir(work_path) # 获取待转换的json文件列表 ``` 2. 构造Labelme的json_to_dataset命令,并通过subprocess模块执行。在Windows系统下,使用cmd /c来执行命令。 ```python import subprocess def json_to_dataset(json_path, output_path): cmd = "labelme_json_to_dataset %s --out-put=%s --flags='--labels labels.txt'" % (json_path, output_path) subprocess.run(["cmd", "/c", cmd], shell=True) ``` 3. 遍历待转换的json文件,按照json_to_dataset方法处理。 ```python for json_file in json_files: if not json_file.endswith(".json"): continue json_path = os.path.join(work_path, json_file) output_dir = os.path.join(output_path, json_file.split(".")[0]) if not os.path.exists(output_dir): os.makedirs(output_dir) json_to_dataset(json_path, output_dir) ``` 通过上述步骤,我们就可以实现Labelme的批量json_to_dataset方法。值得注意的是,该方法需要先在work_path目录中存放需要转换的json文件,而labels.txt文件需要放在与该脚本同级的目录下。 三、总结 在数据集处理中,图像标注及相应的dataset文件是不可或缺的。通过本文介绍的方法,我们可以实现针对Labelme的批量json_to_dataset方法,为数据集的标注和处理提高效率。 ### 回答3: 一、背景介绍 labelme是一种常见的用于标注图像和生成图像分割数据集的工具。但是,当我们需要处理大量的标注数据时,手动将每个json文件转换成对应的图像和标注文件将变得十分繁琐。因此,我们需要开发一种批量json文件转换成图像和标注文件方法。 二、实现步骤 1. 构建文件目录结构 我们需要为每个json文件准备一个对应的目录,该目录将作为存放图像和标注文件的目录。在该目录下,我们可以按照如下的结构组织文件: ``` . |--json_file_name_1.json |--json_file_name_1/ | |--rgb_images/ | | |--image_name_1.jpg | | |--image_name_1.json | | |--image_name_2.jpg | | |--image_name_2.json | |--label_images/ | | |--image_name_1.png | | |--image_name_2.png |--json_file_name_2.json |--json_file_name_2/ | |--rgb_images/ | | |--image_name_1.jpg | | |--image_name_1.json | | |--image_name_2.jpg | | |--image_name_2.json | |--label_images/ | | |--image_name_1.png | | |--image_name_2.png ``` 其中,json_file_name_x.json表示标注数据的json文件image_name_x.jpg表示原图像文件image_name_x.json表示原图像中标注的信息,image_name_x.png表示标注后的图像文件。 2. 将json文件转换成图像和标注文件 我们可以使用labelme提供的命令行工具labelme_json_to_dataset,将一个json文件转换成图像和标注文件: ``` labelme_json_to_dataset input.json -o output_dir ``` 其中,input.json为标注文件路径,output_dir为输出目录路径。我们可以将该命令嵌入到批量转换的脚本中,对每个json文件进行转换。 3. 批量转换json文件 我们可以使用Python的os模块,扫描指定目录下的所有json文件,然后对每个json文件调用命令行工具完成转换: ```python import os json_dir = "/path/to/json/dir" for json_file in os.listdir(json_dir): if json_file.endswith(".json"): # 构建目录路径 json_path = os.path.join(json_dir, json_file) output_dir = os.path.join(json_dir, json_file.replace(".json", "")) rgb_dir = os.path.join(output_dir, "rgb_images") label_dir = os.path.join(output_dir, "label_images") # 创建目录 os.makedirs(output_dir, exist_ok=True) os.makedirs(rgb_dir, exist_ok=True) os.makedirs(label_dir, exist_ok=True) # 转换 os.system(f"labelme_json_to_dataset {json_path} -o {output_dir}") ``` 4. 完成批量转换 通过上述步骤,我们就可以实现批量json文件转换成图像和标注文件方法了。该方法可以大大简化标注数据的处理流程,提高数据处理效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值