yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml.

编程入门 行业动态 更新时间:2024-10-26 12:25:33

yolov5运行时显示AssertionError:<a href=https://www.elefans.com/category/jswz/34/1764842.html style=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.

本文发布于:2024-02-11 14:14:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1681420.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Label   class   AssertionError   exceeds   middle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!