博主最近在做遥感图像的目标检测领域,在发现NWPU的数据集后,发现标注的内容可以进行转化为VOC格式的数据,故如此解决。如果是其他类型的txt文件,也可以参考我的代码进行改进转化为VOC2007格式。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : changeTxt.py
@Version : 1.0
@Author : 2014Vee
@Contact : 3363663448@qq.com
@License : (C)Copyright 2014Vee From UESTC
@Modify Time : 2020/3/15 22:29
@Desciption : 生成固定格式的label数据,
按照https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/master/data/custom/labels/train.txt要求
'''
# 生成txt文件格式:class_num x_center y_center weight height
import xml.etree.ElementTree as ET
import os
import cv2
xml_path = 'F:/BaiduYunDownload/faceData/train_xml/'
pic_path = 'F:/BaiduYunDownload/faceData/train/'
save_path = './labels/'
piclist = os.listdir(xml_path)
for xml in piclist:
print(xml)
tree = ET.parse( xml_path + xml)
rect={}
line=""
root = tree.getroot()
with open(save_path + xml[:-4] + '.txt', 'w', encoding='utf-8') as f1:
# 路径信息
for name in root.iter('path'):
rect['path'] = name.text
# 因为有的xml文件没有宽高字段信息所以直接读取jpg信息
# for size in root.iter('size'):
# for width in size.iter('width'):
# rect['width'] = width.text
# print('width:', rect['width'])
# for height in size.iter('height'):
# rect['height'] = height.text
# print('height:', rect['height'])
img = cv2.imread(pic_path+xml[:-4]+'.jpg')
width = img.shape[1]
height = img.shape[0]
for ob in root.iter('object'):
for bndbox in ob.iter('bndbox'):
# 文本信息
for t in ob.iter('name'):
if(t.text == 'face'):
f1.write('0' + ' ')
else:
f1.write('1' + ' ')
# for l in bndbox:
# print(l.text)
# 坐标信息
for xmin in bndbox.iter('xmin'):
rect['xmin'] = xmin.text
for ymin in bndbox.iter('ymin'):
rect['ymin'] = ymin.text
for xmax in bndbox.iter('xmax'):
rect['xmax'] = xmax.text
for ymax in bndbox.iter('ymax'):
rect['ymax'] = ymax.text
xc = (int(rect['xmin']) + (int(rect['xmax']) - int(rect['xmin'])) / 2) / width
yc = (int(rect['ymin']) + (int(rect['ymax']) - int(rect['ymin'])) / 2) / height
wid = ((int(rect['xmax']) - int(rect['xmin']))/width)
hei = ((int(rect['ymax']) - int(rect['ymin']))/height)
print(str(xc)+' '+str(yc)+' '+str(wid)+' '+str(hei))
line = str(xc)+' '+str(yc)+' '+str(wid)+' '+str(hei) + " "
f1.write(line + '\n')