Обнаружение мультиклассовых объектов с тензорным потоком: странное поведение при оценке - PullRequest
0 голосов
/ 29 января 2019

Я использую обнаружение объекта Tensorflow, где в качестве предварительно обученной модели используется fast_rcnn_inception_v2_coco.Я на Windows 10, с tenorflow-GPU 1.6 на NVIDIA GeForce GTX 1080, CUDA 9.0 и CUDNN 7.0.

Я пытаюсь обучить обнаружение объектов нескольких классов с помощью пользовательского набора данных, но у меня былокакое-то странное поведение.У меня есть 2 класса: пистолет и нож (с соответственно 876 и 664 изображениями, все с одинаковым размером от 360x200 до 640x360 и аналогичным соотношением).Итак, я думаю, что набор данных сбалансирован.Я разделил его на набор Train (1386 изображений: 594 ножа, 792 пистолета) и набор тестов (154 изображения: 70 ножа, 84 пистолета)

Кажется, что CNN может обнаружить только один из двух объектов с хорошей точностьюи какой объект может обнаруживать (из двух классов) случайные изменения во время этапов обучения и на одном и том же изображении (пример: этап 10000 обнаруживает только пистолет, этап 20000 только нож, этап 30000 нож, этап 40000 пистолет, этап 50000 нож,и т. д.), как показано ниже:

Weird behavior in evaluation][3]]

Более того, потеря выглядит странно, и точность во время оценки никогда не бывает высокой для обоих классоввместе.

Во время фазы тренировки потеря, кажется, колеблется на каждом этапе тренировки.

Убыток:

Loss

Общий убыток:

TotalLoss

Из mAp (изображение ниже) видно, что два объекта никогда не идентифицируются вместе на одном шаге:

mAp

Если бы я обучал эти два класса отдельно, я мог бы достичь хорошей точности 50-60%.Если я буду обучать эти два класса вместе, то вы получите то, что увидели.

Здесь вы можете найти generate_tfrecord.py и файл конфигурации модели (что я изменил, чтобы сделать его мультикласс).Карта меток выглядит следующим образом:

item {
  id: 1
  name: 'knife'
}

item {
  id: 2
  name: 'pistola'
}

Любые предложения приветствуются.

ОБНОВЛЕНИЯ После 600 000 итераций потери все еще колеблются.Сценарий выглядит следующим образом: Потеря , Общая потеря и mAp .

1 Ответ

0 голосов
/ 31 января 2019

Наконец, я решил свою проблему.

Я следую совету @Suleiman, но в первый раз я перетасовал только test.csv и train.csv .Я видел, что внутри моего generate_tfrecords.py элементы будут переупорядочены по имени файла, поэтому перемешивание в прошлом было бесполезным.Я перетасовал набор данных внутри generate_tfrecords.py , изменив

    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, path)

на следующее:

    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    shuffle(grouped) // shuffling list of entries
    for group in grouped:
        tf_example = create_tf_example(group, path)

добавив перемешивание списка записей.Результаты значительно улучшились, как вы можете видеть на графиках потерь, общей потери и мАп:

потери и общей потери: Loss and Total Loss

mAp: mAp

Теперь потери достигают только пика, возможно, из-за некоторых ошибок в наборе данных, которые я буду чистить.Очевидно, что оценка и обнаружение теперь также довольно хороши.

ТАК ПОМНИТЕ: порядок изображений в ваших TFRecords очень важен (особенно, когда размер пакета равен 1)!

Спасибо Сулейману за подсказку.

...