【MBJC】(labelimg)txt转换xml,xml转换txt,txt修改标签名称,xml修改标签名称,python脚本(VOC-yolo)

这篇具有很好参考价值的文章主要介绍了【MBJC】(labelimg)txt转换xml,xml转换txt,txt修改标签名称,xml修改标签名称,python脚本(VOC-yolo)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

xml_txt_mutual_conversion

VOC Yolo tag modification conversion script

Github:

链接: https://github.com/Samsara0Null/xml_txt_mutual_conversion

CSDN主页:

链接: https://blog.csdn.net/noneNull0?type=blog

Bilibili视频演示讲解:

链接: https://www.bilibili.com/video/BV1ie4y1D77dvd_source=a6067b731745325c01a4edfa46bf5a04

umm,评论区有提出在使用txt_xml.py时,标签为字符类型,会报类似ValueError: could not convert string ‘A’ to float64 at row 0, column 1.
雀氏有道理,简单修改了一下,作为补充,用法同之前,修改路径,应该可以直接用,有相关需求可以尝试一下

链接: https://wwin.lanzoue.com/i12Yt0pj83fg

这是一些帮助转换txt和xml格式标签文件格式和修改标签名称的脚本(适用于VOC-yolo项目格式的标签)

可能需要安装一些依赖,配置好环境(跟着MoudleNotFound报错走就好了)

我的环境:

  • VSCode+Anaconda

  • python==3.6.13

  • pillow==8.3.1

  • opencv-python==4.6.0.66

  • numpy==1.19.5

  • lxml==3.8.0

演示样本:

MBJC,XML,TXT,VOC-YOLO,标签转换
MBJC,XML,TXT,VOC-YOLO,标签转换

txt_change_label.py

# 项目名称:DI_QueXianShiJueJianCe
# 程序内容:修改txt标签名称
# 作   者:MBJC# 开发时间:2022/7/26 11:10import osimport re
# 路径
path = './txt/'# 文件列表
files = []for file in os.listdir(path):
    if file.endswith(".txt"):
        files.append(path+file)# 逐文件读取-修改-重写for file in files:
    with open(file, 'r') as f:
        new_data = re.sub('^0', 'car', f.read(), flags=re.MULTILINE)  # 将列中的0替换为car    with open(file, 'w') as f:
        f.write(new_data)
    with open(file, 'r') as f:
        new_data = re.sub('^1', 'horse', f.read(), flags=re.MULTILINE)  # 将列中的1替换为horse    with open(file, 'w') as f:
        f.write(new_data)
    with open(file, 'r') as f:
        new_data = re.sub('^2', 'chair', f.read(), flags=re.MULTILINE)  # 将列中的2替换为chair    with open(file, 'w') as f:
        f.write(new_data)
    with open(file, 'r') as f:
        new_data = re.sub('^3', 'bicycle', f.read(), flags=re.MULTILINE)  # 将列中的3替换为bicycle    with open(file, 'w') as f:
        f.write(new_data)


  • 代码作用:修改txt标签名称

  • 1、修改存放txt标签文件的文件夹路径
    这里用了相对脚本的路径

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 2、依葫芦画瓢修改想要的修改前和修改后标签名称

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 3、运行 txt_change_label.py

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 4、结果展示

运行前:

MBJC,XML,TXT,VOC-YOLO,标签转换

运行后:

MBJC,XML,TXT,VOC-YOLO,标签转换

txt_xml.py

