栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Labelme标记json文件转voc的xml格式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Labelme标记json文件转voc的xml格式

Labelme标记json文件转voc的xml格式

使用Lablme标记的数据生成的是json文件,但是我们常用的xml格式的,更加直观方便,转yolo也是轻而易举

json 文件格式如下

我们常见的xml格式(以voc 中xml文件为例)

同时 我们也可以顺带将数据整理成VOC的排版格式

转换代码

'''
将json文件转为类似voc中的xml格式
'''

import os
import numpy as np
import codecs
import json
from glob import glob
import cv2
import shutil
from sklearn.model_selection import train_test_split

# 1.原始labelme标注数据路径
labelme_path = "ECM/Json/"
# 保存路径
saved_path = "VOC2007/"

isUseTest=True#是否创建test集
# 2.创建要求文件夹
if not os.path.exists(saved_path + "Annotations"):
    os.makedirs(saved_path + "Annotations")
if not os.path.exists(saved_path + "JPEGImages/"):
    os.makedirs(saved_path + "JPEGImages/")
if not os.path.exists(saved_path + "ImageSets/Main/"):
    os.makedirs(saved_path + "ImageSets/Main/")
# 3.获取待处理文件
files = glob(labelme_path + "*.json")
## windows路径
files = [i.replace("\","/").split("/")[-1].split(".json")[0] for i in files]
print(files)
# 4.读取标注信息并写入 xml
for json_file_ in files:
    json_filename = labelme_path + json_file_ + ".json"
    json_file = json.load(open(json_filename, "r", encoding="utf-8"))
    height, width, channels = cv2.imread('ECM/Images/' + json_file_ + ".jpg").shape
    with codecs.open(saved_path + "Annotations/" + json_file_ + ".xml", "w", "utf-8") as xml:

        xml.write('n')
        xml.write('t' + 'ECM' + 'n')
        xml.write('t' + json_file_ + ".jpg" + 'n')
        xml.write('tn')
        xml.write('ttECM_Datan')
        xml.write('ttECMn')
        xml.write('ttflickrn')
        xml.write('ttNULLn')
        xml.write('tn')
        xml.write('tn')
        xml.write('ttNULLn')
        xml.write('ttXTn')
        xml.write('tn')
        xml.write('tn')
        xml.write('tt' + str(width) + 'n')
        xml.write('tt' + str(height) + 'n')
        xml.write('tt' + str(channels) + 'n')
        xml.write('tn')
        xml.write('tt0n')
        for multi in json_file["shapes"]:
            points = np.array(multi["points"])
            labelName=multi["label"]
            xmin = min(points[:, 0])
            xmax = max(points[:, 0])
            ymin = min(points[:, 1])
            ymax = max(points[:, 1])
            label = multi["label"]
            if xmax <= xmin:
                pass
            elif ymax <= ymin:
                pass
            else:
                xml.write('tn')
                xml.write('tt' + labelName+ 'n')
                xml.write('ttUnspecifiedn')
                xml.write('tt1n')
                xml.write('tt0n')
                xml.write('ttn')
                xml.write('ttt' + str(int(xmin)) + 'n')
                xml.write('ttt' + str(int(ymin)) + 'n')
                xml.write('ttt' + str(int(xmax)) + 'n')
                xml.write('ttt' + str(int(ymax)) + 'n')
                xml.write('ttn')
                xml.write('tn')
                print(json_filename, xmin, ymin, xmax, ymax, label)
        xml.write('')
# 5.复制图片到 VOC2007/JPEGImages/下

# 自己的图片路径
image_files = glob("ECM/Images/" + "*.jpg")
print("copy image files to VOC007/JPEGImages/")
for image in image_files:
    shutil.copy(image, saved_path + "JPEGImages/")
# 6.split files for txt
txtsavepath = saved_path + "ImageSets/Main/"
ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')
total_files = glob("./VOC2007/Annotations/*.xml")
total_files = [i.replace("\","/").split("/")[-1].split(".xml")[0] for i in total_files]
trainval_files=[]
test_files=[]
if isUseTest:
    trainval_files, test_files = train_test_split(total_files, test_size=0.2, random_state=42)
else:
    trainval_files=total_files
for file in trainval_files:
    ftrainval.write(file + "n")
# split
train_files, val_files = train_test_split(trainval_files, test_size=0.15, random_state=55)
# train
for file in train_files:
    ftrain.write(file + "n")
# val
for file in val_files:
    fval.write(file + "n")
for file in test_files:
    print(file)
    ftest.write(file + "n")
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

检测是否成功

1、打开labelimg软件

2、Open Dir,选择标注文件所在文件夹Annatations

3、Change Save Dir,选择图片所在文件夹JPEGImages

下一篇再写xml装yolo

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号