Я пытаюсь сегментировать помеченные объекты (ядра), используя архитектуру UNet в Керасе, и использую набор данных Kaggle DSB18, прежде чем перейти к собственному.Чтобы улучшить разделение между двумя близкими объектами, я генерирую взвешенную карту (реализация jaidevd).Поэтому я получаю метку ввода, которая выглядит следующим образом:
Фон равен 0, 'реальные положительные значения' равны 1, пробелы между объектами равны 2-11, в зависимости от расстояния.Я пытаюсь использовать архитектуру U-Net следующим образом:
# Inputs
X_train # list of all images, shaped (256, 256, 3)
Y_train # list of weighted mask, as shown above
Y_train = to_categorical(Y_train, num_classes=None)
# Dice coefficient
def dice_coef(y_true, y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + 1.) / (K.sum(y_true_f) + K.sum(y_pred_f) + 1.)
# Define model
inputs = Input((256, 256, 3))
s = Lambda(lambda x: x / 255) (inputs)
# ... convolutional etc. layers
outputs = Conv2D(12, (1, 1), activation='softmax') (c9)
model = Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=[dice_coef])
# Train model
ModelCheckpoint('model.hf', verbose=1, save_best_only=True)
results = model.fit(X_train, Y_train, validation_split=0.2, batch_size=10, epochs=15, callbacks=[checkpointer])
# Test
test_image = # test image of shape (256,256,3)
test_image = np.expand_dims(test_image, axis=0)
prediction = model.predict(test_image)
print(prediction.shape)
>>> (1, 256, 256, 12)
imshow(np.sum(prediction[0,:,:,1:], axis=-1)) # or argmax or a single layer
Все мои прогнозируемые результаты либо пустые, либо выделены границы, как показано здесь.
Кто-нибудь видит что-то не так с моим кодом или архитектурой или у кого-то есть идея разделить закрываемые объекты?Как мой первый проект, мне трудно понять, на что обращать внимание.
Гигантское спасибо заранее.BBQuercus