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'
}
Ответы
Ответ 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 - это большая сеть, которая потребует еще больше данных для правильной тренировки.
Что делать:
- Увеличить размер набора данных
- Используйте предварительно подготовленные сети и настройтесь на свой набор данных (вы, вероятно, уже это сделали)
- Использовать расширение данных (изменение размера, размытие,...; переворачивание может не соответствовать этому набору данных).