Изображение в изображение с U-Net без пропускных соединений. Это реально?

Вопрос или проблема

В общем, U-Net нужен для создания изображения в другом стиле, но с сохранением структуры. Например, полноценный рисунок из эскиза. Верно?

Я хочу сохранить стиль, но изменить структуру. Например, я хочу взять фото с смятой тканью и получить развернутую ткань. Но я не хочу использовать GAN. Для этого я решил убрать пропуски из U-Net, которые сохраняют структуру. И также я сворачиваю входное изображение в вектор стиля, как в GAN. Верно?

Проблема в том, что этот код успешно обучается, но только если в учебной базе данных нет аугментации. Как только я добавляю к входному изображению (только к входному, так как выход должен оставаться неизменным) угловую аугментацию +/- 5, 10 и 15 градусов, то вместо результата я получаю какой-то шум. Если я начинаю обучение на наборе данных из нескольких примеров, то результат правильный при применении аугментации. Но по мере увеличения числа примеров в наборе данных результат становится хуже.

Но в любом случае моя кривая (Loss:MSE) идеальна ))) Я имею в виду, даже если я получаю какой-то шум в результате (изображение), моя кривая выглядит так, будто я получаю идеальный результат. Просто падающая кривая. И это меня больше всего раздражает. Я не понимаю, как это возможно. Даже если я получаю какой-то шум в результате (изображение), кривая падает, как будто все в порядке. Примерно 0,09/0.05/0.02/0.01/…. Я называю это переобучением просто потому, что не знаю, что это такое. Я имею в виду, когда я не получаю правильный результат, но у вас падает кривая потерь, это называется переобучением. Верно?

Что касается мощности моей модели. Конечно, я думал об этом и изменял количество слоев, фильтров в слоях и нейронов в плотных слоях, но без успеха. Поэтому я думаю, что здесь есть какая-то концептуальная проблема.

Я использую некоторые примеры из учебного набора данных в качестве валидации, потому что хочу быть уверенным, что эта модель может корректно работать как минимум с моими учебными данными. Но, как я уже говорил, с аугментацией я получаю какой-то шум с идеальными потерями (MSE). Неважно, сколько эпох я использую – результат мусорный, кривая идеальна. Скорость обучения = 0.00006 * K (K = 5,4,3,2,1). Вход/выход – изображение (2562563). Adam.

l2_reg = regularizers.l2(1e-6)
initializer = initializers.he_normal()

def build_unet(input_shape=(256, 256, 3)):
    inputs = layers.Input(shape=input_shape)

    c = layers.Conv2D(16, kernel_size=4, strides=2, padding="same")(inputs)
    c = layers.LeakyReLU(negative_slope=0.2)(c) 

    c = layers.Conv2D(32, kernel_size=4, strides=2, padding="same")(c)
    c = layers.LeakyReLU(negative_slope=0.2)(c)

    c = layers.Conv2D(64, kernel_size=4, strides=2, padding="same")(c)
    c = layers.LeakyReLU(negative_slope=0.2)(c)

    c = layers.Conv2D(128, kernel_size=4, strides=2, padding="same")(c)
    c = layers.LeakyReLU(negative_slope=0.2)(c)

    c = layers.Conv2D(256, kernel_size=4, strides=2, padding="same")(c)
    c = layers.LeakyReLU(negative_slope=0.2)(c)

    c = layers.Conv2D(512, kernel_size=4, strides=2, padding="same")(c)
    c = layers.LeakyReLU(negative_slope=0.2)(c)

    # Узкое место
    b = InstanceNormalization()(c)

    b = layers.Reshape((-1,))(b)
    b = layers.Dense(1024, kernel_regularizer=l2_reg,)(b)
    b = layers.LeakyReLU(negative_slope=0.2)(b)

    b = layers.Dropout(0.2)(b)

    b = layers.Dense(1024*4*4, kernel_regularizer=l2_reg,)(b)
    b = layers.LeakyReLU(negative_slope=0.2)(b)
    b = layers.Reshape((4,4,1024))(b)

    # Декодер
    d = layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding="same")(b)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    d = layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding="same")(d)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    d = layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding="same")(d)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    d = layers.Conv2DTranspose(64, kernel_size=4, strides=2, padding="same")(d)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    d = layers.Conv2DTranspose(32, kernel_size=4, strides=2, padding="same")(d)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    d = layers.Conv2DTranspose(16, kernel_size=4, strides=2, padding="same")(d)
    d = layers.LeakyReLU(negative_slope=0.2)(d)

    outputs = layers.Conv2D(3, kernel_size=3, padding="same", activation="tanh")(d)

    model = models.Model(inputs=inputs, outputs=outputs, name="build_unet")
    return model

