VOC标签格式转yolo格式并划分训练集和测试集时,出现如下报错:
File "XXX(运行文件路径)", line 50, in convert_ annotation
difficult = obj. find( 'difficult' ) . text
AttributeError: ' NoneType' object has no attribute 'text '
可能的问题(1):
xml转txt的代码中有着这一段:
for obj in root.iter('object'):
difficult = obj.find('difficult').text
#difficult = obj.find('Difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
这个可能是xml文件中的object节点没有difficult的这个属性
<--有difficult-->
</object>
<object>
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>1</difficult>
<bndbox>
<xmin>336</xmin>
<ymin>71</ymin>
<xmax>424</xmax>
<ymax>159</ymax>
</bndbox>
</object>
<--无difficult-->
<item>
<name>person</name>
<bndbox>
<xmin>201</xmin>
<ymin>163</ymin>
<xmax>314</xmax>
<ymax>292</ymax>
</bndbox>
</item>
在无difficult内容的时候 xml转txt的代码会因为读取不到而报错
解决方法:
import xml.etree.ElementTree as ET
from lxml import etree
from tqdm import tqdm
import os
def edit_xml(xml_file):
"""
修改xml文件
:param xml_file:xml文件的路径
:return:
"""
tree = ET.parse(xml_file)
objs = tree.findall('object')
for ix, obj in enumerate(objs):
newEle = ET.Element("difficult")
newEle.text = "0"
obj.append(newEle) # 新增节点
tree.write(xml_file, method='xml', encoding='utf-8') # 更新xml文件
if __name__ == '__main__':
path = r'H:/excise'
xml_files = [os.path.join(rootdir, file) for rootdir, _, files in os.walk(path) for file in files if
(file.endswith('.xml'))]
for xml in tqdm(xml_files):
edit_xml(xml) # 修改xml文件
在xml文件中添加diffcult这个属性
参考文章
(52条消息) python-----批量操作xml文件(新建、增、删、改、查)_小呆丶的博客-CSDN博客
(52条消息) 使用python创建、添加、修改xml格式的标注文件_python创建xml_WentingDu的博客-CSDN博客