В данной статье хочу разобрать применение предобученной нейронной сети ESRGAN для увеличения разрешения изображения в четыре раза c использованием tensorflow hub.

Инструменты

Буду пользоваться языком программирования python 3.10, среда разработки - jupyter notebook.

Проведем импорт необходимых библиотек. Для работы с нейронными сетями воспользуемся tensorflow. Для работы с уже обученной моделью ESRGAN будем пользовать tensorflow hub. Также нам потребуется библиотека для работы с изображениями, возьмем PILLOW.

from PIL import Image
import tensorflow as tf
import tensorflow_hub as hub

Предподготовка изображения

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

  • Картинка должна быть с плавающей запятой, преобразованной с использованием tf.cast(image, tf.float32).

  • 4-х мерные входные параметры, [batch_size, height, width, 3]. Чтобы применить сверхвысокое разрешение к одному изображению, воспользуемся tf.expand_dims(image, 0) чтобы добавить пакетное измерение.

  • Для отображения изображения, необходимо преобразовать его обратно в uint8с использованием tf.cast(tf.clip_by_value(image[index_of_image_to_display], 0, 255), tf.uint8)

Входное изображение. Размер 640х480 пикселей. (изображено ультразвуковое исследование сердца )

Разрешение 640*480 пикселей.
Разрешение 640*480 пикселей.
# определим путь к входному изображению
image_path = './result_images/frame6.jpg'
преобразуем входное изображения согласно условиям
hr_image = tf.image.decode_image(tf.io.read_file(image_path))
image = tf.expand_dims(hr_image, 0)
image = tf.cast(image, tf.float32)

Работа с ESRGAN

Модель располагается в хранилище tensorflow hub.

# проведем загрузку модели
model = hub.load("https://tfhub.dev/captain-pool/esrgan-tf2/1")
выполним 4x увеличения изображения
super_resolution = model(image)

Постобработка изображения

Преобразуем 4х картинку обратно в uint8 и сохраним в папку.

image = np.asarray(super_resolution)
image = tf.clip_by_value(image, 0, 255)
image = Image.fromarray(tf.cast(image[0], tf.uint8).numpy())
image.save('./SR.jpg'% count)

Выходное изображение. Разрешение 2560 * 1920 пикселей.

Разрешение 2560 * 1920 пикселей.
Разрешение 2560 * 1920 пикселей.

Заключение

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

Комментарии (21)


  1. Alexufo
    08.08.2022 14:53
    +12

    А на сколько корректно привлекать додумываюшие алгоритмы в медицинских изображениях? Информации разве стало больше? Она же предвнесена со стороны, это же не фильтрующие или аппроксимирующие алгоритмы. Просто компьютер дорисовал для красоты пикселей.


    1. TimurAbdualimov Автор
      08.08.2022 15:05
      -8

      А почему бы не попробовать?)

      Визуально картинка больше и чётче. Шанс на ошибку меньше.


      1. DistortNeo
        08.08.2022 15:11

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


        1. Alexufo
          08.08.2022 15:12

          В голове тренируется свой суперрезолюшн под названием опыт.


          1. aamonster
            08.08.2022 15:37

            Только он тренируется на осмысленной обучающей выборке (опыт врача), а у вас на чём? Была база УЗИ-изображений с четырёхкратным разрешением или учили на обычных фотках – пейзажи там всякие, портреты, натюрморты?


          1. TimurAbdualimov Автор
            08.08.2022 16:36

            Согласен


      1. Alexufo
        08.08.2022 15:12
        +16

        Можно конечно попробовать, но шанс на ошибку может быть наоборот больше. Нельзя использовать додумывающие алгоритмы. Они же додумывают с потолка.
        image


        1. TimurAbdualimov Автор
          08.08.2022 16:48
          -3

          Там любая картинка подходит. Просто медицина мне близка, поэтому интересно было на медизображениях глянуть.


      1. Moskus
        11.08.2022 07:47

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


        1. TimurAbdualimov Автор
          11.08.2022 09:08

          Так глаза есть) Важно понимание процесса)


    1. DistortNeo
      08.08.2022 15:09
      +12

      Абсолютно некорректно. Могут вылезти детали, которых на исходной картинке и не было.


      1. TimurAbdualimov Автор
        09.08.2022 15:19
        -1

        Или были?)


    1. SiGMan
      08.08.2022 15:29
      +2

      даже такое случалось https://habr.com/ru/post/189010/ и это еще без нейронок


  1. mSnus
    08.08.2022 21:00
    +2

    Когда-нибудь до людей дойдет, что результаты нейронок в критичных моментах нельзя использовать никогда


    1. TimurAbdualimov Автор
      09.08.2022 13:08
      -1

      Вам с Илоном Маском и Microsoft по пути;)


    1. Moskus
      11.08.2022 07:54
      +1

      Вероятно, "до людей" (т.е. массового потребителя) не дойдет никогда в обозримом будущем, потому что число тех, кто очень плохо умеет пользоваться мозгами, уменьшается очень медленно.

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

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


      1. TimurAbdualimov Автор
        11.08.2022 09:21

        Надо бы статью написать про восстановление поврежденных старых фото, как раз собирался)


        1. mSnus
          11.08.2022 11:54

          Была такая статья пару лет назад. Там восстанавливали фото старых машин. И те, кто не знали, как должны выглядеть детали типа фар и решёток радиаторов, восхищались, а те, кто знали - плакали.

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

          И говорить, что это "повышение разрешения" или "восстановление фото" - значит, заниматься (само)обманом, это не повышение и не восстановление. Это всего лишь догадки о том, как всё могло бы быть.


  1. habr4yota
    08.08.2022 21:25
    +2

    upscale решил что у вас родится динозавр за углом


  1. Chuvi
    09.08.2022 12:24

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


    1. TimurAbdualimov Автор
      11.08.2022 10:54

      Отлично. Я показал как с помощью минимального количества кода можно увеличить разрешение изображение в четыре раза при помощи нейронных сетей.

      Про медицинскую ценность несогласен. Если уж пользоваться такой логикой то можно и от всех методов диагностики отказаться. От УЗИ например точно, там тоже возможны артефакты и несуществующие детали вследствие погрешности самого метода.

      Важно понимание процесса, опыт и ракурсы)