unet = build_unet()

adam_optimizer = Adam(
    learning_rate=0.00006*K,
)

unet.compile(optimizer=adam_optimizer, loss="mse", metrics= None)

Да, возможно реализовать задачу Image-to-Image с использованием U-Net без пропусков, но это значительно снизит способность модели захватывать высокоуровневые признаки из более ранних слоев, что является одной из ключевых сил архитектуры U-Net. U-Net обычно известен своим использованием пропусков, которые помогают передавать детальную пространственную информацию от.encoder к декодеру, что делает его очень эффективным для таких задач, как сегментация изображений и перевод изображений.

Без пропусков сеть может испытывать трудности с сохранением тонких деталей, что приводит к менее точным или низкокачественным выходным данным, особенно для задач, требующих высокой точности, таких как сегментация медицинских изображений или суперразрешение. Однако все-таки возможно модифицировать архитектуру U-Net для определенных случаев использования, но это может потребовать других техник, чтобы компенсировать потерю информации, которую предоставляют пропуски.

Ответ или решение

Изображение в изображение с использованием U-Net без пропускных соединений: это реально?

Введение

U-Net — это мощная архитектура нейронных сетей, изначально предназначенная для задач сегментации изображений. Основной принцип U-Net заключается в использовании пропускных соединений, которые помогают сохранять пространственную информацию в процессе обучения. Однако вы задаетесь вопросом: возможно ли адаптировать U-Net для задач преобразования изображений без использования этих пропускных соединений и при этом достичь желаемых результатов? В данной статье мы рассмотрим ключевые моменты, а также возможные проблемы, возникающие в процессе обучения таких моделей.

Структура и особенности U-Net

U-Net изначально разработан с учетом многих аспектов, включая:

  • Структурные пропускные соединения: Они обеспечивают передачу детальной информации из кодировщика в декодер, что критично для сохранения деталей выходного изображения.
  • Кодировщики и декодеры: U-Net состоит из двух частей, где первый отвечает за сжатие данных, а второй — за их восстановление.

Удаление пропускных соединений

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

  • Потере информации: Запись высокой детализации на выходе может стать трудной.
  • Низкому качеству изображений: В результате можно получить шумные или размытые изображения, особенно в сложных задачах, таких как преобразование стиля.

Проблемы с обучением

Вы описываете, что ваша модель показывает идеальную кривую потерь (Loss) при использовании среднеквадратичной ошибки (MSE), однако результаты изображений выглядят как шум. Это часто происходит из-за:

  • Переобучения: Если модель адаптируется к данным без реального понимания их структуры, это приводит к ситуации, когда она “запоминает” данные, а не обучается их обобщению.
  • Проблем с аугментацией: При добавлении аугментации, такой как угловая аугментация, модель может не справляться с изменениями, так как теряет всю полезную информацию, полученную из пропускных соединений.
  • Дефицит данных: Ваша модель может работать на небольших выборках данных, но с увеличением их числа происходит ухудшение качества, поскольку разнообразие данных не поддерживается недостаточной сложностью модели.

Рекомендации

Для решения этих проблем можно рассмотреть следующие подходы:

  1. Вернуться к архитектуре с пропускными соединениями: Это даст модели возможность сохранять детальную пространственную информацию.
  2. Увеличить количество данных для обучения: Более разнообразные данные могут помочь модели лучше обобщать информацию.
  3. Экспериментировать с гиперпараметрами: Оцените различные значения скорости обучения и регуляризации, чтобы предотвратить переобучение.

Заключение

С учетом описанных деталей можно утверждать, что создание модели Image-to-Image с использованием U-Net без пропускных соединений действительно возможно, но это приведет к значительным ограничениям в производительности. Для достижения высококачественных результатов стоит рассмотреть возврат к оригинальной архитектуре с пропускными соединениями и оптимизацию подхода к обучению. Это будет наиболее эффективным путем к успеху в ваших задачах преобразования изображений.

Оцените материал
Добавить комментарий

Капча загружается...