Автоэнкодеры раскрашивания с использованием Hard

Опубликовано: 21 Июля, 2021

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

Как мы все знаем, у AutoEncoder есть два основных оператора:

Encoder This transforms the input into low-dimensional latent vector.As it reduces dimension, so it is forced to learn the most important features of the input.
Decoder: This tries to reconstruct the input as much as possible from the latent vector.

При разработке Autoencoder очень важно правильно выбрать скрытый размер. Как будто это
больше, чем размер ввода, Autoencoder имеет тенденцию запоминать ввод. Мы реализуем часть кодировщика с использованием CNN и будем использовать Conv2DTranspose для раздела декодера автокодировщика.

Для простоты мы собираемся использовать набор данных CIFAR100 , который легко доступен в наборах данных Keras.
Набор данных содержит 50 тыс. Цветных изображений формы 32 * 32 * 3 для обучения и 10 тыс. Цветных изображений той же формы для целей тестирования.
Код: импортировать все библиотеки

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




def rgb_2_gray(image):
return np.dot(image[..., : 3 ], [ 0.299 , 0.587 , 0.114 ])

Код: загрузить набор данных




(x_train, _), (x_test, _) = cifar100.load_data()

Чтобы модель могла эффективно обучаться, лучше преобразовать изображения в плавающие. Нам также необходимо нормализовать значения, чтобы они лежали между 0 и 1 . Это сделано для того, чтобы при обратном распространении градиенты не выходили из-под контроля.

Код: нормализовать данные




x_train = x_train.astype( 'float32' ) / 255.
x_test = x_test.astype( 'float32' ) / 255.
x_train_gray = x_train_gray.astype( 'float32' ) / 255.
x_test_gray = x_test_gray.astype( 'float32' ) / 255.

Производительность моделей глубокого обучения во многом зависит от набора гиперпараметров (включая количество слоев, количество фильтров в каждом слое, размер пакета и т. Д.). Так что правильный выбор гиперпараметров - важный навык. Для достижения наилучших результатов нам нужно попробовать и поэкспериментировать с другим набором из них. Здесь мы используем эти наборы гиперпараметров,
Код: гиперпараметры




input_shape = (rows, cols, 1 )
batch_size = 32
kernel_size = 3
latent_dim = 256
layer_filters = [ 64 , 128 , 256 ]

Для задачи раскрашивания входом является изображение в градациях серого. Полутоновое изображение имеет только 1 канал по сравнению с цветными изображениями, которые имеют 3 канала, а именно красный, зеленый и синий. Мы используем входные данные из библиотеки Keras, чтобы получить входные данные формы (rows, cols, 1) .
Кодировщик представляет собой стек из 3 сверточных слоев с увеличивающимся числом фильтров, за которым следует плотный слой с 256 единицами для генерации скрытых векторов.

Код: кодировщик




inputs = Input (shape = input_shape)
x = inputs
for filters in layer_filters:
x = Conv2D(filters = filters,
kernel_size = kernel_size,
strides = 2 ,
activation = 'relu' ,
padding = 'same' )(x)
shape = K.int_shape(x)
x = Flatten()(x)
latent = Dense(latent_dim, name = 'latent_vector' )(x)
encoder = Model(inputs, latent, name = 'encoder' )

Секция декодера автоэнкодера пытается распаковать скрытый вектор на вход. В нашем случае входом в декодер является слой формы (None, 256) . Он следует за стеком из трех слоев DeConvolutional с уменьшением количества фильтров в каждом слое. Следим за тем, чтобы последний слой в данном случае имел форму (Нет, 32, 32, 3) . Количество каналов должно быть 3, чтобы можно было сравнить реконструкцию с истинностью изображений во время обратного распространения.
Не обязательно, чтобы кодировщик и декодер были их зеркальным отображением.

Код: декодер




latent_inputs = Input (shape = (latent_dim, ), name = 'decoder_input' )
x = Dense(shape[ 1 ] * shape[ 2 ] * shape[ 3 ])(latent_inputs)
x = Reshape((shape[ 1 ], shape[ 2 ], shape[ 3 ]))(x)
# stack of Conv2DTranspose(256)-Conv2DTranspose(128)-
# Conv2DTranspose(64)
for filters in layer_filters[:: - 1 ]:
x = Conv2DTranspose(filters = filters,
kernel_size = kernel_size,
strides = 2 ,
activation = 'relu' ,
padding = 'same' )(x)
outputs = Conv2DTranspose(filters = channels,
kernel_size = kernel_size,
activation = 'sigmoid' ,
padding = 'same' ,
name = 'decoder_output' )(x)
decoder = Model(latent_inputs, outputs, name = 'decoder' )

Наконец, мы определяем модель с именем autoencoder, которая принимает входные данные, а затем передает их кодировщику, а затем передает их через декодер.




autoencoder = Model(inputs, decoder(encoder(inputs)),
name = 'autoencoder' )

Теперь мы обучаем модель автоэнкодера, разделяя все данные на пакеты размером пакета = batch_size на 30 эпох . Здесь важно отметить, что, если мы проверим функцию соответствия, мы обнаружим, что входными данными для модели является набор данных изображений в градациях серого, а соответствующее цветное изображение служит меткой. То же самое происходит и с набором проверки.
Как правило, для задачи классификации мы загружаем изображения в модель в качестве входных данных, а их соответствующие классы указываются в виде меток. и во время обучения мы сравниваем производительность модели, измеряя, насколько хорошо она классифицирует изображения по соответствующим классам, указанным в виде меток. Но для этой задачи мы предоставляем цветные изображения в качестве меток, поскольку мы хотим, чтобы модель предоставляла изображения RGB в качестве выходных данных, когда w предоставляет ей изображение в градациях серого.
Мы также использовали обратные вызовы, чтобы снизить скорость обучения, если потери при проверке не сильно уменьшаются.




autoencoder.fit(x_train_gray,
x_train,
validation_data = (x_test_gray, x_test),
epochs = 30 ,
batch_size = batch_size,
callbacks = callbacks)

Код: результаты и анализ

Подлинность первых 100 тестовых изображений

Ввод оттенков серого в автоэнкодер

Цветной вывод из автоэнкодера

Автоэнкодер имеет приемлемую производительность в работе по раскрашиванию. Он правильно предсказал, что небо голубое, шимпанзе имеют разные оттенки коричневого, листья зеленые и т. Д. Но также он делает некоторые неверные прогнозы, например, в подсолнечнике есть оттенки серого, оранжевый цвет не имеет предсказанного цвета, гриб темный, не красноватый и т. д.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.