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

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

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

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

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

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

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

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

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

person danyfang    schedule 10.05.2019
comment
@danyfang Спасибо за ваш ответ .. Если я внесу изменения в компоновку карты функций, смогу ли я обнаружить кошку на большем расстоянии, потому что я не хочу обнаруживать кошачье ухо (как вы упомянули)? - person Dinesh; 14.05.2019
comment
Просто хочу показать крайний пример, как если бы кошка на большом расстоянии была размером с ухо (кошки на более близком расстоянии). - person danyfang; 14.05.2019
comment
@danyfang нужно ли нам менять min_scale и max_scale при изменении имени слоя? Влияют ли значения масштаба на изменение имени слоя? - person Dinesh; 30.05.2019
comment
@danyfang, спасибо за ответ, у меня была такая же проблема, как и в ОП. Однако я попытался выполнить описанную вами процедуру, и это не сработало. Я добавил Conv2d_5_pointwise в ssd_mobilenet_v1_feature_extractor.py (и соответствующее поле -1 в layer_depth) и изменил num_layers в файл конфигурации тоже на 7, но я все равно получаю сообщение об ошибке, в котором указано, что ValueError: Ожидается, что количество карт функций будет равно длине num_anchors_per_location. Стоит ли что-то еще модифицировать, чтобы оно работало? - person Carlo; 14.11.2019