Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合

2023-11-01

一、Labelme标注工具安装

https://github.com/wkentaro/labelme
安装过程按照github教程就好,上面说的很详细,没遇到啥问题。

二、json文件批量执行转化

大家用到最多的就是 json文件的转化了,但是labelme自带转化工具,只能支持一次转化一个.json文件,所以需要修改代码,使得可以批量执行。
在lableme安装目录下有D:\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli目录,可以看到json_to_dataset.py文件,将下面代码复制替换其中内容即可。

运行:

python D:\Anaconda3\envs\labelme\Scripts\labelme_json_to_dataset.exe I:\xj\Mask_RCNN_dataset\json

路径只需要输入到文件夹即可,不需要具体指定json文件。看你的根目录在哪里,就去哪里找输出文件,会生成一些跟.json同名的文件夹。

这里一共提供三个版本:
转自:https://blog.csdn.net/yql_617540298/article/details/81110685

代码1、

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():
    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('.', '_')
            out_dir = osp.join(osp.dirname(count[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'))
            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 + '\n')
 
            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__':
    main()

但是存在两个问题

问题一:

对于多类分割任务,任意一张图可能不包含所有分类。因此整个文件夹下生成的所有label图像中,不同图像中的相同类别的目标在label.png中可能对应不同的灰度值,使标注的label不具备统一性,因而出错。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上三个图可以看出,有的猫和狗被标注成了同一种像素值,造成了标注错乱现象,所以大家使用时候这里注意。

问题二:

生成的 label.png,为 rgb三通道彩色图,并不是灰度图,想要灰度图,请看代码2

代码2、

转自:https://blog.csdn.net/u010103202/article/details/81635436#commentsedit

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')
    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])
        filename = list[i][:-5]       # .json
        if os.path.isfile(path):
            data = json.load(open(path))
            img = utils.image.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.shape.labelme_shapes_to_label(img.shape, data['shapes'])  # labelme_shapes_to_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]).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, '{}.png'.format(filename)))
            PIL.Image.fromarray(lbl).save(osp.join(out_dir, '{}_gt.png'.format(filename)))
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, '{}_viz.png'.format(filename)))

            with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')

            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()

这个能生成灰度图,但是还是存在 标注的label不具备统一性 的问题,请看代码3。

代码3、

为了解决以上问题,修改代码如下,

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

NAME_LABEL_MAP = {
    '_background_': 0,
    "baseball_diamond": 1,
    "tennis_court": 2,
    "basketball_court": 3,
    "ground_track_field": 4,
}

LABEL_NAME_MAP = {
    0: '_background_',
    1: "airplane",
    2: "ship",
    3: "storage_tank",
    4: "baseball_diamond",
    5: "tennis_court",
    6: "basketball_court",
    7: "ground_track_field",
    8: "harbor",
    9: "bridge",
    10: "vehicle",
}


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])
        filename = list[i][:-5]       # .json
        if os.path.isfile(path):
            data = json.load(open(path))
            img = utils.image.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.shape.labelme_shapes_to_label(img.shape, data['shapes'])  # labelme_shapes_to_label

            # modify labels according to NAME_LABEL_MAP
            lbl_tmp = copy.copy(lbl)
            for key_name in lbl_names:
                old_lbl_val = lbl_names[key_name]
                new_lbl_val = NAME_LABEL_MAP[key_name]
                lbl_tmp[lbl == old_lbl_val] = new_lbl_val
            lbl_names_tmp = {}
            for key_name in lbl_names:
                lbl_names_tmp[key_name] = NAME_LABEL_MAP[key_name]

            # Assign the new label to lbl and lbl_names dict
            lbl = np.array(lbl_tmp, dtype=np.int8)
            lbl_names = lbl_names_tmp

            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]).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, '{}.png'.format(filename)))
            PIL.Image.fromarray(lbl).save(osp.join(out_dir, '{}_gt.png'.format(filename)))
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, '{}_viz.png'.format(filename)))

            with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')

            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()

