Представьте, что вы пробираетесь на суперзакрытую вечеринку, где собираются только знаменитости. У вас есть маленький шпионский инструмент, который незаметно фотографирует знаменитостей. И вы уже представляете, как будете показывать друзьям фото их кумиров, но вот беда на шпионской камере слишком мало памяти и фотографии имеют слишком маленькое разрешение. Фото слишком маленькое, и вы не можете понять, певица это Кеша или Леди Гага…
Сегодня мы разберемся, как сделать изображение сверхвысокого разрешения из фотографии с маленьким разрешением, используя модель Efficient Sub-Pixel CNN. . А мы будем обучать нашу модель на фото знаменитостей. Давайте начнем!

Масштабирование изображения

В качестве задачи мы будем конвертировать изображения лиц размером 32x32 пикселя в 128x128 пикселей.
Существует довольно много способов масштабирования изображений. Одним из таких способов является интерполяция изображения. В этой статье мы не будем рассматривать алгоритмы и виды интерполяции, подробно об этом можно прочитать здесь. Но дает ли интерполяция изображения человеческого лица ожидаемый результат?

Интерполяция происходит путем нахождения неизвестных промежуточных значений (пикселей) на существующем дискретном наборе его известных значений определенным образом. Поэтому интерполяция не может восстановить мелкие детали, присущие человеческому лицу, из информации с низким разрешением. Ниже приведен результат бикубической интерполяции изображения 32x32 в 128x128.

Попробуем применить модель Эффективная субпиксельная CNN. Модель Efficient Sub-Pixel CNN представляет собой специализированную архитектуру, предназначенную для задач сверхвысокого разрешения изображений. Он состоит из последовательности сверточных слоев, которые постепенно извлекают и улучшают характеристики входного изображения. Отличительной чертой этой модели является включение субпиксельной свертки, метода, который позволяет генерировать выходные данные с высоким разрешением. Структура этой модели показана ниже.

Таким образом, размер нашего пакета равен 8, оптимизатором является keras.optimizers.Adam со значением Learning_rate по умолчанию 0,001, и мы будем использовать MeanSquaredError() для метрики функции потерь. Наши входные данные x — это четырехмерный тензор размера (8, 32, 32,1), где форма — это batch_size + (высота, ширина, каналы), а y — это Четырехмерный тензор формы (8, 128, 128,1).

Давайте рассмотрим 4-й сверточный слой и масштабирование более подробно.

В финальном слое мы должны установить количество фильтров следующим образом — channels * (upscale_factor ** 2). Channels — это количество каналов, которые были на входном изображении (и которые мы хотим получить на нашем выходе), а upscale_factor — сколько раз мы хотим масштабировать изображение. Для масштабирования изображения будет использоваться операция tf.nn.depth_to_space.

tf.nn.depth_to_space(x, upscale_factor) берет копию тензора x из последнего сверточного слоя, где значения из измерения глубины перемещаются в пространственных блоках в измерения высоты и ширины. Глубина входного тензора должна быть кратна upscale_factor * upscale_factor. Поэтому мы возводим в квадрат upscale_factor в последнем слое.

Исследовательский анализ данных

Как указывалось ранее, мы будем использовать набор данных celebA. Набор данных атрибутов CelebFaces (CelebA) — это крупномасштабный набор данных атрибутов лиц, содержащий более 40 000 изображений знаменитостей.

Для себя я усвоил несколько правил предварительного анализа данных:
- анализ размеров изображений
- анализ яркости/размытости изображений.

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

image_shapes = []

for path in os.listdir(celeba_folder):
    image_path = os.path.join(celeba_folder, path)
    image = cv2.imread(image_path)

    # Obtain shape of each image and store them in an array
    (width, height) = image.shape[1], image.shape[0]
    image_shapes.append((width, height))


# Return only unique shapes
unique_shapes = list(set(image_shapes))

После выполнения кода было идентифицировано 1447 уникальных измерений.

Для анализа размытия изображений воспользуемся дисперсией лапласиана. Дисперсия лапласиана используется в качестве оператора меры фокусировки, чтобы различать размытые изображения и изображения в фокусе. Чем ниже значение, тем более размыто изображение. Подробнее о обнаружении размытия вы можете прочитать здесь.

Мы вычислим дисперсию лапласиана, используя библиотеку OpenCV.

cv.Laplacian(image, cv.CV_64F).var()

После выполнения кода мы можем сравнить изображения с низким и высоким уровнем дисперсии лапласиана.

Большая разница между изображениями по размеру и степени размытия влияет на качество модели и ее обучение.
Поэтому для решения проблемы размерности мы приводим все изображения к одному размеру (в нашем случае 32x32) с помощью функции cv.resize().

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

Давайте отфильтруем изображения, установив пороговое значение 1000 для дисперсии лапласиана. Поэтому мы удалим наиболее размытые изображения без существенного сокращения данных.

Переход с RGB на YUV

Известно, что зрение человека менее чувствительно к цвету предметов, чем к их яркости. В цветовом пространстве RGB все три цвета считаются одинаково важными и обычно сохраняются с одинаковым разрешением. Однако можно более эффективно отображать цветное изображение, отделяя информацию о яркости от информации о цвете и представляя ее с более высоким разрешением, чем цвет.

YUV — это цветовое пространство, которое разделяет информацию о яркости (Y) и цветности (UV). Яркость инкапсулирует компонент яркости изображения, а цветность связана с цветовыми вариациями. Разделяя эти компоненты, цветовое пространство YUV создает среду, в которой яркостью можно управлять независимо от цвета, что является фундаментальной концепцией для улучшения изображения. Компонент яркости Y рассчитывается как средневзвешенное значение компонентов R, G, B по следующей формуле:

где k указывает соответствующий весовой коэффициент.

Результаты и визуальное сравнение

После цветовых преобразований и обучения модели мы, наконец, можем увидеть результат нашей работы. Ниже приведены примеры масштабированного изображения 32 x 32 до 128 x 128 с использованием модели Efficient Sub-Pixel CNN.

Заключение

Модель Efficient Sub-Pixel CNN представляет собой серию сверточных слоев, дополненных субпиксельной сверткой. Такой дизайн позволяет модели фиксировать сложные особенности изображений с низким разрешением и интеллектуально реструктурировать их для увеличения разрешения, в результате чего получаются высококачественные изображения с улучшенной четкостью и детализацией. Преимущество этой модели еще и в том, что в конце обучения модели происходит масштабирование, что положительно сказывается на производительности.
Мы также проанализировали набор данных и транспонировали изображения из цветового пространства RGB в YUV, что в целом дало неплохие результаты. .

Большое спасибо, что вы со мной!
Буду рада ответить на ваши вопросы и комментарии!

Найдите меня в LinkedIn.