В данной статье хочу разобрать применение предобученной нейронной сети 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 пикселей. (изображено ультразвуковое исследование сердца )
# определим путь к входному изображению
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 пикселей.
Заключение
В данной статье рассмотрено как с использованием предобученной нейронной сети ESRGAN можно увеличить изображение в четыре раза с использованием минимального количества кода.
Комментарии (21)
mSnus
08.08.2022 21:00+2Когда-нибудь до людей дойдет, что результаты нейронок в критичных моментах нельзя использовать никогда
Moskus
11.08.2022 07:54+1Вероятно, "до людей" (т.е. массового потребителя) не дойдет никогда в обозримом будущем, потому что число тех, кто очень плохо умеет пользоваться мозгами, уменьшается очень медленно.
Вот до судебных разбирательств по факту причинения смерти или увечий, как результата использования машинного обучения для дорисовывания несуществующих деталей в medical imaging - вполне может дойти, особенно если залечат кого-нибудь с достаточно существенным банковским счетом или размером страховой выплаты (тогда истцом будет выступать страховая компания).
Еще один интересный "водораздел", который делит людей на имбецилов, неспособных понять, что несуществующую информацию (не путать с рассеянной по известному закону, что относится к расфокусированным изображениям, например) нельзя "восстановить" и тех, кто это понимает.
TimurAbdualimov Автор
11.08.2022 09:21Надо бы статью написать про восстановление поврежденных старых фото, как раз собирался)
mSnus
11.08.2022 11:54Была такая статья пару лет назад. Там восстанавливали фото старых машин. И те, кто не знали, как должны выглядеть детали типа фар и решёток радиаторов, восхищались, а те, кто знали - плакали.
Надо очень чётко понимать, что нейросеть всегда генерирует только "рисунок по мотивам", причём только исходя из собственного опыта (который может быть очень поверхностным).
И говорить, что это "повышение разрешения" или "восстановление фото" - значит, заниматься (само)обманом, это не повышение и не восстановление. Это всего лишь догадки о том, как всё могло бы быть.
Chuvi
09.08.2022 12:24Отлично. Вы взяли медицинское изображение. Скорее всего оно было в формате DICOM, ибо медицинские данные должны храниться в нём. И превратили его в красивую улучшенную картинку, не имеющую никакой медицинской ценности.
TimurAbdualimov Автор
11.08.2022 10:54Отлично. Я показал как с помощью минимального количества кода можно увеличить разрешение изображение в четыре раза при помощи нейронных сетей.
Про медицинскую ценность несогласен. Если уж пользоваться такой логикой то можно и от всех методов диагностики отказаться. От УЗИ например точно, там тоже возможны артефакты и несуществующие детали вследствие погрешности самого метода.
Важно понимание процесса, опыт и ракурсы)
Alexufo
А на сколько корректно привлекать додумываюшие алгоритмы в медицинских изображениях? Информации разве стало больше? Она же предвнесена со стороны, это же не фильтрующие или аппроксимирующие алгоритмы. Просто компьютер дорисовал для красоты пикселей.
TimurAbdualimov Автор
А почему бы не попробовать?)
Визуально картинка больше и чётче. Шанс на ошибку меньше.
DistortNeo
Я от врачей слышал, что они просто привыкают к изображениям с определёнными характеристиками. Если изображение становится больше или чётче, то опытному врачу придётся заново калиброваться.
Alexufo
В голове тренируется свой суперрезолюшн под названием опыт.
aamonster
Только он тренируется на осмысленной обучающей выборке (опыт врача), а у вас на чём? Была база УЗИ-изображений с четырёхкратным разрешением или учили на обычных фотках – пейзажи там всякие, портреты, натюрморты?
TimurAbdualimov Автор
Согласен
Alexufo
Можно конечно попробовать, но шанс на ошибку может быть наоборот больше. Нельзя использовать додумывающие алгоритмы. Они же додумывают с потолка.
TimurAbdualimov Автор
Там любая картинка подходит. Просто медицина мне близка, поэтому интересно было на медизображениях глянуть.
Moskus
Шанс на ошибку больше, потому что неизвестно, что нейросеть дорисовала, то есть просто выдумала.
TimurAbdualimov Автор
Так глаза есть) Важно понимание процесса)
DistortNeo
Абсолютно некорректно. Могут вылезти детали, которых на исходной картинке и не было.
TimurAbdualimov Автор
Или были?)
SiGMan
даже такое случалось https://habr.com/ru/post/189010/ и это еще без нейронок