但是此代码可能会报类似错:
IndexError: index 6 is out of bounds for axis 0 with size 4
我已经修改了代码中bug(大神可自行修改),修改后的代码连接:json_to_dataset.py, (请原谅需要挣点积分的我,真的穷)
执行后的图像,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中,生成的图片名称跟原标注图片一致,那种黑色的背景图,其实是有图像的,只不过猫咪的像素值为1,狗狗像素值为2。从三个图中可以对比看出,猫咪都被标记为了1,狗狗都被标记为了2,而且生成的为灰度图,解决了代码1出现的两个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合 的相关文章

  • 通用文本标注工具 labelme

    欢迎大家前往腾讯云社区 xff0c 获取更多腾讯海量技术实践干货哦 作者 xff1a 理查德 导语 一个支持文本类目标注和关键词打分的通用标注工具 xff0c 为文本分类模型和关键词抽取任务提供训练和测试数据 by 慕福楠 amp 孙振龙
  • 【标注工具】旋转的 bbox 转普通 bbox

    目的 xff1a 实现以旋转目标检测的前提下 xff0c 将旋转标记框转为普通的标记框 相关连接 xff1a 实例分割 语义分割时旋转Bounding Box导致边框变宽 xff1a https www jianshu com p bb12
  • labelme标注格式转coco格式

    摘要 xff1a labelme是广泛使用的深度学习标注工具 xff0c 支持目标检测和实例分割等任务的标注 xff0c 但是一些框架如detectron2 xff0c solo等需要的是coco格式的 xff0c 这里提供一个示例把lab
  • Labelme标签转COCO2017数据集格式

    以下代码是将Labelme标注软件标注的目标检测矩形框标签转换成COCO2017数据集格式进行训练 一 Labelme标注软件的安装 在Annaconda创建虚拟环境及安装Labelme conda create n labelme pyt
  • 标注工具——VGG Image Annotator (VIA)

    VGG Image Annotator VIA VGG Image Annotator VIA 是一款开源的图像标注工具 xff0c 由Visual Geometry Group开发 地址 xff1a http www robots ox
  • 深度学习标注工具 LabelMe 的使用教程(Windows 版本)

    深度学习标注工具 LabelMe 的使用教程 xff08 Windows 版本 xff09 2018 11 21 20 12 53 精灵标注助手 xff1a http www jinglingbiaozhu com LabelMe xff1
  • labelme的使用学习

    windows下图像标注软件labelme安装及使用教程 xff1a https www rstk cn news 12836 html action 61 onClick 问题 xff1a 如何将labelme标注产生的json文件中的某
  • ‘labelme‘ 不是内部或外部命令,也不是可运行的程序问题解决

    文章目录 一 安装labelme1 创建虚拟环境2 安装pyqt支持库3 安装Labelme 二 lableme启动 一 安装labelme 1 创建虚拟环境 命令行输入 conda create span class token oper
  • 标注工具labelme的使用

    在做目标检测任务时 xff0c 少不了对图像进行标注 xff0c 标注工具有好几种 xff0c labelme是其中比较好用的一种 labelme可对图像进行标注 xff0c 包括多边形 矩形 线 点和图像级标注 它是用Python编写的
  • 【labelme格式json转为labelimg格式的xml(VOC)】

    64 TOC readme 用labelme标注图片 xff0c 得到的是json格式文件 xff0c 有时候需要voc格式的数据 xff0c 可以使用以下转换脚本 xff0c 只需把文件路径替换 code span class token
  • Mask Rcnn目标分割-训练自己数据集-详细步骤

    本文接着介绍了Mask Rcnn目标分割算法如何训练自己数据集 对训练所需的文件以及训练代码进行详细的说明 本文详细介绍在只有样本图片数据时 如果建立Mask Rcnn目标分割训练数据集的步骤 过程中用到的所有代码均已提供 一 制作自己的数
  • 手把手实战教学!语义分割从0到1:一、数据集制作

    本篇博客 是 手把手实战教学 语义分割从0到1 系列的第一篇实战教学 将重点介绍语义分割相关数据集 以及如何制作自己的数据集 本系列总的介绍 以及其他章节的汇总 见 https blog csdn net oYeZhou article d
  • Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合

    文章目录 一 Labelme标注工具安装 二 json文件批量执行转化 代码1 问题一 问题二 代码2 代码3 一 Labelme标注工具安装 https github com wkentaro labelme 安装过程按照github教程
  • labelme标注结果可视化(持续补充)

    图像数据常用的标注工具是labelme 标注的格式是json labelme标注结果可视化 是将标注结果绘制到原始图像上 以方便查看标注结果 1 json文件读取与保存 由于labelme标注的保存格式为json 所以必须掌握json文件的
  • Mask_RCNN 配置并训练自己的数据集

    文章目录 1 配置Mask RCNN 并运行demo 1 1环境 1 2下载github 1 3安装依赖库 1 4安装Mask RCNN 1 5下载coco已训练好模型 1 6安装 pycocotools 1 7使用 Jupyter 运行
  • paddleLabe标注文件转labelImg

    代码 import os import xml etree ElementTree as ET 增加换行符 def indent elem level 0 i n level t if len elem if not elem text o
  • 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

    从本篇博客正式开始深度学习项目的记录 实例代码只会放通用的代码 数据集和训练数据也是不会全部放出 系列文章 基于Yolov5目标检测的物体分类识别及定位 一 数据集原图获取与标注 基于Yolov5目标检测的物体分类识别及定位 二 yolov
  • 语义分割之 数据标注

    语义分割之 数据标注 一 标注工具 二 Labelme 安装和启动 1 安装 2 启动 三 标注与保存 1 打开图像 2 标注 3 保存 4 修改 四 多类别标注 五 快捷键 数据标注的目的是为了在监督学习中告诉机器哪些东西是属于哪个类别或
  • 实现labelme批量json_to_dataset方法

    labelme可以帮助我们快速的实现Mask RCNN中数据集json文件的生成 然而还需要我们进一步的将json转成dataset 可以直接在cmd中执行labelme json to dataset exe C Users Admini
  • 使用labelme打标签,详细教程

    做图像语义分割 打标签时需要用到labelme这个工具 我总结了它的详细使用教程 目录 一 安装labelme工具 二 文件位置关系 三 labelme工具 四 labelme工具的快捷键 五 代码 将标签文件转为统一固定格式 六 总结 一

