文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Yolov5数据集标签的txt格式与xml相互转换

2023-08-31 21:04

关注

在使用yolov5制作数据集时,yolov5使用txt格式的标签,打标签的工具如labelimg使用的是xml格式的标签,需要进行数据集格式的转换:

yolov5保存检测结果的txt标签 python3.8 detect.py --weights '/homeimages'# txt文件夹,后面的/不能省labels_path = '/home'# xml存放的文件夹,后面的/不能省annotations_path = '/home'labels = os.listdir(labels_path)# 类别classes = ["**"]  #类别名# 图片的高度、宽度、深度sh = sw = sd = 0def write_xml(imgname, sw, sh, sd, filepath, labeldicts):    '''    imgname: 没有扩展名的图片名称    '''    # 创建Annotation根节点    root = ET.Element('Annotation')    # 创建filename子节点,无扩展名                     ET.SubElement(root, 'filename').text = str(imgname)            # 创建size子节点     sizes = ET.SubElement(root,'size')              ET.SubElement(sizes, 'width').text = str(sw)    ET.SubElement(sizes, 'height').text = str(sh)    ET.SubElement(sizes, 'depth').text = str(sd)     for labeldict in labeldicts:        objects = ET.SubElement(root, 'object')                         ET.SubElement(objects, 'name').text = labeldict['name']        ET.SubElement(objects, 'pose').text = 'Unspecified'        ET.SubElement(objects, 'truncated').text = '0'        ET.SubElement(objects, 'difficult').text = '0'        bndbox = ET.SubElement(objects,'bndbox')        ET.SubElement(bndbox, 'xmin').text = str(int(labeldict['xmin']))        ET.SubElement(bndbox, 'ymin').text = str(int(labeldict['ymin']))        ET.SubElement(bndbox, 'xmax').text = str(int(labeldict['xmax']))        ET.SubElement(bndbox, 'ymax').text = str(int(labeldict['ymax']))    tree = ET.ElementTree(root)    tree.write(filepath, encoding='utf-8')for label in labels:    with open(labels_path + label, 'r') as f:        img_id = os.path.splitext(label)[0]        contents = f.readlines()        labeldicts = []        for content in contents:            # !!!这里要看你的图片格式了,我这里是png,注意修改            img = np.array(Image.open(img_path + label.strip('.txt') + '.png'))            # 图片的高度和宽度            sh, sw, sd = img.shape[0], img.shape[1], img.shape[2]            content = content.strip('\n').split()            x = float(content[1])*sw            y = float(content[2])*sh            w = float(content[3])*sw            h = float(content[4])*sh            # 坐标的转换,x_center y_center width height -> xmin ymin xmax ymax            new_dict = {'name': classes[int(content[0])],                        'difficult': '0',                        'xmin': x+1-w/2,                 'ymin': y+1-h/2,                        'xmax': x+1+w/2,                        'ymax': y+1+h/2                        }            labeldicts.append(new_dict)        write_xml(img_id, sw, sh, sd, annotations_path + label.strip('.txt') + '.xml', labeldicts)#[转载链接](https://zhuanlan.zhihu.com/p/383660741)
  1. xml格式的数据集标签转为txt格式
import osimport xml.etree.ElementTree as ETfrom decimal import Decimal dirpath = '/home'  # 修改label后形成的txt目录 if not os.path.exists(newdir):    os.makedirs(newdir) for fp in os.listdir(dirpath):     root = ET.parse(os.path.join(dirpath, fp)).getroot()     xmin, ymin, xmax, ymax = 0, 0, 0, 0    sz = root.find('size')    width = float(sz[0].text)    height = float(sz[1].text)    filename = root.find('filename').text    print(fp)    with open(os.path.join(newdir, fp.split('.')[0] + '.txt'), 'a+') as f:        for child in root.findall('object'):  # 找到图片中的所有框             sub = child.find('bndbox')  # 找到框的标注值并进行读取            sub_label = child.find('name')            xmin = float(sub[0].text)            ymin = float(sub[1].text)            xmax = float(sub[2].text)            ymax = float(sub[3].text)            try:  # 转换成yolov的标签格式,需要归一化到(0-1)的范围内                x_center = Decimal(str(round(float((xmin + xmax) / (2 * width)),6))).quantize(Decimal('0.000000'))                y_center = Decimal(str(round(float((ymin + ymax) / (2 * height)),6))).quantize(Decimal('0.000000'))                w = Decimal(str(round(float((xmax - xmin) / width),6))).quantize(Decimal('0.000000'))                h = Decimal(str(round(float((ymax - ymin) / height),6))).quantize(Decimal('0.000000'))                print(str(x_center) + ' ' + str(y_center)+ ' '+str(w)+ ' '+str(h))                #读取需要的标签                #if sub_label.text == 'armor':                f.write(' '.join([str(0), str(x_center), str(y_center), str(w), str(h) + '\n']))            except ZeroDivisionError:                print(' width有问题')            '''有其他标签选用if sub_label.text == 'xxx':    f.write(' '.join([str(1), str(x_center), str(y_center), str(w), str(h) + '\n']))if sub_label.text == 'xxx':    f.write(' '.join([str(2), str(x_center), str(y_center), str(w), str(h) + '\n']))'''            # with open(os.path.join(newdir, fp.split('.')[0] + '.txt'), 'a+') as f:            #     f.write(' '.join([str(2), str(x_center), str(y_center), str(w), str(h) + '\n']))

来源地址:https://blog.csdn.net/BZ_PP/article/details/130081186

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