Ошибка утверждения: класс метки 15 превышает nc = 1 в data / coco128.yaml. Возможные метки классов: 0-0

#python #yolov5

#python #yolov5

Вопрос:

Я создавал среду yolov5 и пытался запустить ее в течение последних нескольких дней. Я использовал следующий код, чтобы проверить, прошла ли моя настройка успешно.

 python train.py --img 640 --data data/coco128.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 16 --epochs 100
  

И затем это выдало мне следующую ошибку, и я попытался найти ответы в Google, но я не увидел ничего полезного. Я сейчас опустошен. Может кто-нибудь помочь мне? Я действительно ценю это.

 Transferred 362/370 items from weights/yolov5s.pt
Optimizer groups: 62 .bias, 70 conv.weight, 59 other
Scanning labels datacoco128labelstrain2017.cache (32 found, 0 missing, 0 empty, 0 duplicate, for 32 images): 32it [00:00, 3270.57it/s]
Traceback (most recent call last):
  File "train.py", line 456, in <module>
    train(hyp, opt, device, tb_writer)
  File "train.py", line 172, in train
    assert mlc < nc, 'Label class %g exceeds nc=%g in %s. Possible class labels are 0-%g' % (mlc, nc, opt.data, nc - 1)
AssertionError: Label class 15 exceeds nc=1 in data/coco128.yaml. Possible class labels are 0-0
  

Я действительно не использую этот сайт. Прости меня.

прикрепленное изображение

Комментарии:

1. Просто проверьте свой файл набора данных. В основном файлы txt и jpg не подходят.

Ответ №1:

Я тоже нашел эту точную ошибку.

В ваших файлах .txt, которые вы создали для аннотаций, будет целое число, за которым следуют четыре числа с плавающей запятой (т.Е. 13 0,3434 0,251 0,4364 0,34353) — что-то в этом роде.

Эта ошибка, по сути, указывает на то, что Количество ваших классов (т. Е. Количество различных объектов, Которые Вы пытаетесь обучить модели) Слишком мало для идентификационного номера используемых вами классов. В моем примере выше идентификатор равен 13 (14-й класс, поскольку включен 0). Если я установлю nc = 1, то у меня может быть только класс (0) . Мне нужно было бы установить nc = 14 и убедиться, что 0-12 существует.

Чтобы исправить это, просто измените классы так, чтобы идентификаторы находились внутри выбранного вами количества классов. Для nc = 1 вам понадобится только class / ID = 0 .

В качестве примечания (и я ошибся в этом) удалите train.cache перед повторным запуском обучения. Это вызвало у меня небольшую неприятность, поскольку я все еще был уверен, что у меня были классы> 0, когда я этого не делал.

Ответ №2:

Ошибка вызвана тем фактом, что у вас есть одна или несколько меток с номером 15 в качестве класса. Вам нужно изменить класс на допустимое значение класса (которое в вашем случае равно только 0), вы можете сделать это вручную или с помощью скрипта. Я изменил значения классов вручную в своем наборе данных, чтобы найти файлы, содержащие недопустимые классы, я запустил скрипт на python, который я адаптировал для вашей ситуации:

 path = 'C:/foo/bar' #path of labels
labels = os.listdir('path')
for x in labels:
    with open('path' x) as f:
    lines = f.read().splitlines()
    for y in lines:
        if y[:1]!='0':
            print(x)
  

Этот фрагмент будет печатать все файлы, содержащие класс, отличный от 0.

Для любого, кто находит это и имеет более одного класса, вы должны заменить значение 0 значением или значениями (вы можете перебирать список возможных значений) класса или классов, которые превышают количество классов, указанных вами ранее.

Ответ №3:

Я также столкнулся с этой проблемой и попробовал несколько решений и решил, как показано ниже:

На самом деле набор данных состоит из 11 классов. И когда я проверяю файлы .xml, которые включают метку изображения, я увидел метку: 11. So :

  1. установите nc:12,
  2. добавьте » значение в массив меток. [«,»яблоко»,»банан» и т. Д.]

Не забудьте удалить ярлык chache!rm -f data/train/labels. npy