随机推荐

  • FPGA 时序约束 二 :创建时钟和时钟不相关约束

    创建时钟是针对代码中主时钟而言 创建时钟之前需要知道代码中的主时钟都是什么 可以在综合以后 打开综合 然后在TCL 中输入命令 report clock networks name mynetwork 确定了主时钟 就可以对其创建时钟周期约
  • win 双机mysql集群_heartbeat双机 V3 CRM实现多台mysql集群

    一 系统环境 OS AS 5 3 i386 两服务器 db ha1 10 0 3 194 db ha2 10 0 3 195 VIP 10 0 3 111 资源名称 ha mysql1 ha mysql2 fs mysql1 fs mysq
  • 将字符串“I am a student.”逆序输出为“student. a am I”

    给到一串字符 I am a student 将其输出为 student a am I 整体思路为先将整个字符串逆序为 tneduts a ma I 然后再将每个单词进行逆序转换为 student a am I 那么我们只需先写出将整个字符串
  • 数组目标值target两个整数,并返回它们的数组下标

    1 题目背景 给定一个整数数组nums和一个整数目标值target 请你在该数组中找出和为目标值target的那两个整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺序
  • String 在Java中的用法详解

    认识String类 和 String的使用 1 创建字符串 1 常见的构造String的方式 2 String的基本概念 2 字符串比较相等 3 字符 字节 字符串的转换 1 字符与字符串 2 字节与字符串 4 字符串常见操作 1 字符串比
  • Java多线程和操作系统多线程关系

    这篇文章要讨论的是Java编程中的多线程和操作系统中的多线程的区别问题 线程状态 首先两者的线程状态是一样的 创建 就绪 执行 阻塞 终止 其实这五个状态也是进程的状态 那么Java中的多线程 和 OS中的多线程的区别在哪里 我们先来看下O
  • 骑士宣言

    关于骑士 有很多的妙论 在中古世纪 骑士是最耀眼的战斗力 从中也延伸出了骑士的八大美德 历来很多玩家都把骑士当作最灿烂的职业 但大家却不曾想过骑士原本是一种象征意义的精神 我们来为这八大美德宣誓 谦卑 谦虚和永远将自己放在卑微的位置是骑士的
  • RabbitMQ(二):五种模式的简单介绍

    RabbitMQ 二 五种模式的简单介绍 一 Hello World 点对点 二 Work Queues 工作队列 三 Publish Subscribe 发布订阅 四 Routing 路由 五 Topics 话题 RabbitMQ 一 C
  • 学习笔记:SemanticStyleGAN 面向可控图像合成和编辑的组合生成先验学习

    CVPR 2022 SemanticStyleGAN Learning Compositional Generative Priors for Controllable Image Synthesis and Editing 面向可控图像合
  • MES生产管理系统如何与ERP系统集成

    MES生产管理系统和ERP企业管理系统是制造企业信息化的重要组成部分 它们在生产管理 资源计划和业务流程等方面发挥着重要作用 实现MES与ERP系统的集成 可以更好地优化企业生产流程 提高生产效率和降低成本 本文将探讨MES管理系统解决方案
  • 区块链技术开发路线

    背景陈述 已经对区块链领域的学习研究了一段时间 总体来说 前期主要是围绕bitcoin架构及其源码学习的 但对这个领域的技术开发还是不太熟悉 为了使自己对区块链领域有一个系统的学习和技术锤炼 特此总结了如下技术开发路线 来逐渐充实自己的区块
  • 育碧2k微软服务器,2K工作室更名-2K Games,育碧,全境封锁2 ——快科技(驱动之家旗下媒体)--科技改变未来...

    2K Games旗下的 硅谷工作室 Silicon Valley Studio 现更名为 第31工会 31st Union 之所以要提到这间工作室 盖因创始人Michael Condrey之前是动视 大锤工作室联合创始人 更早以前还是EA
  • C++(一)#pragma once用法

    C 一 pragma once用法 用法 C C 中 在使用预编译指令 include的时候 为了防止重复引用造成二义性 ifndef ifndef CODE BLOCK define CODE BLOCK code endif CODE
  • Python OSError: symbol cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 not defined的解决

    问题与排查 原报错信息如下 OSError opt conda lib python3 8 site packages nvidia cublas lib libcublas so 11 symbol cublasLtHSHMatmulAl
  • 动态创建class

    需要引入命名空间 using System CodeDom using System CodeDom Compiler using Microsoft CSharp using System Reflection public static
  • ASP.NET中文显示乱码之解决方法

    ASP NET很灵活 这归功于它采用文本文件方式的配置方式 另外的那种用页面标识符的方法应该是从ASP延续下来的 写ASP 程序时候碰到中文显示问题 运行后发现ASP 从数据库中读出来的中文全部变成了 解决办法 方法一 在config we
  • 程序员眼中的流量卡:需求、选择与使用

    标题 程序员眼中的流量卡 需求 选择与使用 一 流量卡的需求分析 作为程序员 我们深知数据流量在我们的工作中的重要性 无论是开发 测试还是部署 亦或是远程工作 都需要网络的支持 使用流量卡可以为我们提供一种灵活 便携的网络解决方案 让我们可
  • 如何用java POI在excel中画线_Java中使用POI在Excel单元格中画斜线—XLS格式

    Excel主要有xls和xlsx两种格式 两种格式对应的POI接口使用方法也不同 本节主要介绍一下 在xls格式的Excel单元格中如何画斜线 1 初始化HSSFWorkbook对象 初始化HSSFWorkbook对象 创建两行两列单元格
  • 【React】Fiber 实现可中断的渲染

    什么是可中断的 渲染 参照我们在 Concurrent 的奥秘 中的同步渲染和并发渲染的例子 上图是同步渲染过程 上图是并发渲染过程 我们可以看到明显的区别 同步渲染 就是完整地执行了一个很耗时的渲染 并发渲染 将原本耗时的 渲染 拆解成了
  • Labelme标注工具 json文件批量转化 labelme_json_to_dataset 多个版本代码集合

    文章目录 一 Labelme标注工具安装 二 json文件批量执行转化 代码1 问题一 问题二 代码2 代码3 一 Labelme标注工具安装 https github com wkentaro labelme 安装过程按照github教程