Вопрос или проблема
Я работаю над GAN. Основываясь на различных статьях, я использую функцию активации Tanh на последнем слое генератора, которая производит выходные данные в диапазоне [-1,1].
Чтобы это было согласованно, я использую нормализацию изображения с помощью cv2:
cv2.normalize(image, image, alpha=-1, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
Пример:
(первое изображение 32,32, второе, вероятно, 128,128, это для демонстрации)
Мы можем четко увидеть, что цвета не одинаковы. После обучения моделей в течение 10 часов я могу генерировать все эти изображения, которые интересны:
Вот как я генерирую и отображаю свои изображения:
latent_points = generate_latent_points(100, 20)
generated = generator_model.predict(latent_points)
plt.figure(figsize=(10,10))
for i in range(generated.shape[0]):
plt.subplot(4, 5, i+1)
image = generated[i, :, :, :]
image = np.reshape((image), [32, 32, 3])
plt.imshow(image, vmin=-1, vmax=1)
plt.axis('off')
plt.tight_layout()
Мой вопрос: такой результат нормален? Это неправильно, как я нормализую изображения, или мне следует применить какую-то трансформацию после генерации?
Похоже, что это инверсия цветового пространства в BGR. Просто выполните обратное преобразование с помощью cv2.cvtColor(image, cv2.COLOR_BGR2RGB) и вы готовы к работе.
Ответ или решение
Нормализация и обратная нормализация изображений: Потеря цвета при генерации изображений с использованием GAN
При разработке генеративных состязательных сетей (GAN) одним из ключевых аспектов является корректная нормализация данных, а также их обратная трансформация после генерации. Выставленный вами вопрос имеет важные составляющие. Рассмотрим их более детально.
Проблема нормализации
Вы используете функцию активации Tanh на последнем слое генератора, которая производит выходные данные в диапазоне от -1 до 1. Чтобы обеспечить корректное соответствие между исходными изображениями и выходами генератора, вы применяете нормализацию:
cv2.normalize(image, image, alpha=-1, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
Однако, как видно из ваших примеров изображений, цвета теряются после нормализации, что вызывает необходимость в дополнительной обработке.
Проблемы с цветовым пространством
Одной из возможных причин, почему цвета не совпадают между оригинальным и сгенерированным изображением, может быть неправильная интерпретация цветового пространства. OpenCV использует цветовое пространство BGR по умолчанию, тогда как библиотеки рисования, как matplotlib, часто ожидают цвет в пространстве RGB.
При таком подходе, если вы не выполните преобразование, изображение может выглядеть неестественно, так как цвета оказались "перевернутыми". Чтобы решить эту проблему, вы можете воспользоваться следующей функцией:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Это преобразование должно помочь вам восстановить ожидаемое цветовое представление.
Обратная нормализация изображений
Кроме того, не стоит забывать о необходимости обратной нормализации ваших сгенерированных изображений. Чтобы вернуть их в оригинальный диапазон пикселей [0, 255], необходимо использовать следующую формулировку:
- Умножьте каждый элемент на 127.5 и добавьте 127.5 для преобразования значений из диапазона [-1, 1] в [0, 255].
- Преобразуйте тип данных в
np.uint8
.
Пример кода:
image = (image + 1) * 127.5
image = np.clip(image, 0, 255).astype(np.uint8)
Выводы
Так, потеря цветов в ваших сгенерированных изображениях может быть связана как с неправильной интерпретацией цветового пространства, так и с отсутствием обратной нормализации после генерации. Необходимо обращать внимание на такие аспекты, как:
- Преобразование цветового пространства из BGR в RGB;
- Корректная обратная нормализация значений пикселей.
Также следует помнить, что генеративные модели требуют тщательной настройки и тестирования на различных этапах. Убедитесь, что вы тестируете изображения с различными параметрами и проверяете результат. Это важный шаг для достижения высококачественных визуализаций.
Если после выполнения всех вышеуказанных шагов проблема останется актуальной, это может указывать на необходимость дополнительных доработок вашей архитектуры GAN или данных, на которых вы обучаете модель.