Модель SSD mobilenet не обнаруживает объекты на больших расстояниях

Я обучил модель SSD Mobilenet с пользовательским набором данных (батарея). Пример изображения батареи приведен ниже, а также приложен файл конфигурации, который я использовал для обучения модели.

Когда объект находится ближе к камере (тестируется с помощью веб-камеры), он точно обнаруживает объект с вероятностью более 0,95, но когда я перемещаю объект на большее расстояние, он не обнаруживается. После отладки обнаружил, что объект обнаружен, но с меньшей вероятностью 0,35. Минимальный порог установлен на 0,5. Если я изменяю порог от 0,5 до 0,2, объект обнаруживается, но ложных обнаружений больше.

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

Пожалуйста, помогите мне со следующим

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

1 ответ

Изменение пропорций и масштабов не поможет улучшить точность обнаружения небольших объектов (поскольку исходный масштаб уже достаточно мал, например, min_scale = 0.2). Самый важный параметр, который вам нужно изменить, это feature_map_layout, feature_map_layout определяет количество карт объектов (и их размеры) и их соответствующую глубину (каналы). Но, к сожалению, этот параметр не может быть настроен в файле pipe_config, вам придется изменить его непосредственно в экстракторе возможностей.

Вот почему это feature_map_layout важно при обнаружении мелких предметов.

На рисунке выше (b) и (c) - две карты характеристик разных макетов. Собака в основном изображении соответствует красной рамке на карте объектов 4x4, а кошка - синей на карте объектов 8x8. Теперь, если объект, который вы хотите обнаружить, это кошачье ухо, тогда не было бы якорных ящиков, соответствующих этому объекту. Итак, интуиция такова: если никакие якорные блоки не соответствуют объекту, то этот объект просто не будет обнаружен. Чтобы успешно обнаружить ухо кошки, вам, вероятно, понадобится карта возможностей 16x16.

Вот как вы можете внести изменения в feature_map_layout, Этот параметр настраивается в каждой конкретной реализации средства извлечения. Предположим, вы используете ssd_mobilenet_v1_feature_extractor, тогда вы можете найти его в этом файле.

feature_map_layout = {
    'from_layer': ['Conv2d_11_pointwise', 'Conv2d_13_pointwise', '', '',
                   '', ''],
    'layer_depth': [-1, -1, 512, 256, 256, 128],
    'use_explicit_padding': self._use_explicit_padding,
    'use_depthwise': self._use_depthwise,
}

Здесь представлено 6 карт с различными характеристиками. Первые два слоя берутся непосредственно из уровней мобильной сети (следовательно, глубина равна -1), а остальные четыре являются результатом дополнительных сверточных операций. Можно видеть, что карта объектов самого низкого уровня происходит от слоя Conv2d_11_pointwise мобильной сети. Как правило, чем ниже слой, тем лучше элементы карты объектов и тем лучше обнаружение небольших объектов. Так что вы можете изменить это Conv2d_11_pointwise в Conv2d_5_pointwise (почему это? Это можно найти из графика тензорного потока, этот слой имеет большую карту объектов, чем слой Conv2d_11_pointwise), это должно помочь обнаружить меньшие объекты.

Но лучшая точность достигается за дополнительную плату, дополнительная стоимость здесь заключается в том, что скорость обнаружения немного снизится, потому что есть больше якорных ящиков, о которых нужно заботиться. (Большие карты возможностей). Также, так как мы выбираем Conv2d_5_pointwise над Conv2d_11_pointwise мы теряем силу обнаружения Conv2d_11_pointwise,

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

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

Другие вопросы по тегам