• 标签转格式问题之——xml_2_txt.py


    1. import xml.etree.ElementTree as ET#xml 是python自带的package
    2. import os
    3. classes=['walnut']#写自己的分类名
    4. pre_dir='F:/2023walnut/labels'#xml文件所在文件夹
    5. target_dir='F:/2023walnut/yolo'#想要存储txt文件的文件夹
    6. path=os.listdir(pre_dir)
    7. for path1 in path:
    8. # path1=r'C:\Users\loadlicb\Desktop\chrome_RTJOXXsYHM.xml'#xml文件路径
    9. tree=ET.parse(os.path.join(pre_dir,path1))
    10. root=tree.getroot()#这两个步骤将xml文件拆出来了
    11. oo=[]
    12. for child in root:
    13. if child.tag == 'filename':#tag对应的是《》中的内容,text对应的是两个《》中间的部分内容
    14. oo.append(child.text)#获得xml文件的名
    15. # print(child.text)
    16. for i in child:
    17. if i.tag == 'width':#获得图片的w
    18. oo.append(i.text)
    19. # print(i.text)
    20. if i.tag == 'height':#获得图片的h
    21. oo.append(i.text)
    22. # print(i.text)
    23. if i.tag == 'name':#获得当前框的class
    24. oo.append(i.text)
    25. # print(i.text)
    26. for j in i:
    27. if j.tag == 'xmin':#获得当前框的两个对角线上的点的两组坐标
    28. oo.append(j.text)
    29. # print(j.text)
    30. if j.tag == 'ymin':
    31. oo.append(j.text)
    32. # print(j.text)
    33. if j.tag == 'xmax':
    34. oo.append(j.text)
    35. # print(j.text)
    36. if j.tag == 'ymax':
    37. oo.append(j.text)
    38. # print(j.text)
    39. print(oo)
    40. filename=oo[0]#读取图片的名和宽高
    41. filename=os.path.split(filename)
    42. # print(filename)
    43. name,extension=os.path.splitext(filename[1])#获取xml名和后缀
    44. width=oo[1]
    45. dw=1/int(width)
    46. height=oo[2]
    47. dh=1/int(height)
    48. oo.pop(0)
    49. oo.pop(0)
    50. oo.pop(0)#删除三次oolist的0号元素
    51. back=[]
    52. # print((len(oo))%5)
    53. for i in range(len(oo)//5):
    54. for p in range(len(classes)):#划定class的序号
    55. if classes[p] == oo[5*i]:#str == str
    56. cl=p
    57. back.append(cl)
    58. x=(int(oo[5*i+1])+int(oo[5*i+3]))/2#oo里的所有元素都是str,数字也是
    59. y = (int(oo[5 * i + 2]) + int(oo[5 * i + 4])) / 2#计算标注框的中心点的xy坐标
    60. w=int(oo[5*i+3])-int(oo[5*i+1])
    61. h=int(oo[5*i+4])-int(oo[5*i+2])#计算标注框的宽高
    62. back.append('{:.4f}'.format(x*dw))
    63. back.append('{:.4f}'.format(y * dh))
    64. back.append('{:.4f}'.format(w * dw))
    65. back.append('{:.4f}'.format(h * dh))
    66. # back.append(y*dh)
    67. # back.append(w*dw)
    68. # back.append(h*dh)#转换到0-1区间
    69. print(back)
    70. # dir=r'C:\Users\loadlicb\Desktop'#label文件夹名
    71. file=open(os.path.join(target_dir,name+'.txt'),'w')
    72. for i in range(len(back)):
    73. l=' '
    74. if (i+1)%5==0:
    75. l='\n'
    76. file.writelines(str(back[i])+l)#完成了,现在进行批量操作修改
    77. #完成

    这个脚本中只需要修改三处地方:

    classes=['walnut']#写自己的分类名

    pre_dir='F:/2023walnut/labels'#xml文件所在文件夹

    target_dir='F:/2023walnut/yolo'#想要存储txt文件的文件夹


    ——————————————今天不学习,明天变垃圾!—————————————

  • 相关阅读:
    东北大学acm暑期夏令营指针与引用初步
    Linux网路服务之DNS域名解析
    Matalab插值详解和源码
    RocketMQ第三话 -- RocketMQ高可用集群搭建
    新版WordPress系统文章自动采集插件/Auto Post pro完美运行版/多线程采集(wp自动采集)
    第三章:Qt Creator 之 3.3 新建项目
    C++项目开发编译踩坑记录
    第1天学习ros+安装步骤
    光伏储能直流系统MATLAB仿真(PV光伏阵列+Boost DCDC变换器+负载+双向DCDC变换器+锂离子电池系统)
    这3种思维方式,能让你的事业更上一层楼
  • 原文地址:https://blog.csdn.net/Cr_NanMao/article/details/136434875