Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В данной статье хочу разобрать применение предобученной нейронной сети 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)
Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
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 можно увеличить изображение в четыре раза с использованием минимального количества кода.
Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть 4-х мерным,
[batch_size, height, width, 3]
. Чтобы применить сверхвысокое разрешение к одному изображению, используйтеtf.expand_dims(image, 0)
добавить пакетное измерение.Чтобы отобразить изображение, не забудьте преобразовать его обратно в
uint8
с использованием Изображение должно быть изображением с плавающей запятой, преобразованным с использованиемtf.cast(image, tf.float32)
.Изображение должно быть 4-х мерным,
[batch_size, height, width, 3]
. Чтобы применить сверхвысокое разрешение к одному изображению, используйтеtf.expand_dims(image, 0)
добавить пакетное измерение.Чтобы отобразить изображение, не забудьте преобразовать его обратно в
uint8
с использованиемИзображение должно быть изображением с плавающей запятой, преобразованным с использованием
tf.cast(image, tf.float32)
.Изображение должно быть 4-х мерным,
[batch_size, height, width, 3]
. Чтобы применить сверхвысокое разрешение к одному изображению, используйтеtf.expand_dims(image, 0)
добавить пакетное измерение.Чтобы отобразить изображение, не забудьте преобразовать его обратно в
uint8
с использованием