Pytorch — Используйте UNet для удаления размытия изображения/Восстановления изображения

#python #image #image-processing #deep-learning #pytorch

Вопрос:

В настоящее время я работаю с набором данных, в котором у меня есть два вида изображений: «четкая версия» изображения и «размытая версия» тех же изображений, где размытие было добавлено синтетически. Моя цель состоит в том, чтобы обучить модель, которая использует размытую версию изображений и пытается максимально стереть изображение, чтобы «размытое изображение» было ближе к четкой версии. В литературе архитектура UNet казалась моделью с хорошими результатами. Кроме того, я могу использовать предварительно обученную U-сеть через Pytorch (https://pytorch.org/hub/mateuszbuda_brain-segmentation-pytorch_unet/).

Моя проблема сейчас в следующем: когда я тренирую эту предварительно обученную U-Сеть с помощью своих изображений, а затем пробую ее на своем тестовом наборе, я получаю следующий результат:

Выход

Исходное изображение:

Оригинал

Я знаю, что эта предварительно обученная модель обычно используется для сегментации биомедицинских изображений, но я довольно смущен тем, как я должен модифицировать модель, чтобы использовать ее для задачи удаления/реконструкции изображения. У кого-нибудь есть какие-нибудь советы о том, как это сделать?

Я был бы признателен за любую обратную связь 🙂

Ответ №1:

U-сеть, которую вы используете, предназначена для сегментации (классификации каждого пикселя изображения), в то время как вы пытаетесь уменьшить шум изображения (сделать изображение «более четким»/удалить шум). Это объясняет полученные вами результаты.

Чтобы получить то, что вам нужно, и, как сказал Дерек, вам сначала нужно изменить количество каналов вывода. Изменив его, вы не сможете загрузить всю предварительно подготовленную модель. Вам придется копировать параметры по параметрам до последнего.

Поскольку последний слой инициализируется случайным образом, вы можете переподготовить модель с помощью своего обучающего набора. Вы можете заморозить или не заморозить предварительно подготовленные детали.

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

Ответ №2:

Из прилагаемой ссылки:

 import torch
model = torch.hub.load('mateuszbuda/brain-segmentation-pytorch', 'unet',
    in_channels=3, out_channels=1, init_features=32, pretrained=True)
 

Модель, которую вы определяете, имеет один выходной канал, в результате чего выводится изображение в оттенках серого. Вам нужно 3 выходных канала для изображения RGB.

Комментарии:

1. Большое вам спасибо за ваш вклад! Когда я изменил аргумент «out_channels» на 3, к сожалению, я получаю следующее сообщение об ошибке: Ошибка времени выполнения: Ошибка(ы) при загрузке state_dict для UNet: несоответствие размера для conv.вес: копирование параметра с помощью формы. Размер([1, 32, 1, 1]) с контрольной точки форма в текущей модели-факел.Размер([3, 32, 1, 1]). несоответствие размера для conv.смещения: копирование параметра с формой torch.Size([1]) из контрольной точки, форма в текущей модели-torch.Size([3]).

2. Но что касается моего первоначального результата: я изменил каналы вывода в последнем слое Conv2d с 1 на 3, что привело к результату в вопросе

3. Да, это ожидаемо. Это связано с тем, что сохраненный файл, который вы пытаетесь загрузить, предполагает, что модель имеет иную структуру, чем в вашем случае. Вы можете попытаться найти другой файл предварительно подготовленной модели (возможно, здесь github.com/qubvel/segmentation_models.pytorch ), или вы можете изменить state_dict так, чтобы он имел те же размеры параметров, что и модель (инициализируйте новые параметры случайными весами и изучите их во время обучения).