【labelme格式json转为labelimg格式的xml(VOC)】
@TOC
readme
用labelme标注图片,得到的是json格式文件,有时候需要voc格式的数据,可以使用以下转换脚本,只需把文件路径替换。
code
# -*- coding: utf-8 -*-
import numpy as np
import json# 读取json 标签内容
# 当中有2种模式,一种rectangle,表示json文件是通过labelme的rectangle方式标注,
# 一种polygon,表示json文件是通过labelme的polygon方式标注。根据实际情况进行变换。
##### 1
class ReadAnno:def __init__(self, json_path, process_mode="rectangle"):self.json_data = json.load(open(json_path))self.filename = self.json_data['imagePath']self.width = self.json_data['imageWidth']self.height = self.json_data['imageHeight']self.coordis = []assert process_mode in ["rectangle", "polygon"]if process_mode == "rectangle":self.process_polygon_shapes()elif process_mode == "polygon":self.process_polygon_shapes()def process_rectangle_shapes(self):for single_shape in self.json_data['shapes']:bbox_class = single_shape['label']xmin = single_shape['points'][0][0]ymin = single_shape['points'][0][1]xmax = single_shape['points'][1][0]ymax = single_shape['points'][1][1]self.coordis.append([xmin,ymin,xmax,ymax,bbox_class])def process_polygon_shapes(self):for single_shape in self.json_data['shapes']:bbox_class = single_shape['label']temp_points = []for couple_point in single_shape['points']:x = float(couple_point[0])y = float(couple_point[1])temp_points.append([x,y])temp_points = np.array(temp_points)xmin, ymin = temp_points.min(axis=0)xmax, ymax = temp_points.max(axis=0)self.coordis.append([xmin,ymin,xmax,ymax,bbox_class])def get_width_height(self):return self.width, self.heightdef get_filename(self):return self.filenamedef get_coordis(self):return self.coordis##### 2
from xml.dom.minidom import Document# 创建labelimg标注格式的xml文件标签 并添加读取的数据,进行转换
class CreateAnno:def __init__(self,):self.doc = Document() # 创建DOM文档对象self.anno = self.doc.createElement('annotation') # 创建根元素self.doc.appendChild(self.anno)self.add_folder()self.add_path()self.add_source()self.add_segmented()# self.add_filename()# self.add_pic_size(width_text_str=str(width), height_text_str=str(height), depth_text_str=str(depth))def add_folder(self, floder_text_str='JPEGImages'):floder = self.doc.createElement('floder') ##建立自己的开头floder_text = self.doc.createTextNode(floder_text_str) ##建立自己的文本信息floder.appendChild(floder_text) ##自己的内容self.anno.appendChild(floder)def add_filename(self, filename_text_str='00000.jpg'):filename = self.doc.createElement('filename')filename_text = self.doc.createTextNode(filename_text_str)filename.appendChild(filename_text)self.anno.appendChild(filename)def add_path(self, path_text_str="None"):path = self.doc.createElement('path')path_text = self.doc.createTextNode(path_text_str)path.appendChild(path_text)self.anno.appendChild(path)def add_source(self, database_text_str="Unknow"):source = self.doc.createElement('source')database = self.doc.createElement('database')database_text = self.doc.createTextNode(database_text_str) # 元素内容写入database.appendChild(database_text)source.appendChild(database)self.anno.appendChild(source)def add_pic_size(self, width_text_str="0", height_text_str="0", depth_text_str="3"):size = self.doc.createElement('size')width = self.doc.createElement('width')width_text = self.doc.createTextNode(width_text_str) # 元素内容写入width.appendChild(width_text)size.appendChild(width)height = self.doc.createElement('height')height_text = self.doc.createTextNode(height_text_str)height.appendChild(height_text)size.appendChild(height)depth = self.doc.createElement('depth')depth_text = self.doc.createTextNode(depth_text_str)depth.appendChild(depth_text)size.appendChild(depth)self.anno.appendChild(size)def add_segmented(self, segmented_text_str="0"):segmented = self.doc.createElement('segmented')segmented_text = self.doc.createTextNode(segmented_text_str)segmented.appendChild(segmented_text)self.anno.appendChild(segmented)def add_object(self,name_text_str="None",xmin_text_str="0",ymin_text_str="0",xmax_text_str="0",ymax_text_str="0",pose_text_str="Unspecified",truncated_text_str="0",difficult_text_str="0"):object = self.doc.createElement('object')name = self.doc.createElement('name')name_text = self.doc.createTextNode(name_text_str)name.appendChild(name_text)object.appendChild(name)pose = self.doc.createElement('pose')pose_text = self.doc.createTextNode(pose_text_str)pose.appendChild(pose_text)object.appendChild(pose)truncated = self.doc.createElement('truncated')truncated_text = self.doc.createTextNode(truncated_text_str)truncated.appendChild(truncated_text)object.appendChild(truncated)difficult = self.doc.createElement('difficult')difficult_text = self.doc.createTextNode(difficult_text_str)difficult.appendChild(difficult_text)object.appendChild(difficult)bndbox = self.doc.createElement('bndbox')xmin = self.doc.createElement('xmin')xmin_text = self.doc.createTextNode(xmin_text_str)xmin.appendChild(xmin_text)bndbox.appendChild(xmin)ymin = self.doc.createElement('ymin')ymin_text = self.doc.createTextNode(ymin_text_str)ymin.appendChild(ymin_text)bndbox.appendChild(ymin)xmax = self.doc.createElement('xmax')xmax_text = self.doc.createTextNode(xmax_text_str)xmax.appendChild(xmax_text)bndbox.appendChild(xmax)ymax = self.doc.createElement('ymax')ymax_text = self.doc.createTextNode(ymax_text_str)ymax.appendChild(ymax_text)bndbox.appendChild(ymax)object.appendChild(bndbox)self.anno.appendChild(object)def get_anno(self):return self.annodef get_doc(self):return self.docdef save_doc(self, save_path):with open(save_path, "w") as f:self.doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')# 更改参数运行: json格式文件所在的文件夹,将要保存的xml文件夹,以及原数据的标注方式。
##### 3
import os
from tqdm import tqdm# from read_json_anno import ReadAnno
# from create_xml_anno import CreateAnnodef json_transform_xml(json_path, xml_path, process_mode="rectangle"):json_path = json_pathjson_anno = ReadAnno(json_path, process_mode=process_mode)width, height = json_anno.get_width_height()filename = json_anno.get_filename()coordis = json_anno.get_coordis()xml_anno = CreateAnno()xml_anno.add_filename(filename)xml_anno.add_pic_size(width_text_str=str(width), height_text_str=str(height), depth_text_str=str(3))for xmin,ymin,xmax,ymax,label in coordis:xml_anno.add_object(name_text_str=str(label),xmin_text_str=str(int(xmin)),ymin_text_str=str(int(ymin)),xmax_text_str=str(int(xmax)),ymax_text_str=str(int(ymax)))xml_anno.save_doc(xml_path)if __name__ == "__main__":root_json_dir = r"E:/002_GIT/labels_json/" root_save_xml_dir = r"E:/002_GIT/labels_xml/" for json_filename in tqdm(os.listdir(root_json_dir)):json_path = os.path.join(root_json_dir, json_filename)save_xml_path = os.path.join(root_save_xml_dir, json_filename.replace(".json", ".xml"))json_transform_xml(json_path, save_xml_path, process_mode="rectangle")
【labelme格式json转为labelimg格式的xml(VOC)】相关推荐
- 通过输入流获取json格式数据转为map格式
将通过输入流获取json格式数据转为map格式 转换代码: try {int length = 0;//通过输入流获取到json格式数据ServletInputStream inputStream = ...
- python输出jpg_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- pythoncsv格式_python实现csv格式文件转为asc格式文件的方法
一.背景描述 csv格式文件是一种类似于excel的文件格式 asc格式文件是一种可以用text打开的文本文件 csv转asc本来可以用arcgis顺利完成,但由于csv数据量太大(744万行),ar ...
- [ArcGIS].txt或.xlxs(Excel)格式如何转为.shp格式?
[ArcGIS].txt或.xlxs/Excel格式如何转为.shp格式? 写在前面 大神步骤 小白步骤 1.数据准备 2. 写在前面 .txt或.xlxs/Excel格式转为.shp格式步骤是一样的 ...
- python 读取csv文件转成字符串,python实现csv格式文件转为asc格式文件的方法
一.背景描述 csv格式文件是一种类似于excel的文件格式 asc格式文件是一种可以用text打开的文本文件 csv转asc本来可以用arcgis顺利完成,但由于csv数据量太大(744万行),ar ...
- ppt生成eps文件_如何将AI/EPS格式文件转为ppt格式
平时见到很多AI或EPS文件都想直接拿来放到PPT上,对于很多图片来说,只需转PNG就可以导入到PPT了,但对于一些图表,在导入PPT的时候还想要编辑下,这个时候就要用到下面的将AI/EPS格式文件转 ...
- python图片保存jpg、show变成bmp_利用python实现.dcm格式图像转为.jpg格式
如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...
- 用python将.dcm格式图像转为.jpg格式
用python将.dcm格式图像转为.jpg格式 import pydicom import matplotlib.pyplot as plt import scipy.misc import pan ...
最新文章
- 物联网帝国——孙正义职业生涯最大的豪赌
- 防止stack buffer overflows攻击的方法 : Canary 漏洞缓解机制
- 【题意分析】1042 Shuffling Machine (20 分)
- 最新最全产品删除页代码
- zw版【转发·台湾nvp系列Delphi例程】HALCON DispCross
- Applet实现Menu
- oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
- mysql 序列_MySql中序列的应用和总结
- linux pwm控制蜂鸣器 滴滴_51单片机PWM直流电机PID控制转速源程序
- 【华为云技术分享】《跟唐老师学习云网络》 - Kubernetes网络实现
- 超级计算机能算数学题吗,圆周率到底能不能算尽?人类拿超级计算机算了一下,结果不敢相信...
- php的curl封装类
- Handler+MessageQueue等操作
- 58、IPv6访问控制列表及ICMPv6简介
- mysql如何提高查询效率_MySQL调优系列——如何提高MySQL的查询效率
- Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
- 2014年4月底至5月初51Aspx源码发布详情
- usaco3.2.7香甜的奶油
- 【NOIP2012】国王游戏
- excel斜线表头的制作
热门文章
- 如何理解电容器容抗等效
- Disconnected: No supported authentication methods available(server sent: publickey) 的解决办法
- 凹凸贴图和法线贴图的区别
- 音视频+5G,远程医疗实时音视频解决方案
- 易知微当选中国互联网协会数字孪生技术应用工作委员会成员单位
- 一步一步实现中后台管理平台模板-13-解决IE浏览器兼容性问题
- 如何让你的本地上的项目不用部署到服务器也能让外网看到?使用ngrok内网穿透实现
- 海外主机是什么意思?与国内主机有什么区别?
- 上传图片校验图片类型、大小及尺寸
- 2021-03-13 java八大基本数据类型