Я хочу передать изображения с формой (160 320,3) в
VGG16(input_tensor=input_tensor, include_top=False)
Как я могу включить слой, который изменяет форму изображений до формы, ожидаемой моделью VGG16, то есть (224,224,3)?
Я хочу передать изображения с формой (160 320,3) в
VGG16(input_tensor=input_tensor, include_top=False)
Как я могу включить слой, который изменяет форму изображений до формы, ожидаемой моделью VGG16, то есть (224,224,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
, но веса фильтров служат очень хорошей отправной точкой для новых задач с новым набором изображений. Вам нужно переобучить сеть, но сеть сойдется очень быстро. Это основа трансферного обучения.
Есть две вещи, которые вам нужно сделать:
Я надеюсь, что это поможет вам достичь того, чего вы хотите.
Вы можете использовать функцию 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)