1、简介
前一节是对HMDB数据视频处理为帧
此章节:将使用labelIM软件对图片进行标注生成的xml文件转成对应的txt文件
2、代码解讲
xml转为txt文件:
在"E:/dataSet/meng_data/DATA/xml"文件夹下皆为xml文件,此处改为自己的文件夹即可
import os
import numpy as np
from xml.etree.ElementTree import ElementTree
# 将labelIMG标注的图片转换为txt文件
class Xml2txt:
def __init__(self, path):
self.path = path
def convert2Txt(self):
file_path = self.path
tree = ElementTree()
tree.parse(file_path)
root = tree.getroot()
for obj in root.iter('object'):
xmlbox = obj.find('bndbox')
# print(xmlbox[0])
b = [int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),
int(xmlbox.find('ymax').text)]
return b
if __name__ == "__main__":
folder = "E:/dataSet/meng_data/DATA/xml"
# 遍历文件夹中的所有xml文件
for root, dirs, files in os.walk(folder):
for f in files:
file_name, _ = f.split('.')
file_path = os.path.join(folder, f)
# print(file_path)
xml = Xml2txt(file_path)
box = xml.convert2Txt()
# 此处可以自己设置加一些属性,例如类别之类的
box.insert(0, 1)
box = [box]
np.savetxt(folder + "/" + "{}.txt".format(file_name), box, fmt="%d", delimiter=" ")
结果如下:保存的是[class, xmin,ymin, xmax, ymax]
3、完整代码
import os
import numpy as np
import shutil
from xml.etree.ElementTree import ElementTree
# 将labelIMG标注的图片转换为txt文件
class Xml2txt:
def __init__(self, path):
self.path = path
def convert2Txt(self):
file_path = self.path
tree = ElementTree()
tree.parse(file_path)
root = tree.getroot()
for obj in root.iter('object'):
xmlbox = obj.find('bndbox')
# print(xmlbox[0])
b = [int(xmlbox.find('xmin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymin').text),
int(xmlbox.find('ymax').text)]
return b
if __name__ == "__main__":
# folder = "E:/dataSet/meng_data/DATA/xml"
# # 遍历文件夹中的所有xml文件
# for root, dirs, files in os.walk(folder):
# for f in files:
# file_name, _ = f.split('.')
# file_path = os.path.join(folder, f)
# # print(file_path)
# xml = Xml2txt(file_path)
# box = xml.convert2Txt()
# box.insert(0, 1)
# box = [box]
# np.savetxt(folder + "/" + "{}.txt".format(file_name), box, fmt="%d", delimiter=" ")
# 定义原始图片和XML文件的路径
origin_root_path = "E:/dataSet/meng_data/YOWO-DATA"
origin_img_path = "train_imgs"
origin_xml_path = "train_labels"
# 定义图片和标签将要保存的根路径
dst_root_path = "E:/dataSet/meng_data/DATA"
# 定义图片保存的txt文件路径
dst_img_path = "imgs"
# 定义标签保存的路径
dst_label_path = "labels"
# 定义标签索引保存的路径
train_list = ""
test_list = ""
label_name = os.listdir(os.path.join(origin_root_path, origin_img_path))
# print(label_name)
index = 1
for i in label_name:
if i.startswith('.'):
continue
sub_folders = os.path.join(origin_root_path, origin_img_path, i)
# 创建动作类型文件
dst_sub_img = os.path.join(dst_root_path, dst_img_path, i)
dst_sub_label = os.path.join(dst_root_path, dst_label_path, i)
if not os.path.exists(dst_sub_img):
os.mkdir(dst_sub_img)
if not os.path.exists(dst_sub_label):
os.mkdir(dst_sub_label)
# print(sub_folder)
list_sub_folder = os.listdir(sub_folders)
# print(list_sub_folder)
for sub_folder in list_sub_folder:
folder = os.path.join(sub_folders, sub_folder)
# 创建目标动作类型子文件
dst_sub_img_folder = os.path.join(dst_sub_img, sub_folder)
dst_sub_label_folder = os.path.join(dst_sub_label, sub_folder)
if not os.path.exists(dst_sub_img_folder):
os.mkdir(dst_sub_img_folder)
if not os.path.exists(dst_sub_label_folder):
os.mkdir(dst_sub_label_folder)
# print(folder)
# 遍历文件夹中的所有文件
for root, dirs, files in os.walk(folder):
for f in files:
file_path = os.path.join(folder, f)
if f.endswith('.jpg'):
# cv2.imwrite(dst_sub_img_folder + "/" + f, f)
shutil.copyfile(file_path, dst_sub_img_folder+"/"+f)
if f.endswith('.xml'):
file_name, _ = f.split('.')
xml = Xml2txt(file_path)
box = xml.convert2Txt()
box.insert(0, index)
box = [box]
np.savetxt(dst_sub_label_folder + "/" + "{}.txt".format(file_name), box, fmt="%d", delimiter=" ")
index += 1
完成之后的样子:全部生成txt格式的文件