@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)】相关推荐

  1. 通过输入流获取json格式数据转为map格式

    将通过输入流获取json格式数据转为map格式 转换代码: try {int length = 0;//通过输入流获取到json格式数据ServletInputStream inputStream = ...

  2. python输出jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  3. python bmp转jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  4. pythoncsv格式_python实现csv格式文件转为asc格式文件的方法

    一.背景描述 csv格式文件是一种类似于excel的文件格式 asc格式文件是一种可以用text打开的文本文件 csv转asc本来可以用arcgis顺利完成,但由于csv数据量太大(744万行),ar ...

  5. [ArcGIS].txt或.xlxs(Excel)格式如何转为.shp格式?

    [ArcGIS].txt或.xlxs/Excel格式如何转为.shp格式? 写在前面 大神步骤 小白步骤 1.数据准备 2. 写在前面 .txt或.xlxs/Excel格式转为.shp格式步骤是一样的 ...

  6. python 读取csv文件转成字符串,python实现csv格式文件转为asc格式文件的方法

    一.背景描述 csv格式文件是一种类似于excel的文件格式 asc格式文件是一种可以用text打开的文本文件 csv转asc本来可以用arcgis顺利完成,但由于csv数据量太大(744万行),ar ...

  7. ppt生成eps文件_如何将AI/EPS格式文件转为ppt格式

    平时见到很多AI或EPS文件都想直接拿来放到PPT上,对于很多图片来说,只需转PNG就可以导入到PPT了,但对于一些图表,在导入PPT的时候还想要编辑下,这个时候就要用到下面的将AI/EPS格式文件转 ...

  8. python图片保存jpg、show变成bmp_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

  9. 用python将.dcm格式图像转为.jpg格式

    用python将.dcm格式图像转为.jpg格式 import pydicom import matplotlib.pyplot as plt import scipy.misc import pan ...

最新文章

  1. 物联网帝国——孙正义职业生涯最大的豪赌
  2. 防止stack buffer overflows攻击的方法 : Canary 漏洞缓解机制
  3. 【题意分析】1042 Shuffling Machine (20 分)
  4. 最新最全产品删除页代码
  5. zw版【转发·台湾nvp系列Delphi例程】HALCON DispCross
  6. Applet实现Menu
  7. oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(一)
  8. mysql 序列_MySql中序列的应用和总结
  9. linux pwm控制蜂鸣器 滴滴_51单片机PWM直流电机PID控制转速源程序
  10. 【华为云技术分享】《跟唐老师学习云网络》 - Kubernetes网络实现
  11. 超级计算机能算数学题吗,圆周率到底能不能算尽?人类拿超级计算机算了一下,结果不敢相信...
  12. php的curl封装类
  13. Handler+MessageQueue等操作
  14. 58、IPv6访问控制列表及ICMPv6简介
  15. mysql如何提高查询效率_MySQL调优系列——如何提高MySQL的查询效率
  16. Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
  17. 2014年4月底至5月初51Aspx源码发布详情
  18. usaco3.2.7香甜的奶油
  19. 【NOIP2012】国王游戏
  20. excel斜线表头的制作

热门文章

  1. 如何理解电容器容抗等效
  2. Disconnected: No supported authentication methods available(server sent: publickey) 的解决办法
  3. 凹凸贴图和法线贴图的区别
  4. 音视频+5G,远程医疗实时音视频解决方案
  5. 易知微当选中国互联网协会数字孪生技术应用工作委员会成员单位
  6. 一步一步实现中后台管理平台模板-13-解决IE浏览器兼容性问题
  7. 如何让你的本地上的项目不用部署到服务器也能让外网看到?使用ngrok内网穿透实现
  8. 海外主机是什么意思?与国内主机有什么区别?
  9. 上传图片校验图片类型、大小及尺寸
  10. 2021-03-13 java八大基本数据类型