Я обучаю модель сегментации, используя обучение передачи с помощью Tensorflow 2 и Keras.
У меня есть изображения (1 канал в оттенках серого) и маски (двоичные). Я должен иметь возможность воспроизвести маску для данного изображения.
И изображения, и маски имеют формы (256, 256).
Вот тепловая карта типичной маски при преобразовании в numpy массив, чтобы дать вам представление:
введите описание изображения здесь
Я использую генераторы данных Keras с увеличением данных.
Мой код следующий:
train_datagen = ImageDataGenerator(preprocessing_function = tensorflow.keras.applications.resnet_v2.preprocess_input,
rescale=1./255,
shear_range=0.1,
zoom_range=0.1,
horizontal_flip= True)
val_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_image_generator = train_datagen.flow_from_dataframe(
dataframe = train_examples_df,
x_col = 'images',
batch_size = 2,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
train_mask_generator = train_datagen.flow_from_dataframe(
dataframe = val_examples_df,
x_col = 'masks',
batch_size = 2,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
val_image_generator = val_datagen.flow_from_dataframe(
dataframe = train_examples_df,
x_col = 'images',
batch_size = 2,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
val_mask_generator = val_datagen.flow_from_dataframe(
dataframe = val_examples_df,
x_col = 'masks',
batch_size = 2,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
test_image_generator = test_datagen.flow_from_dataframe(
dataframe = test_examples_df,
x_col = 'images',
batch_size = 1,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
test_mask_generator = test_datagen.flow_from_dataframe(
dataframe = test_examples_df,
x_col = 'masks',
batch_size = 1,
target_size=(256,256),
class_mode = None,
shuffle = False
#class_mode='categorical'
)
train_gen = zip(train_image_generator, train_mask_generator)
val_gen = zip(val_image_generator, val_mask_generator)
test_gen = zip(test_image_generator, test_mask_generator)
Затем мой код для определения модели, компиляции это, и обучение его выглядит следующим образом:
base_model = InceptionResNetV2(include_top= False, input_shape = (256, 256, 3))
x = base_model.output
x = GlobalMaxPooling2D()(x)
x = Dense(256**2, activation = 'relu')(x)
preds = Reshape((256, 256, 1))(x)
model = Model(inputs = base_model.input, outputs = preds)
model.compile(optimizer = 'Adam', loss= 'binary_crossentropy', metrics = ['accuracy'])
for layer in model.layers[:780]:
layer.trainable = False
NO_OF_TRAINING_IMAGES = len(os.listdir('data\\train_frames'))
NO_OF_VAL_IMAGES = len(os.listdir('data\\val_frames'))
NO_OF_EPOCHS = 10
BATCH_SIZE = 2
results = model.fit_generator(train_gen, epochs=NO_OF_EPOCHS,
steps_per_epoch = (NO_OF_TRAINING_IMAGES//BATCH_SIZE),
validation_data=val_gen,
validation_steps=(NO_OF_VAL_IMAGES//BATCH_SIZE))
В результате получается следующий результат:
Train for 276 steps, validate for 79 steps
Epoch 1/10
276/276 [==============================] - 241s 874ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0036 - val_accuracy: 0.9852
Epoch 2/10
276/276 [==============================] - 236s 856ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0034 - val_accuracy: 0.9852
Epoch 3/10
276/276 [==============================] - 238s 861ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0033 - val_accuracy: 0.9852
Epoch 4/10
276/276 [==============================] - 247s 894ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0033 - val_accuracy: 0.9852
Epoch 5/10
276/276 [==============================] - 255s 924ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0032 - val_accuracy: 0.9852
Epoch 6/10
276/276 [==============================] - 249s 904ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0031 - val_accuracy: 0.9852
Epoch 7/10
276/276 [==============================] - 252s 912ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0031 - val_accuracy: 0.9852
Epoch 8/10
276/276 [==============================] - 243s 882ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852
Epoch 9/10
276/276 [==============================] - 251s 908ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852
Epoch 10/10
276/276 [==============================] - 242s 878ms/step - loss: -0.0605 - accuracy: 0.0000e+00 - val_loss: 0.0030 - val_accuracy: 0.9852
Эта модель оказывается неспособной воспроизвести шаблон.
Более того , Я не могу понять потери и точность, которые он сообщает в наборе поезда. Потеря отрицательная? Точность 0?