Labelme标签转COCO2017数据集格式

2023-05-16

以下代码是将Labelme标注软件标注的目标检测矩形框标签转换成COCO2017数据集格式进行训练.

一. Labelme标注软件的安装:

在Annaconda创建虚拟环境及安装Labelme:

  1. conda create -n labelme python=3.8
  2. conda activate labelme
  3. pip install pyqt
  4. pip install pillow
  5. pip install labelme
    注意: 有时候labelme版本会与一些库有冲突, 导致安装labelme之后无法打开, 这时候可以自己网上查找安装合适的版本.

二.Labelme标签转换成COCO2017代码:

# -*- coding:utf-8 -*-
 
import argparse
import json
import matplotlib.pyplot as plt
import cv2
from labelme import utils
import numpy as np
import glob
import PIL.Image
 
class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)
 
class labelme2coco(object):
    def __init__(self, labelme_json=[], save_json_path='./tran.json'):
        '''
        :param labelme_json: 所有labelme的json文件路径组成的列表
        :param save_json_path: json保存位置
        '''
        self.labelme_json = labelme_json
        self.save_json_path = save_json_path
        self.images = []
        self.categories = []
        self.annotations = []
        # self.data_coco = {}
        self.label = []
        self.annID = 1
        self.height = 0
        self.width = 0
 
        self.save_json()
 
    def data_transfer(self):
 
        for num, json_file in enumerate(self.labelme_json):
            with open(json_file, 'r') as fp:
                data = json.load(fp)  # 加载json文件
                self.images.append(self.image(data, num))
                for shapes in data['shapes']:
                    label = shapes['label']
                    if label not in self.label:
                        self.categories.append(self.categorie(label))
                        self.label.append(label)
                    points = shapes['points']#这里的point是用rectangle标注得到的,只有两个点,需要转成四个点
                    #points.append([points[0][0],points[1][1]])
                    #points.append([points[1][0],points[0][1]])
                    self.annotations.append(self.annotation(points, label, num))
                    self.annID += 1
 
    def image(self, data, num):
        image = {}
        img = utils.img_b64_to_arr(data['imageData'])  # 解析原图片数据
        # img=io.imread(data['imagePath']) # 通过图片路径打开图片
        # img = cv2.imread(data['imagePath'], 0)
        height, width = img.shape[:2]
        img = None
        image['height'] = height
        image['width'] = width
        image['id'] = num + 1
        #image['file_name'] = data['imagePath'].split('/')[-1]
        image['file_name'] = data['imagePath']
        self.height = height
        self.width = width
 
        return image
 
    def categorie(self, label):
        categorie = {}
        categorie['supercategory'] = 'none'
        categorie['id'] = len(self.label) + 1  # 0 默认为背景
        categorie['name'] = label
        return categorie
 
    def annotation(self, points, label, num):
        annotation = {}
        annotation['segmentation'] = [list(np.asarray(points).flatten())]
        annotation['iscrowd'] = 0
        annotation['image_id'] = num + 1
        # annotation['bbox'] = str(self.getbbox(points)) # 使用list保存json文件时报错(不知道为什么)
        # list(map(int,a[1:-1].split(','))) a=annotation['bbox'] 使用该方式转成list
        annotation['bbox'] = list(map(float, self.getbbox(points)))
        annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3]
        # annotation['category_id'] = self.getcatid(label)
        annotation['category_id'] = self.getcatid(label)#注意,源代码默认为1
        annotation['id'] = self.annID
        return annotation
 
    def getcatid(self, label):
        for categorie in self.categories:
            if label == categorie['name']:
                return categorie['id']
        return 1
 
    def getbbox(self, points):
        # img = np.zeros([self.height,self.width],np.uint8)
        # cv2.polylines(img, [np.asarray(points)], True, 1, lineType=cv2.LINE_AA)  # 画边界线
        # cv2.fillPoly(img, [np.asarray(points)], 1)  # 画多边形 内部像素值为1
        polygons = points
 
        mask = self.polygons_to_mask([self.height, self.width], polygons)
        return self.mask2box(mask)
 
    def mask2box(self, mask):
        '''从mask反算出其边框
        mask:[h,w]  0、1组成的图片
        1对应对象,只需计算1对应的行列号(左上角行列号,右下角行列号,就可以算出其边框)
        '''
        # np.where(mask==1)
        index = np.argwhere(mask == 1)
        rows = index[:, 0]
        clos = index[:, 1]
        # 解析左上角行列号
        left_top_r = np.min(rows)  # y
        left_top_c = np.min(clos)  # x
 
        # 解析右下角行列号
        right_bottom_r = np.max(rows)
        right_bottom_c = np.max(clos)
 
        # return [(left_top_r,left_top_c),(right_bottom_r,right_bottom_c)]
        # return [(left_top_c, left_top_r), (right_bottom_c, right_bottom_r)]
        # return [left_top_c, left_top_r, right_bottom_c, right_bottom_r]  # [x1,y1,x2,y2]
        return [left_top_c, left_top_r, right_bottom_c - left_top_c,
                right_bottom_r - left_top_r]  # [x1,y1,w,h] 对应COCO的bbox格式
 
    def polygons_to_mask(self, img_shape, polygons):
        mask = np.zeros(img_shape, dtype=np.uint8)
        mask = PIL.Image.fromarray(mask)
        xy = list(map(tuple, polygons))
        PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)
        mask = np.array(mask, dtype=bool)
        return mask
 
    def data2coco(self):
        data_coco = {}
        data_coco['images'] = self.images
        data_coco['categories'] = self.categories
        data_coco['annotations'] = self.annotations
        return data_coco
 
    def save_json(self):
        self.data_transfer()
        self.data_coco = self.data2coco()
        # 保存json文件
        json.dump(self.data_coco, open(self.save_json_path, 'w'), indent=4, cls=MyEncoder)  # indent=4 更加美观显示
 

