Label class 1 exceeds nc = 1 in data/middle.yaml."/>
yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml.
问题:
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文件一个个修改。
2022/9/2更新
自己写了一个简单的代码进行批量的替换,仅适用于分类数目为1的情况,代码如下:
import ospath = 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文件修改完之后代码已成功跑通。
更多推荐
yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml.
发布评论