数据集格式存在的问题
如图所示,在对数据集进行处理时,发现有的xml标注文件拥有size节点而有的没有,在获取标注数据集时需要获取size信息,因此导致程序这部分图片读取问题。
解决方案
其实这是一个比较简单的问题,我们可以选择跳过这部分信息(size不是最关键的信息),还可以选择为所有文件补填上size信息。
简单地来说这是一个小问题,只需要读取所有图片的高、宽和深度即可,python的opencv库可以很简单地做到,然后将读取到的内容写入xml文件,这方面我没有做过,不过网上有许多资料可以查询,写代码的问题不大。
具体代码可见getSize.py文件,比较简单,但是是项目开始写的第一个代码文件,记录一下。
import cv2
import xml.etree.ElementTree as ET
sets = ['train', 'test', 'val']
for image_set in sets:
#分别从数据集测试集读取文件名
image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
for image_id in image_ids:
image = cv2.imread('data/JPEGImages/%s.jpg' % (image_id))
size = image.shape
#h = size[0] # 高度
#w = size[1] # 宽度
#depth = size[2] # 深度
#print(image_id, size)
tree = ET.parse('data/Annotations/%s.xml' % (image_id)) #读取xml文件
root = tree.getroot()
if root.find('size') is None:
#增加size节点以及宽高深度三个子节点
#print(image_id)
size_node = ET.Element('size')
width_node = ET.SubElement(size_node, 'width')
height_node = ET.SubElement(size_node, 'height')
depth_node = ET.SubElement(size_node, 'depth')
width_node.text = str(size[1])
height_node.text = str(size[0])
depth_node.text = str(size[2])
root.append(size_node)
tree.write('data/Annotations/%s.xml' % (image_id), encoding="utf-8", xml_declaration=True)
else:
#部分文件size错误,重新覆盖以改正
print(image_id)
size_node = root.find('size')
size_node.find('width').text = str(size[1])
size_node.find('height').text = str(size[0])
size_node.find('depth').text = str(size[2])
tree.write('data/Annotations/%s.xml' % (image_id), encoding="utf-8", xml_declaration=True)