# 项目名称:xml_txt_mutual_conversion
# 程序内容:jpg,txt转换xml
# 作   者:MBJC# 开发时间:2022/8/1 9:59import timeimport osfrom PIL import Imageimport cv2import numpy as np'''人为构造xml文件的格式'''out0 = '''<annotation>
    <folder>%(folder)s</folder>
    <filename>%(name)s</filename>
    <path>%(path)s</path>
    <source>
        <database>None</database>
    </source>
    <size>
        <width>%(width)d</width>
        <height>%(height)d</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>'''
out1 = '''    <object>
        <name>%(class)s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%(xmin)d</xmin>
            <ymin>%(ymin)d</ymin>
            <xmax>%(xmax)d</xmax>
            <ymax>%(ymax)d</ymax>
        </bndbox>
    </object>'''

out2 = '''</annotation>''''''txt转xml函数'''def translate(fdir, lists):
    source = {}
    label = {}
    for jpg in lists:
        print(jpg)
        if jpg[-4:] == '.jpg':
            image = cv2.imread(jpg)  # 路径不能有中文
            h, w, _ = image.shape  # 图片大小
            #            cv2.imshow('1',image)
            #            cv2.waitKey(1000)
            #            cv2.destroyAllWindows()

            fxml = jpg.replace('.jpg', '.xml')
            fxml = open(fxml, 'w')
            imgfile = jpg.split('/')[-1]
            source['name'] = imgfile
            source['path'] = jpg
            source['folder'] = os.path.basename(fdir)

            source['width'] = w
            source['height'] = h

            fxml.write(out0 % source)
            txt = jpg.replace('.jpg', '.txt')

            lines = np.loadtxt(txt)  # 读入txt存为数组
            # print(type(lines))

            for box in lines:
                # print(box.shape)
                if box.shape != (5,):
                    box = lines                '''把txt上的第一列(类别)转成xml上的类别
                   我这里是labelimg标1、2、3,对应txt上面的0、1、2'''
                label['class'] = str(int(box[0]) + 1)  # 类别索引从1开始                '''把txt上的数字(归一化)转成xml上框的坐标'''
                xmin = float(box[1] - 0.5 * box[3]) * w
                ymin = float(box[2] - 0.5 * box[4]) * h
                xmax = float(xmin + box[3] * w)
                ymax = float(ymin + box[4] * h)

                label['xmin'] = xmin
                label['ymin'] = ymin
                label['xmax'] = xmax
                label['ymax'] = ymax

                # if label['xmin']>=w or label['ymin']>=h or label['xmax']>=w or label['ymax']>=h:
                #     continue
                # if label['xmin']<0 or label['ymin']<0 or label['xmax']<0 or label['ymax']<0:
                #     continue

                fxml.write(out1 % label)
            fxml.write(out2)if __name__ == '__main__':
    file_dir = 'E:/CSDN/xml_txt_mutual_conversion/jpg_txt' #修改目标文件夹路径
    lists = []
    for i in os.listdir(file_dir):
        if i[-3:] == 'jpg':
            lists.append(file_dir + '/' + i)
            # print(lists)
    translate(file_dir, lists)
    print('---------------Done!!!--------------')


  • 代码作用:txt标签格式和对应jpg图片转换xml标签格式

  • 1、txt和对应jpg放在同一文件夹内

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 2、修改目标文件夹路径

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 3、运行txt_xml.py

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 4、结果展示

运行前:

MBJC,XML,TXT,VOC-YOLO,标签转换

运行后:

MBJC,XML,TXT,VOC-YOLO,标签转换

可在labelimg中打开(注意txt中的标签0会变成xml中的标签1)

MBJC,XML,TXT,VOC-YOLO,标签转换

MBJC,XML,TXT,VOC-YOLO,标签转换

在文件夹中搜索xml即可得到文件

MBJC,XML,TXT,VOC-YOLO,标签转换

xml_change_label.py

# 项目名称:DI_QueXianShiJueJianCe
# 程序内容:修改xml标签名
# 作   者:MBJC# 开发时间:2022/7/10 8:30"""
批量修改xml文件中的缺陷类别名称
当有多个物体时,多个物体的名称均能被修改"""

from lxml.etree import Element, SubElement, tostring, ElementTree
from xml.dom import minidomimport xml.etree.ElementTree as ETimport os
# 修改自己的路径
template_file = r'E:\CSDN\xml_txt_mutual_conversion\xml'  #这里是存放xml文件的文件夹
xmllist = os.listdir(template_file)for xml in xmllist:
    #print(xml)
    tree = ET.parse(os.path.join(template_file,xml))
    root = tree.getroot() # 获取根节点    for child in root:
        print(child.tag,child.attrib)
        if child.tag == 'object':
            name=child.find('name').text
            # print(name)
            if name == '1':
                child.find('name').text = 'car'
                tree=ET.ElementTree(root)
            elif name == '2':
                child.find('name').text = 'horse'
                tree = ET.ElementTree(root)
            elif name == '3':
                child.find('name').text = 'chair'
                tree = ET.ElementTree(root)
            elif name == '4':
                child.find('name').text = 'bicycle'
                tree = ET.ElementTree(root)
    tree.write(os.path.join(template_file,xml))


  • 代码作用:修改xml标签名称

  • 1、修改存放xml标签文件的文件夹路径

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 2、修改自己想要修改的标签,例:1->car,标签数不同删减或增加elif语句即可

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 3、运行xml_change_label.py

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 4、结果展示

运行前:

MBJC,XML,TXT,VOC-YOLO,标签转换

运行后:

MBJC,XML,TXT,VOC-YOLO,标签转换

xml_txt.py

# 项目名称:xml_txt_mutual_conversion
# 程序内容:xml转txt
# 作   者:MBJC# 开发时间:2022/8/1 11:29import xml.etree.ElementTree as ETimport os
from os import getcwdimport glob

# 1.# 自己创建文件夹,例如:label_mal label_txt  也可以修改别的
image_set = 'xml'  # 需要转换的文件夹名称(文件夹内放xml标签文件)
imageset2 = 'txt'  # 保存txt的文件夹
# 2.# 换成你的类别 当前的顺序,就txt 0,1,2,3 四个类别
classes = ['car', 'horse', 'chair', 'bicycle']  # 标注时的标签 注意顺序一定不要错。

# 3.# # 转换文件夹的绝对路径
# data_dir = 'D:/detectAuto_/data'# 或者 读取当前路径
data_dir = getcwd()  # 当前路径'''xml中框的左上角坐标和右下角坐标(x1,y1,x2,y2)》》txt中的中心点坐标和宽和高(x,y,w,h),并且归一化'''


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh    return (x, y, w, h)def convert_annotation(data_dir, imageset1, imageset2, image_id):
    in_file = open(data_dir + '/%s/%s.xml' % (imageset1, image_id))  # 读取xml
    out_file = open(data_dir + '/%s/%s.txt' % (imageset2, image_id), 'w')  # 保存txt

    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)  # 获取类别索引
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str('%.6f' % a) for a in bb]) + '\n')image_ids = []for x in glob.glob(data_dir + '/%s' % image_set + '/*.xml'):
    image_ids.append(os.path.basename(x)[:-4])print('\n%s数量:' % image_set, len(image_ids))  # 确认数量
i = 0for image_id in image_ids:
    i = i + 1
    convert_annotation(data_dir, image_set, imageset2, image_id)
    print("%s 数据:%s/%s文件完成!" % (image_set, i, len(image_ids)))print("Done!!!")


  • 代码作用:xml标签格式转换txt标签格式

  • 1、修改待修改xml文件夹和目标txt文件夹路径

温馨提示:注意,如果读取当前路径的话,前两个路径要修改成相对路径

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 2、换成待转换xml标签名称所想排顺序的名称序列

MBJC,XML,TXT,VOC-YOLO,标签转换

  • 3、运行xml_txt.py

MBJC,XML,TXT,VOC-YOLO,标签转换

4、结果展示

运行前:

MBJC,XML,TXT,VOC-YOLO,标签转换

运行后:

MBJC,XML,TXT,VOC-YOLO,标签转换

Author: MBJC
Last modification time: 2022/8/2 19:48文章来源地址https://www.toymoban.com/news/detail-772448.html

到了这里,关于【MBJC】(labelimg)txt转换xml,xml转换txt,txt修改标签名称,xml修改标签名称,python脚本(VOC-yolo)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包