Tensorflow высокий уровень ложноположительных результатов и проблема не максимального подавления

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

Мой набор данных содержит только один объект "Пистолет" и 3000 изображений (набор из 2700 поездов, набор из 300 испытаний). Размер изображений от ~100х200 до ~800х600.

Я обучил эту модель для 55 000 итераций, где mAP составляло ~0,8, а TotalLoss, по- видимому, сходилось к 0,001. Но, тем не менее, увидев оценку, что на одном и том же обнаруженном объекте имеется множество ограничивающих рамок (например, это и это), а также множество ложных срабатываний ( дом обнаружен как пистолет). Например, на этой фотографии, сделанной мной (фильтр размытия был применен позже), модель распознает человека и автомобиль в качестве пистолета, а также правильное обнаружение.

Здесь загружен набор данных вместе с tfrecords и картой меток. Я использовал этот файл конфигурации, где единственные вещи, которые я изменил, это: num_classes на 1, fine_tune_checkpoint, input_path и label_map_path для train и eval и num_examples. Так как я думал, что множественные блоки - это проблема не максимального подавления, я изменил score_threshold (строка 73) с 0 на 0,01 и iou_threshold (строка 74) с 1 на 0,6. При стандартных значениях результат был намного хуже, чем этот.

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

Спасибо

1 ответ

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

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

На мой взгляд, это вступает в конфликт с этой частью вашего файла конфигурации:

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 600
    max_dimension: 1024
  }
}

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

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

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

Оплаченный

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

Вы могли бы, вероятно, настроить минимальную достоверность, чтобы считать обнаружение истинно положительным и удалить его.

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

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

Многие люди, которых я вижу в Интернете, сталкивались с той же проблемой при использовании Tensorflow API. Я думаю, что есть некоторые проблемы, связанные с идеей / процессом использования предварительно обученных моделей с пользовательскими классификаторами дома. Например, люди хотят использовать SSD Mobile или Faster RCNN Inception для обнаружения таких объектов, как "Человек в шлеме", "пистолет" или "ящик для инструментов" и т. Д. Общий процесс заключается в загрузке изображений этого объекта, но большая часть время, независимо от того, сколько изображений... от 200 до 2000, вы все равно получаете ложные срабатывания, когда фактически запускаете его на своем столе.

Классификатор объектов отлично работает, когда вы показываете ему объект в его собственном контексте, но в конечном итоге вы получаете 99% совпадений для повседневных элементов, таких как окно в спальне, стол, монитор компьютера, клавиатура и т. Д. Люди упоминали стратегию введение негативных изображений или мягких изображений. Я думаю, что проблема связана с ограниченным контекстом в изображениях, которые использует большинство людей. Предварительно обученные модели были обучены с более чем дюжиной классификаторов во многих различных средах, например, в одном примере это может быть Автомобиль на улице. CNN видит машину, а затем все на этом изображении, кроме автомобиля, является негативным изображением, которое включает улицу, здания, небо и т. Д. На другом изображении он может видеть бутылку и все на этом изображении, включая столы, столы, окна и т. д.Я думаю, что проблема с обучением пользовательских классификаторов заключается в том, что это проблема с негативным изображением. Даже если у вас достаточно изображений самого объекта, недостаточно данных об этом же объекте в разных контекстах и ​​на разных фонах. Так что в некотором смысле негативных изображений недостаточно, даже если по идее негативные изображения вам не нужны. Когда вы запускаете алгоритм дома, вы получаете ложные срабатывания повсюду, идентифицируя объекты вокруг вашей собственной комнаты. Я думаю, что идея передачи обучения таким образом ошибочна. В конечном итоге мы просто видим множество отличных учебных пособий в Интернете, где люди идентифицируют игральные карты, тысячелетних соколов и т. свой пул изображений.Лучшей стратегией было бы переобучить CNN с нуля с помощью нескольких классификаторов и добавить туда нужные. Я предлагаю повторно ввести предыдущий набор данных из ImageNet или Pascal с 10-20 уже существующими классификаторами, добавить свои собственные и повторно обучить его.