AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml.Possible class labels are 0-0.
问题翻译:定义的只有1个类别,标签应该是0-0.
打开labelimg,一张一张图片翻阅,查看是否有错标的标签,翻看到五百多张图的时候出现了以下报错,且labelimg自动关闭。
于是打开图片相对应的txt文件,发现问题所在之处。txt文件中标签出现了1,超出类别索引值。
使用labelimg标图时,第一次输错了类别名称并且标框过一次再删除,此时正确的标签索引值变成了1,应该需要关闭labelimg打开之后重新输入正确的类别名。
将txt中错误文件的类别值全改成0,没有找到用代码解决的办法,只能打开txt文件一个个修改。
自己写了一个简单的代码进行批量的替换,仅适用于分类数目为1的情况,代码如下:
import os
path = r'D:\jiafeng\middle\labels\train' #需改的txt文件的路径
filenames = os.listdir(path) #将所有txt文件的文件名用filename储存起来
for filename in filenames: #遍历所有txt文件
position = path + '\\' + filename #获取绝对路径 '\\'有一个斜杠是转义符
# print(position) #此行代码不注释可用于检查绝对路径是否正确
with open(position) as f:
lines = f.readlines() #以行为单位读取txt文件中的内容
s = [line[:-1].split(' ') for line in lines] #以空格为标志分割txt中每行的内容,并以列表的方式储存在s中
# print(s) #取消注释可以看是否成功分行分元素储存
for i in range(len(s)): #遍历s的每一行
# print(s[i][0]) #取消注释可看每一行的第一个元素是多少
if s[i][0] == '1':
s[i][0] = '0' #如果每一行的第一个元素为1,也就是分类的标签为1,则将其修改成0
# print(s) #取消注释可查看是否成功将第一列全修改为0
# print(len(s[i]))
with open(position,'w',encoding='utf-8') as f: #将修改完的s写入到txt文件当中
for j in range(len(s)): #此处采用先按行读取,再按列一个一个元素读取
for k in range(len(s[j])):
f.write((s[j][k]+' ')) #写入的每一个元素都以空格隔开,因此需要+' '
f.write("\n") #写完一行之后需要换行
将所有txt文件修改完之后代码已成功跑通。