if __name__ == '__main__':
    # 根据自己的情况替换路径
    labelme_json = glob.glob('/home/wsy/data/05_indoorLift/dataSets/train2017/*.json')  # Labelme的.json标签文件夹路径
    labelme2coco(labelme_json, '/home/wsy/data/05_indoorLift/dataSets/annotations/instances_train2017.json')  # 生成的coco2017标签文件

    labelme_json = glob.glob('/home/wsy/data/05_indoorLift/dataSets/val2017/*.json')  # Labelme的.json标签文件夹路径
    labelme2coco(labelme_json, '/home/wsy/data/05_indoorLift/dataSets/annotations/instances_val2017.json')  # 生成的coco2017标签文件

参考网址: https://blog.csdn.net/qq_43673118/article/details/123707636

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

Labelme标签转COCO2017数据集格式 的相关文章

  • 通用文本标注工具 labelme

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

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

    以下代码是将voc2007的数据标签格式转为coco2017数据标签格式 可直接基于voc2007的 xml所有文件进行处理 也可先转化为 txt文件路径之后再处理 此处我是直接基于 xml所有文件进行处理的 span class toke
  • COCO image caption数据集格式

    最近在做image caption的任务 xff0c 因为有自己的数据集 xff0c 因此需要自己创建字典 annotation等信息 而COCO官方针对coco image caption任务的数据集写了一个API接口 xff08 pyc
  • 深度学习标注工具 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文件中的某
  • coco2017 数据集获取

    span class token comment 下载命令 span span class token function wget span http images cocodataset org zips train2017 zip sp
  • ‘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文件的
  • Labelme标注灰度图,执行出现错误:AssertionError: rgb must be 3 dimensional的解决方案

    labelme标注灰度图后 执行json to dataset之后 出现错误 AssertionError rgb must be 3 dimensional 解决办法 找到安装labelme的位置 找到json to dataset py
  • 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工具的快捷键 五 代码 将标签文件转为统一固定格式 六 总结 一

