Изменить форму входного тензора для приложения VGG16

Я хочу передать изображения с формой (160 320,3) в

 VGG16(input_tensor=input_tensor, include_top=False)   

Как я могу включить слой, который изменяет форму изображений до формы, ожидаемой моделью VGG16, то есть (224,224,3)?


person user1934212    schedule 27.01.2017    source источник


Ответы (3)


Модель VGG16 сама по себе представляет собой просто набор весов фиксированной последовательности слоев и фиксированных размеров ядра свертки и т. д. Это не означает, что эти ядра свертки нельзя применять к изображениям других размеров.

Например, в вашем случае:

from keras.models import Model
from keras.layers import Dense,Flatten
from keras.applications import vgg16
from keras import backend as K

model = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=(160,320,3))
model.summary(line_length=150)

flatten = Flatten()
new_layer2 = Dense(10, activation='softmax', name='my_dense_2')

inp2 = model.input
out2 = new_layer2(flatten(model.output))

model2 = Model(inp2, out2)
model2.summary(line_length=150)

Согласно здесь минимальный размер изображения может быть 48x48x3 все, что выше этого, в порядке.

Теперь верно, что исходные веса были изучены на изображениях в форме 224,224,3, но веса фильтров служат очень хорошей отправной точкой для новых задач с новым набором изображений. Вам нужно переобучить сеть, но сеть сойдется очень быстро. Это основа трансферного обучения.

person indraforyou    schedule 28.01.2017
comment
Минимальный размер изображения был обновлен до 32x32. - person Alaa M.; 06.07.2021

Есть две вещи, которые вам нужно сделать:

  1. Явно объявите входную фигуру, чтобы иметь входные данные переменного размера, определив None для ширины и высоты изображения.
  2. Не используйте flatten(), так как он зависит от фиксированной входной формы. Вместо этого используйте GlobalMaxPooling, который не только сделает адаптивный пул, но и сгладит входной тензор для работы FC.

Я надеюсь, что это поможет вам достичь того, чего вы хотите.

person Kashif    schedule 12.02.2018

Вы можете использовать функцию resize() библиотеки Opencv.

 import cv2
    width = int(224)
    height = int(224)
    dim = (width, height)
    '''images contains original dimension image array'''
    resized_images=[]
    for i in range(0,images.shape[0]):
           resized = cv2.resize(images[i], dim, interpolation = cv2.INTER_AREA)
           resized_images.append(resized)
person Pranshu Prakash    schedule 25.09.2019
comment
такой подход искусственно увеличивает вычислительные затраты без особых или каких-либо преимуществ для возможностей обучения. Насколько я знаю, интерполированные пиксели не добавят никакой ценности. - person Bartek Wójcik; 10.12.2020