Керас объединяет партии одного изображения после тренировки - PullRequest
4 голосов
/ 13 июля 2020

Я использую автоэнкодер для шумоподавления полутоновых изображений высокого разрешения. Каждое изображение делится на субпакеты определенного размера, например 52 x 52, и модель работает с каждым из этих пакетов, в результате чего результатом является конкатенация пакетов с шумоподавлением в каждом изображении обратно к исходному. Ниже приведен пример изображения после результата:

Пакеты деноминированные

Вы можете увидеть меньшие пакеты изображений после объединения. Как преодолеть такое поведение?

Я думал о дальнейшей обработке, например о добавлении размытия к краям, чтобы смешать их вместе, но я думаю, что это не оптимальное решение.

код конкатенации:


num_hor_patch = 19
num_ver_patch = 26

print("Building the Images Batches")
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = predictions[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    output.append(restored_image)

start_pos = 0
test_data = np.array([np.reshape(test_data[i], (52, 52)) for i in range(test_data.shape[0])])
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = test_data[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    input.append(restored_image)

start_pos = 0
test_noisy_data = np.array([np.reshape(test_noisy_data[i], (52, 52)) for i in range(test_noisy_data.shape[0])])
for i in range(num_image):
    reconstruct = []
    for j in range(num_hor_patch):
        from_vertical_patches = test_noisy_data[start_pos:(start_pos+num_ver_patch)]
        horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
        start_pos += num_ver_patch
        reconstruct.append(horizontal_patch)

    restored_image = np.concatenate(np.array(reconstruct), axis=0)
    noisy.append(restored_image)

print("Exporting the Model")
output_model['output'] = output
output_model['original'] = input
output_model['noisy'] = noisy

Ответы [ 2 ]

1 голос
/ 30 июля 2020

Судя по изображению, вы имеете дело с изображениями с разрешением ~ 400x800. Для этого 16-32 ГБ памяти графических процессоров V100 должно быть достаточно для приличных размеров партии с приличной емкостью модели! Даже если нет, то вы можете уменьшить использование памяти в 2-4 раза, используя смешанную точность или даже fp16.

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

Вы можете взглянуть на эту UNET архитектуру, которую вам нужно будет преобразовать из Conv3D в Conv2D и переключиться с сегментации на уменьшение шума задача.

https://github.com/tensorflow/mesh/blob/master/mesh_tensorflow/experimental/unet.py

0 голосов
/ 23 июля 2020

Так что поправьте меня, если я ошибаюсь, но у вас есть следующая проблема:

  • Автоэнкодер Denoise, который получает изображения 52x52
  • Изображение размером HxW, где W >> 52 и H >> 52

и вопрос в том, как использовать автокодер для удаления шума из изображения?

Ваше текущее решение:

  1. разделить изображение в без перекрытия плитки
  2. Для каждой плитки шумоподавление с помощью автокодировщика
  3. Объедините полученные обрезанные плитки для формирования исходного изображения

Это решение дает очень несогласованный результат в шве между плитками.

Я думаю, вам нужно использовать перекрывающиеся плитки, а не неперекрывающиеся плитки.

Это означает, что каждый пиксель является частью нескольких тайлов, а не только одного. И поэтому будет иметь несколько шумоизолированных значений, по одному от каждой плитки, частью которой он является. 1033 *

Новое решение:

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