Изменение соотношения сторон и масштабов не поможет повысить точность обнаружения мелких объектов (поскольку исходный масштаб уже достаточно мал, например 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_pointwise
pointwise', 'Conv2dConv2d_11_pointwise
pointwise', '', '',
'', ''],
'layer_depth': [-1, -1, 512, 256, 256, 128],
'use_explicit_padding': self._use_explicit_padding,
'use_depthwise': self._use_depthwise,
}
Здесь представлены 6 карт объектов разного масштаба. Первые два уровня берутся непосредственно из уровней мобильной сети (следовательно, оба уровня глубины равны -1), а остальные четыре являются результатом дополнительных сверточных операций. Можно видеть, что карта объектов самого низкого уровня происходит от уровня Conv2dConv2d_11_pointwise
pointwise
мобильной сети. Как правило, чем ниже слой, тем точнее элементы карты объектов и тем лучше для обнаружения мелких объектов. Таким образом, вы можете изменить это Conv2dConv2d_11_pointwise
pointwise
на 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