这里的标注文件为点标注文件
每次要用数据处理脚本的时候都忘记放哪里了,然后重写了一遍又一遍,虽然代码不长,但是每次都有重新写还是很麻烦,这次深深的记录一下,最扎心的事莫过于刚写完的代码不小心删了。。。
from xml.dom.minidom import parse
import os
#将xml格式的点标注文件转换为txt格式
# (可以一个xml文件里面包含所有的图片标注信息,也可以一个xml对应1张图片的标签信息)
#将每一个xml文件转换为txt格式:(x,y)
def convert_annotation(xmlfilepath,txtpath):
in_file = open(xmlfilepath, encoding='utf-8')
tree = parse(in_file)
root = tree.documentElement
# 获取所有images
images = root.getElementsByTagName("image")
for image in images:
imgname = image.getAttribute("name").split(".")[0]
out_file = open(txtpath+"\"+'%s.txt' % (imgname), 'a', encoding='utf-8') # 生成txt格式文件
points = image.getElementsByTagName("points")
for point in points:
if point.hasAttribute("points"):
point = str(point.getAttribute("points"))
x = point.split(",")[0]
y = point.split(",")[1]
out_file.write(x+" "+y+ 'n')
out_file.close()
if __name__ == '__main__':
#xml文件夹
xmlpath = r'C:UsersOwenDesktopxml'
#txt文件夹
txtpath = r'C:UsersOwenDesktoptxt'
#读取xml文件夹下的所有xml文件
filelist = os.listdir(xmlpath)
for files in filelist:
#获取每一个xml文件名
xmlfilepath = xmlpath+ "\"+files
#将每一个xml文件转换为txt
convert_annotation(xmlfilepath,txtpath)
二、txt—csv
import csv
import os
#将txt文件转换为csv文件
if __name__ == '__main__':
#txt文件夹的路径
txtpath = r'C:UsersOwenDesktoptxt'
#获取所有的txt文件
filetxts = os.listdir(txtpath)
for filetxt in filetxts:
if filetxt.split(".")[1]!="txt":
continue
csvFile = open(txtpath+"\"+filetxt.split(".")[0]+".csv",'w',newline='',encoding='utf-8') # 固定格式
writer = csv.writer(csvFile)
f = open(txtpath+"\"+filetxt,"r")
for line in f.readlines():
line = line.strip()
writer.writerow([float(line.split(' ')[0]),float(line.split(' ')[1])])
csvFile.close()
常见的点标注文件为.mat格式,通常用:
data = scio.loadmat(mat_filename)#读出来的是字典
转成字典后进行处理,如果我们没有mat文件,可用直接读取csv文件,并创建字典格式:
data = np.loadtxt(csv_filename,delimiter=',')
datamat = {'annPoints':data}
注意:如果直接用txt文件进行读取,会报错
data = np.loadtxt(txt_filename,delimiter=','),
因为坐标都是str格式的,所以要转为csv格式。



