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