Подтвердить что ты не робот

TensorFlow Object Detection API Weird Behavior

Я играл с TensorFlow совершенно новым API обнаружения объектов и решил обучить его некоторым другим общедоступным наборам данных.

Мне довелось наткнуться на этот набор данных бакалеи, который состоит из изображений различных марок сигаретных ящиков на полке супермаркета вместе с текстовым файлом в котором перечислены ограничивающие прямоугольники каждой коробки для сигарет на каждом изображении. 10 основных брендов были помечены в наборе данных, а все остальные бренды попадают в 11-ю категорию "разные".

Я выполнил их учебник и смог обучить модель этому набору данных. Из-за ограничений по мощности обработки я использовал только треть набора данных и выполнил разделение на 70:30 для обучения и тестирования данных. Я использовал модель quick_rcnn_resnet101. Все параметры в моем файле конфигурации такие же, как параметры по умолчанию, предоставленные TF.

После 16491 глобальных шагов я тестировал модель на некоторых изображениях, но я не очень доволен результатами -

Не удалось обнаружить верблюдов на верхней полке, тогда как обнаруживает продукт на других изображениях

Почему он не может обнаружить Marlboros в верхнем ряду?

Еще одна проблема, которую я испытывал, заключается в том, что модель никогда не обнаруживала никакой другой метки, кроме метки 1

Не обнаружено экземпляра урожая продукта из данных обучения

Он обнаруживает сигаретные коробки с уверенностью 99% даже в негативных изображениях!

Может кто-нибудь помочь мне в том, что происходит не так? Что я могу сделать для повышения точности? И почему он обнаруживает, что все продукты принадлежат к категории 1, хотя я уже упоминал, что всего 11 классов?

Изменить Добавлена ​​карта ярлыков:

item {
  id: 1
  name: '1'
}

item {
  id: 2
  name: '2'
}

item {
  id: 3
  name: '3'
}

item {
  id: 4
  name: '4'
}

item {
  id: 5
  name: '5'
}

item {
  id: 6
  name: '6'
}

item {
  id: 7
  name: '7'
}

item {
  id: 8
  name: '8'
}

item {
  id: 9
  name: '9'
}

item {
  id: 10
  name: '10'
}

item {
  id: 11
  name: '11'
}
4b9b3361

Ответ 1

Итак, я думаю, что понял, что происходит. Я сделал некоторый анализ набора данных и выяснил, что он искажен по отношению к объектам категории 1.

Это распределение по частоте каждой категории от 1 до 11 (в индексировании на основе 0)

0 10440
1 304
2 998
3 67
4 412
5 114
6 190
7 311
8 195
9 78
10 75

Я предполагаю, что модель попадает в локальные минимумы, где просто маркировка всего, как категория 1, достаточно хороша.

О проблеме отсутствия некоторых ящиков: я снова пробовал тренироваться, но на этот раз я не делал различий между брендами. Вместо этого я попытался научить модель, что такое сигарета. Он все еще не обнаружил все коробки.

Затем я решил обрезать входное изображение и предоставить его как вход. Просто чтобы убедиться, что результаты улучшились, и это произошло!

Оказывается, размеры входного изображения намного больше, чем 600 x 1024, которые принимаются моделью. Таким образом, это уменьшало эти изображения до 600 x 1024, что означало, что коробки с сигаретами теряли свои детали:)

Итак, я решил протестировать оригинальную модель, которая была обучена всем классам на обрезанных изображениях и работает как шарм:)

Исходное изображение

Это был результат модели на исходном изображении

Верхний левый угол, обрезанный с исходного изображения

Это результат модели, когда я вырезаю верхний левый квартал и предоставляю его как вход.

Спасибо всем, кто помог! И поздравляем команду TensorFlow с потрясающей работой по API:) Теперь все могут обучать модели обнаружения объектов!

Ответ 2

Сколько изображений в наборе данных? Чем больше данных обучения, тем лучше API. Я пробовал тренировать его примерно на 20 изображений в классе, точность была довольно плохая. Я в значительной степени столкнулся со всеми проблемами, о которых вы говорили выше. Когда я создал больше данных, точность значительно улучшилась.

PS: Извините, я не могу комментировать, так как у меня недостаточно репутации

Ответ 3

Кажется, размер набора данных довольно мал. Resnet - это большая сеть, которая потребует еще больше данных для правильной тренировки.

Что делать:

  • Увеличить размер набора данных
  • Используйте предварительно подготовленные сети и настройтесь на свой набор данных (вы, вероятно, уже это сделали)
  • Использовать расширение данных (изменение размера, размытие,...; переворачивание может не соответствовать этому набору данных).