随机推荐

  • FreeRTOS内核——数据结构链表

    1 数据结构 1 1 list与list item 也就是c语言中的链表与链表结点 单项链表很少用 xff0c 多用双向链表 1 1 1 list List t list就是一串链表 xff0c 具体来说就是这一串链表的头结点 因此 xff
  • github拒绝连接

    设置 xff0c 网络中心 xff0c 双击当前用的网卡 xff0c 点击属性 xff0c 双击ipv4 xff0c DNS改为手动 xff0c 把DNS服务器地址改为1 1 1 1或者8 8 8 8 xff0c 备用的可以不用管 xff0
  • Ubuntu学习笔记:使用命令查看文件系统磁盘空间使用情况。

    Ubuntu学习笔记 xff1a 使用命令查看文件系统磁盘空间使用情况 df基本命令格式 xff1a df 选项 目录或文件名 df h 使用人们习惯的 KB MB 或 GB 等单位自行显示容量 xff1b df a 显示所有文件系统信息
  • Ubuntu-22.10安装Redis

    Redis xff0c 英文全称是Remote Dictionary Server xff08 远程字典服务 xff09 xff0c 是一个开源的使用ANSIC语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xf
  • windows Server 2012 R2安装 “vc_redist.x64.exe“ 报错

    问题 xff1a 安装 34 vc redist x64 exe 34 失败 xff0c 0x80240017 未指定的错误 解决 xff1a 安装更新程序 KB2919442 与 KB2919355 KB2919442 下载地址 xff1
  • 浅谈DH参数(以华数机器人为例)

    1 DH参数说明 欧几里得空间中的直角坐标系由三个两两相交且相互垂直的轴构成 xff1a X 轴 xff0c Y轴和 Z轴 因此 xff0c 一个三维直角坐标系有六个变换自由度 xff1a 沿 X xff0c Y xff0c Z 轴的平移自
  • 常用浏览器 + WebDriver驱动下载网址汇总 + 浏览器内核版本查看

    常用浏览器 一 IE浏览器二 Microsoft Edge浏览器三 Chrome google 浏览器四 Firefox 火狐 浏览器五 Opera浏览器六 Safari浏览器七 其他1 QQ浏览器2 360浏览器3 搜狗浏览器4 猎豹浏览
  • Oracle报错记录(持续更新)

    问题目录 问题1 xff1a ORA 01950问题2 xff1a ORA 12514问题3 xff1a ORA 28547 问题1 xff1a ORA 01950 问题描述 xff1a 对表空间无权限 解决 xff1a 以管理员身份运行c
  • Tengine-Lite在Nvidia AGX Xavier上的安装

    一 说明 由于工作需要 在Nvidia AGX Xavier上使用Tengine Lite引擎进行模型的推理使用 Tengine Lite是什么 Tengine 由 OPEN AI LAB 主导开发 xff0c 该项目实现了深度学习神经网络
  • 一份完整的软件测试报告

    基于软件发布测试编写一份完整的测试报告所包含的内容 xff1a 模板提取链接 xff1a https pan baidu com s 1l7opbNU7fwHXl9UacM4opQ 提取码 xff1a mgzo
  • 【STM32学习笔记】(10)——蜂鸣器实验详解

    蜂鸣器实验 蜂鸣器的简介 蜂鸣器是一种一体化结构的电子讯响器 xff0c 采用 直流电压供电 xff0c 广泛应用于计算机 打印机 复印机 报警器 电子玩具 汽车电子设备 电话机 定时器等电子产品中作发声器件 蜂鸣器主要分为 压电式蜂鸣器和
  • 计算机网络实验

    Ipconfig命令 1 实作一 Ipconfig命令通常被用户用来查看计算机中的ip地址 xff0c 子网掩码以及默认网关 与之类似的ipconfig all命令则是显示ipconfig中所有的详细信息 其中 xff0c ipconfig
  • 在linux系统下搭建鸿蒙bearPi的编译环境

    前言 xff1a 我是Linux使用的是Ubuntu18 04 进行环境配置的 xff0c 如果环境不同导致报错请自行网上搜索答案 1 首先先下载必要的插件 链接 xff1a https pan baidu com s 15E3SBXj g
  • keil玩儿51单片机时遇见的错误与警告

    一 错误1 错误展示 错误说明 xff1a 自己写的代码太大 xff0c 超过了keil5能够编辑的最大范围2048 xff1b 解决方法 xff1a 1 xff09 使用注册机 xff0c 破解keil5 xff1b 2 xff09 调整
  • Linux从入门到精通(Ubuntu 16.04)第一节实验

    第一节实验 命令操作 sudo su root 管理员身份 exit 退出管理员身份 xff0c 进入普通用户身份 shutdown 关机 reboot 重启 cd 进入根目录 cd 从当前目录后退一级 ls 查看当前目录文件及文件夹 cd
  • 计算机网络 第一节 基于 Windows 的 TCP/IP 实用程序:Ipconfig、Ping、Tracert、 Netstat、arp。

    了解基本的基于 Windows 的 TCP IP 实用程序 xff1a Ipconfig Ping Tracert Netstat arp 1 使用 ping 命令测试本地主机 TCP IP 的安装以及两台主机的连通情况 2 使用 ipco
  • IP地址,子网掩码,默认网关理解

    IP地址 xff0c 子网掩码 xff0c 默认网关 通俗来讲 xff1a IP 地址 xff0c 是标注一台电脑的身份 xff0c 如同每个人都有的身份证 xff1b 子网掩码表示所使用的网络属于哪种网络段 xff0c 两个IP地址同属于
  • Linux从入门到精通(Ubuntu 16.04)第二节实验

    1 重定向 cd home 在home文件夹 ls l gt test2 在home文件夹下新建了test2文件夹 xff0c 里面写入了home文件夹下的内容 2交换分区 注意 xff1a 要在cd root下进行 xff0c 当时在这里
  • Linux 从入门到精通(Ubuntu 16.04)第三节实验

    1 User 用户管理命令 xff08 1 xff09 adduser 添加用户 adduser a1 添加普通用户a1 adduser system home home a2 shell bin bash a2 添加系统用 xff0c 户
  • Labelme标签转COCO2017数据集格式

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