Keras получает карту характеристик последнего слоя для определенного изображения в VGG

У меня есть несколько изображений. Я хочу использовать VGG, чтобы получить 1D-карту признаков из 4096 для каждого , аналогично тому, что сделано здесь: (У них на входе 700 изображений. Они удалили последний полносвязный слой из VGG16, поэтому VGGNet включала 13 сверточных слоев ( Conv), 5 слоев с максимальным объединением и 2 полносвязных слоя (Fc), на выходе которых создается карта объектов размером 700 × 4096) Изображение взято с https://arxiv.org/pdf/1911.11393.pdf

Как лучше всего это сделать? (обратите внимание, мне нужна только верхняя часть PS - сгенерируйте вектор 1X4096 для каждого изображения. Конкатенация в настоящее время не важна)


person okuoub    schedule 10.08.2020    source источник


Ответы (1)


Этого должно быть достаточно, учитывая следующие ограничения:

  • Ваша сеть не является полностью сверточной, вы не сможете изменить размер ввода.
  • В вашей сети может быть закодирована некоторая пространственная информация (поскольку вы конвертируете сетку в плоский вектор).

Это не означает, что эта концепция неверна или нет. Например, бывают случаи, когда важно закодировать позицию. И есть другие, где интересно работать с изображениями разных размеров, например, делать выводы в нескольких масштабах и усреднять результаты.

Для этого в Keras вам нужна только оригинальная модель VGG. Вы можете создать новый:

model_base = tf.keras.applications.VGG16(
    include_top=True,
    weights="imagenet",
    input_tensor=None,
    input_shape=None,
    pooling=None,
    classes=1000,
    classifier_activation="softmax",
)

new_input = model_base.input
new_output = model_base.get_layer('fc2').output
model = tf.keras.Model(new_input, new_output)

Это очень распространенный способ извлечения признаков, в зависимости от ваших интересов вы можете оставить FC или нет. Например, если вы проанализируете исходный код keras: https://github.com/keras-team/keras-applications/blob/master/keras_applications/vgg16.py вы увидите, что если вы укажете include_top=False, часть FC будет удалена (известная как классификация), и будет сохранена только часть извлечения признаков + глобальный средний пул.

ОБНОВЛЕНИЕ:

Разве VGG не кодирует пространственную информацию? Есть ли другая предварительно обученная сеть, которая ее сохраняет?

  1. VGG вместе с полносвязным YES кодирует пространственную информацию в слоях классификации. Это означает, что последние слои, например, если прогноз зависит от обнаружения неба выше, он рассматривается. С вами может случиться противоположный случай: если вы хотите классифицировать большое изображение с кошкой в ​​левом верхнем углу как кошку, а вы тренировались только с изображениями кошек справа, тогда у вас могут возникнуть проблемы с пространственной информацией. Однако существуют и другие способы кодирования пространственной информации. Самым большим преимуществом полностью сверточных сетей является то, что вы можете использовать изображения разных размеров. Это зависит от задачи, в настоящее время широко используются полностью сверточные сети, что означает отсутствие преобразования сетки в плоский вектор. В противном случае все изображение усредняется, и пространственная информация теряется. Сейчас это стандарт.

Каково будет влияние include_top = False на сгенерированную карту объектов?

  1. Если это повлияет, с include_top = True вы сохраните все полносвязные слои, а затем сохраните fc2 (https://neurohive.io/wp-content/uploads/2018/11/vgg16.png). Если вы установите include_top = False, вы удалите FC и поместите слой глобального объединения средних значений, который будет усреднять все функции.

Какое лучшее решение? Лучшего решения нет, оно зависит от вашей проблемы и обычно не столь существенно.

person Adria Ciurana    schedule 10.08.2020
comment
Благодарю вас! Я новичок в CV, поэтому, если бы вы могли уточнить, было бы здорово: 1. Разве VGG не кодирует пространственную информацию? Есть ли другая предварительно обученная сеть, которая ее сохраняет? 2. Каково будет влияние include_top = False на сгенерированную карту объектов? - person okuoub; 10.08.2020
comment
Отвечаю на вопросы в ответе, потому что мне здесь не хватает места - person Adria Ciurana; 10.08.2020
comment
Спасибо, а если я хочу закодировать пространственную информацию, что мне делать? (например, для меня имеет значение расположение кота - точно такая же картинка с котом слева должна кодироваться иначе, чем с котом справа) - person okuoub; 10.08.2020
comment
В этом случае вы должны использовать одну часть с полностью связанными слоями, сверточная часть будет извлекать признаки, а классификационная часть будет понимать положение признаков (приблизительно). В настоящее время это область исследований, есть несколько статей, таких как CapsNet, которые пытаются решить эту проблему. Еще одно простое решение — ввести изображение с 5 каналами: RGB; XY (где x и y индексируют положение этого пикселя). - person Adria Ciurana; 10.08.2020
comment
Большое спасибо! Не могли бы вы объяснить, как добавление слоев fc заставляет карту объектов понимать положение объектов? Я также попробую последнее решение из 5 каналов - у вас есть ссылка на пример кода чего-то подобного? - person okuoub; 10.08.2020
comment
Не могли бы вы поделиться примером кода или соответствующей ссылкой на решение канала? - person okuoub; 11.08.2020