今天,在训练ssd300网络的时候, bel_idx = self.class_to_ind[name], KeyError = 'c’的错误。根据提示说明class类中有一个键值是‘c’.查找原因是标注的xml文件中有标不是类别外的类‘c’.用下面代码,找出对应文件,并删除object name为‘c’的标注就可以。
# -*- coding: utf-8 -*-
"""
Created on 2022。10.18
@author: wm
"""
import glob
import os
from xml.etree import ElementTree as ET
# 批量读取Annotations下的xml文件
# per=ET.parse(r'D:\anaconda\envs\ssd300\data\VOCdevkit\VOC2007\Annotations')
xml_dir = r'D:\anaconda\envs\ssd300\data\VOCdevkit\VOC2007\Annotations'
xml_list = glob.glob(xml_dir + '/*.xml')
for xml in xml_list:
# print(xml)
per = ET.parse(xml)
# p_filename = per.find('filename')
# name = p_filename.text
# print(name)
# new_name = name.lower()
# print(new_name)
# name = new_name
p = per.findall('/object')
for oneper in p: # 找出person节点
child = oneper.getchildren()[0] # 找出person节点的子节点
# if child.text == 'L_V_line': # 将VerticalCrack改为verticalcrack
# child.text = 'l_v_line'
# if child.text == 'D_V_line': # 将VerticalCrack改为verticalcrack
# child.text = 'd_v_line'
# if child.text == 'L_H_line': # 将VerticalCrack改为verticalcrack
# child.text = 'l_h_line'
# if child.text == 'D_H_line': # 将VerticalCrack改为verticalcrack
# child.text = 'd_h_line'
# if child.text == 'L_line': # 将VerticalCrack改为verticalcrack
# child.text = 'l_line'
# if child.text == 'D_line': # 将VerticalCrack改为verticalcrack
# child.text = 'd_line'
# if child.text == 'D_V_line_3': # 将VerticalCrack改为verticalcrack
# child.text = 'd_v_line'
# if child.text == 'V_dotted_line': # 将VerticalCrack改为verticalcrack
# child.text = 'v_dotted_line'
# if child.text == 'H_dotted_line': # 将VerticalCrack改为verticalcrack
# child.text = 'h_dotted_line'
if child.text == 'c': # 将VerticalCrack改为verticalcrack
print(xml)
# per.write(xml)
# print(child.tag, ':', child.text)