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.

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

报错原因:

 打开labelimg,一张一张图片翻阅,查看是否有错标的标签,翻看到五百多张图的时候出现了以下报错,且labelimg自动关闭。

yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml._第2张图片

于是打开图片相对应的txt文件,发现问题所在之处。txt文件中标签出现了1,超出类别索引值。

yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml._第3张图片

使用labelimg标图时,第一次输错了类别名称并且标框过一次再删除,此时正确的标签索引值变成了1,应该需要关闭labelimg打开之后重新输入正确的类别名。

解决办法:

 将txt中错误文件的类别值全改成0,没有找到用代码解决的办法,只能打开txt文件一个个修改。

2022/9/2更新

自己写了一个简单的代码进行批量的替换,仅适用于分类数目为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文件修改完之后代码已成功跑通。

yolov5运行时显示AssertionError:Label class 1 exceeds nc = 1 in data/middle.yaml._第4张图片

你可能感兴趣的:(python,pytorch)