Модель SSD mobilenet не обнаруживает объекты на больших расстояниях - PullRequest
3 голосов
/ 10 мая 2019

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

Sample Battery image

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

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

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

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

1 Ответ

4 голосов
/ 10 мая 2019

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

Вот почему это feature_map_layout важно при обнаружении небольших объектов. enter image description here

На приведенном выше рисунке (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 int в файле конфигурации на 7. Вы можете думать об этом параметре как о разрешающей способности сети обнаружения, чем больше слоев нижнего уровня, тем мельче разрешение будет.

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

...