首页 > 解决方案 > 无法使用 unet 获得有效输出

问题描述

我正在尝试用 R 编程语言学习 keras、tensorflow 和 unet 的 CNN。我离优化还很远,我目前的目标是得到一个 output。我从教程中获取了代码。在教程中,他们使用了Caravana 数据集。因为我无法获得这个数据集,所以我无法按原样复制教程,所以我构建了自己的数据集,该数据集由数字地形模型中的 1250 条道路组成。

在此处输入图像描述

然后我修改了教程中的示例,暂时删除了数据增强,因为我不知道如何对图像和蒙版应用相同的修改。我还让它在改变输入形状的灰度图像上工作。最后,我尝试使用用于训练的相同图像进行预测。在这个阶段,这并不重要。我试图得到一个输出而不是什么。

library(unet)
library(keras)
library(tfdatasets)
library(tidyverse)
library(rsample)
library(reticulate)

create_dataset <- function(data, train, batch_size = 32L) {
  dataset <- data %>%
    tensor_slices_dataset() %>%
    dataset_map(~.x %>% list_modify(
      img = tf$image$decode_jpeg(tf$io$read_file(.x$img)),
      mask = tf$image$decode_gif(tf$io$read_file(.x$mask))[1,,,][,,1,drop=FALSE]
    )) %>%
    dataset_map(~.x %>% list_modify(
      img = tf$image$convert_image_dtype(.x$img, dtype = tf$float32),
      mask = tf$image$convert_image_dtype(.x$mask, dtype = tf$float32)
    )) %>%
    dataset_map(~.x %>% list_modify(
      img = tf$image$resize(.x$img, size = shape(128, 128)),
      mask = tf$image$resize(.x$mask, size = shape(128, 128))
    ))

  # train in batches; batch size might need to be adapted depending on
  # available memory
  dataset <- dataset %>% dataset_batch(batch_size)

  # output needs to be unnamed
  dataset %>% dataset_map(unname)
}

dice <- custom_metric("dice", function(y_true, y_pred, smooth = 1.0) {
  y_true_f <- k_flatten(y_true)
  y_pred_f <- k_flatten(y_pred)
  intersection <- k_sum(y_true_f * y_pred_f)
  (2 * intersection + smooth) / (k_sum(y_true_f) + k_sum(y_pred_f) + smooth)
})

model <- unet(input_shape = c(128, 128, 1))

model %>% compile(
  optimizer = optimizer_rmsprop(lr = 1e-5),
  loss = "binary_crossentropy",
  metrics = list(dice, metric_binary_accuracy)
)

images_dir <- "data/images/"
masks_dir <- "/data/masks/"


data <- tibble(
  img = list.files(images_dir, full.names = TRUE),
  mask = list.files(masks_dir, full.names = TRUE)
)

training_dataset <- create_dataset(data, train = TRUE, batch_size = 32L)
validation_dataset <- create_dataset(data, train = FALSE, batch_size = 32L)

model %>% fit(training_dataset, epochs = 10)

predicted_mask <- predict(model, validation_dataset)

u = validation_dataset %>% as_iterator() %>% iter_next()
u1 = u[[1]] %>% array_branch(1)
u2 = u[[2]] %>% array_branch(1)
image(u1[[1]][,,1], asp = 1, col = gray.colors(50,0,1))
image(u2[[1]][,,1], asp = 1, col = gray.colors(50,0,1))
image(predicted_mask[1,,,1], asp = 1, col = gray.colors(50,0,1))

无论有多少 epoch 或多少训练图像,我使用的最佳输出都是这样的:

在此处输入图像描述

我的代码和流程有什么问题?我并不期待第一次尝试的出色结果,而只是一个非随机输出,可以帮助我从工作代码开始。

标签: rtensorflowkerasconv-neural-networksemantic-segmentation

解决方案


推荐阅读