Создан бесплатный ИИ-сервис для раскрашивания черно-белых фото. Опыт CNews
Бесплатная нейросеть шведского разработчика может за секунды превратить черно-белые фотографии в цветные. Пользователям предлагают самим управлять искусственным интеллектом, для этого достаточно добавить подсказки к фото. Вскоре проект могут коммерциализировать.
ИИ разберется в цветах
Шведский разработчик Эмиль Воллнер (Emil Wallner) запустил бесплатный сервис для раскрашивания черно-белых фотографий. Платформа называется Palette.fm. Она работает с помощью искусственного интеллекта (ИИ). Управлять сервисом можно с помощью комментариев к фото.
Palette.fm, как отмечает создатель платформы, использует модель глубокого обучения для классификации изображений. Технология определяет исходные цвета объектов на фотографии или иллюстрации.
Как это работает
Над своей технологией Воллнер работал на протяжении пяти лет. Как он рассказал порталу Arstechnica, созданная им модель ИИ использует изображение и текст для раскрашивания.«ИИ дешифрует изображение в текст и использует его и само изображение для определения необходимых цветов», — отмечает Воллнер.
Для пользователя этот процесс достаточно прост. После того, как фотография загрузится на сервис, ИИ даст свой комментарий к тому, что он видит на изображении. Затем можно будет увидеть фильтры, которые, по расчетам ИИ, должны подходить картинке. Если пользователю не нравится описание, или оно не точное, его можно самостоятельно отредактировать. ИИ будет считать это текстовой подсказкой и учтет ее при дальнейшем раскрашивании.
Эксперимент CNews
Чтобы проверить, как работает эта технология, CNews взял черно-белый кадр из фильма «17 мгновений весны». На фото момент из первой серии картины: ранняя весна, Штирлиц (Вячеслав Тихонов) и фрау Заурих (Эмилия Мильтон) на прогулке в лесу. Штирлиц смотрит в небо.
ИИ определил, что на фото «актер или путешественник, это крупный портретный кадр с мелкими контрастными деталями». После предложенной обработки, цвет кожи у Тихонова оказался достаточно загорелым. CNews добавил к описанию ИИ уточнение«ранняя весна», цвета стали более холодными. Раскраска фото заняла считанные секунды.
Верхний ряд: оригинальный черно-белый кадр; после первой обработки ИИ. Нижний ряд: после добавления комментариев ИИ; официально колорированный кадр из фильма
Напомним, что официальный процесс колоризации «17 мгновений весны» длился с 2006 по 2009 гг. Над проектом трудились более 600 человек из России, США, Кореи, Китая и Индии. Специалисты брали ключевые кадры каждой сцены (около 1500 штук), разрисовывали их вручную, после чего они служили референсами для обработки оставшихся кадров в специальных программах. По некоторым данным, колоризация фильма обошлась в $3 тыс. за минуту экранного времени.
ИИ невиданной щедрости
Сейчас Palette.fm можно пользоваться бесплатно. В дальнейшем Воллнер планирует коммерциализировать ресурс, добавив платные опции.
Марина Громова, Security Vision: Партнерский статус должен зависеть не от оборота, а от экспертизы интегратора
безопасность
Как отмечает разработчик, чаще всего люди используют платформу для раскрашивания старых семейных фотографий и исторической хроники. Сайт обрабатывает изображения в онлайн-облаке и не хранит изображения. Для использования сервиса регистрация не нужна. Не требует сайт и почты, чтобы, например, отправить туда изображения.
Отметим, что Palette.fm не первопроходцы в использовании ИИ при раскрашивании фотографий. Нейронный фильтр для этих целей есть в Photoshop. Технология, похожая на разработку Воллнера, также доступна в виде бота в Twitter с конца 2021 г.
Нейросеть Palette раскрасит чёрно-белые фото
В сети появился новый сервис на основе нейросети, который раскрашивает чёрно-белые фотографии. В перечне есть ряд предварительных настроек, которые можно использовать бесплатно. The GEEK протестировал новинку.
Как воспользоваться системой:
- Перейдите на сайт Palette;
- Нажмите на вкладку Upload Image;
- Загрузите черно-белое фото;
- Дождитесь окончания загрузки;
- Выберите вариант фильтра и получите результат.
Как нейронная сеть раскрашивает изображения
На этом занятии вы узнаете, как с помощью СНС делается раскраска изображений (из градаций серого в цветное):
По-английски, это называется:
Начнем с того, чем отличается на уровне пикселей цветное изображение от черно-белого (я градации серого для простоты буду называть черно-белым). Черно-белое представлено одной компонентой яркости со значениями пикселей в диапазоне от 0 до 255:
Полноцветные, как правило, описываются тремя компонентами RGB:
Следовательно, чтобы СНС раскрасила черно-белое изображение, на ее выходе должно формироваться три цветовых канала:
Но это не лучшее решение. Полноцветные изображения в данной задаче удобнее представлять в другом цветовом пространстве, например:
Lab: (Light – слой яркости (градации серого); a, b – цветовые слои)
Причем, пиксели слоя L меняются в диапазоне от 0 до 100, а пиксели слоев a и b – в диапазоне от -128 до 127. В этом случае СНС достаточно сгенерировать только для канала: a и b, вместо трех RGB (третий канал у нас уже есть – это исходное изображение в градациях серого):
Кроме того, 94% рецепторов человеческого глаза настроены на восприятие яркости (компоненты L – градации серого) и только 6% — на цветовые составляющие. Поэтому, если нейросеть немного «напутает» в цветах – это не так сильно скажется на визуальном восприятии картинки в целом. А вот путаница в яркостной составляющей – это уже критично. Но мы ее и не будем формировать, а возьмем уже готовую. Это еще одно преимущество цветового пространства Lab в рамках данной задачи.
Для преобразования изображения из RGB в Lab в Python воспользуемся пакетом skimage и импортируем следующие методы:
import numpy as np import matplotlib.pyplot as plt from skimage.color import rgb2lab, lab2rgb
- rgb2lab – преобразовывает изображение из RGB в Lab;
- lab2rgb – преобразовывает изображение из Lab в RGB.
from google.colab import files from io import BytesIO from PIL import Image
И, затем, выполним строчки:
upl = files.upload() names = list(upl.keys()) img = Image.open(BytesIO(upl[names[0]]))
Загруженное изображение будет в RGB-формате. Для преобразования в пространство Lab определим следующую функцию:
def processed_image(img): image = img.resize( (256, 256), Image.BILINEAR) image = np.array(image, dtype=float) size = image.shape lab = rgb2lab(1.0/255*image) X, Y = lab[:,:,0], lab[:,:,1:] Y /= 128 # нормируем выходные значение в диапазон от -1 до 1 X = X.reshape(1, size[0], size[1], 1) Y = Y.reshape(1, size[0], size[1], 2) return X, Y, size
Мы здесь сначала изменяем размер изображения до 256х256 пикселей и преобразовываем его в массив numpy. Затем, делаем преобразование в пространство Lab (обратите внимание, на вход функции нужно передавать изображение с компонентами RGB и вещественными значениями пикселей от 0 до 1, поэтому мы здесь добавляем нормирующий множитель 1/255). Далее, выделяем яркостную компоненту X и две цветовые в Y. Цвета будут использоваться как требуемые выходные значения НС, поэтому мы их нормируем до диапазона [-1; 1]. Затем, формируем нужный формат размерностей для входных и выходных данных НС. Вызовем эту функцию и получим следующий набор данных:
X, Y, size = processed_image(img)
Теперь у нас есть что подавать на сеть и что требовать на ее выходах. Поэтому дальше нам нужно построить модель СНС, представленной ранее на рисунке. С помощью Keras это можно сделать так:
from keras.layers import Conv2D, UpSampling2D, InputLayer from keras.models import Sequential model = Sequential() model.add(InputLayer(input_shape=(None, None, 1))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Conv2D(64, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same', strides=2)) model.add(Conv2D(512, (3, 3), activation='relu', padding='same')) model.add(Conv2D(256, (3, 3), activation='relu', padding='same')) model.add(Conv2D(128, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(UpSampling2D((2, 2))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(Conv2D(2, (3, 3), activation='tanh', padding='same')) model.add(UpSampling2D((2, 2)))
Чтобы не изобретать велосипед, я взял эту модель из статьи, посвященной теме раскраски изображений с помощью глубоких нейронных сетей: https://github.com/baldassarreFe/deep-koalarization Обратите внимание на структуру слоев. Первый слой – это обычный сверточный слой, состоящий из 64 фильтров и ядрами 3х3 пиксела. Следующая свертка имеет те же параметры, но шаг смещения фильтров равен двум пикселям по каждой координате. Почему здесь масштабирование признаков делается с помощью увеличения шага, а не методом MaxPooling который использовался при классификации и стилизации изображений? Дело в том, что слой MaxPooling хорошо концентрирует значимую информацию об особенностях изображения, но несколько искажает взаимное расположение пикселей на плоскости. В задачах колоризации такое искажение представления изображения недопустимо. Поэтому и используется сверточный слой с шагом 2. Так продолжается движение в глубину, пока не встретится слой UpSampling2D((2, 2)). Параметр (2, 2) задает увеличение размера каждого элемента карты признаков. В Keras это работает следующим образом:
Каждый элемент карты признаков увеличивается до указанного размера (2, 2), причем при масштабировании каждой ячейки (синяя рамка) значение просто копируется в соседние, заполняя все свое пространство. И так каждый элемент. В результате получается увеличенное грубое представление карт признаков на каждом канале. На последнем выходном слое имеем два канала (для двух цветовых компонент a и b), размеры которых совпадают с размерами исходного (входного) изображения. В качестве функции активации выбираем гиперболический тангенс, чтобы цветовые составляющие имели диапазон [-1; 1]. Так сеть будет формировать цвета. Давайте для примера обучим эту НС на одном изображении, то есть, потребуем, чтобы она выдавала строго определенные выходные цветовые компоненты:
model.compile(optimizer='adam', loss='mse') model.fit(x=X, y=Y, batch_size=1, epochs=50)
Мы здесь делаем оптимизацию по Adam, критерий качества – минимум среднего квадрата рассогласования. На вход этой сети будем подавать черно-белое изображение, а на выходе требовать заданные для него цветовые составляющие. После обучения прогоним через сеть изображение в градациях серого:
output = model.predict(X)
и посмотрим на результат:
output *= 128 min_vals, max_vals = -128, 127 ab = np.clip(output[0], min_vals, max_vals) cur = np.zeros((size[0], size[1], 3)) cur[:,:,0] = np.clip(X[0][:,:,0], 0, 100) cur[:,:,1:] = ab plt.subplot(1, 2, 1) plt.imshow(img) plt.subplot(1, 2, 2) plt.imshow(lab2rgb(cur))
Как видите, это одно конкретное изображение она раскрасила вполне приемлемо, правда, мы именно на нем ее и обучали. Но этот простейший пример показывает, что такая операция, в принципе, возможна и общая идея вроде бы рабочая. Но если взять другое изображение, то эффект будет уже значительно хуже:
И это не удивительно. Наша обучающая выборка состояла всего из одного изображения. Этого явно недостаточно. Нужно хотя бы несколько тысяч. Будет ли такое обучение? В качестве домашнего задания сформируйте выборку из тысяч цветных изображений кошек (или собак, или пляжей и т.п. главное, чтобы класс изображений был каким-то одним, иначе это негативно скажется на результате). И посмотрите, как это будет работать. А мы зададимся вопросом: почему НС в принципе способна выполнять раскраску, как это работает? Давайте посмотрим еще раз на структуру НС. Здесь первые два слоя образуют свертки с ядром 3х3. Это приближенно заменяет свертку фильтра с ядром 5х5:
Получается, что каждый признак парных слоев связан с областью 5х5 отсчетов. И если в эту область часто попадают округлые очертания объекта темного объекта (например, глаза котов), то сеть связывает такой признак с темным цветом:
Это, особенно хорошо проявляется на глубоких слоях, где формируются более сложные объекты: глаза, лапы, цветок, трава и т.п. В весовых коэффициентах, как бы, сохраняется опыт и «знания» о соответствии элементов черно-белого изображения этим же элементам, но в цвете. Примерно так можно воспринимать работу НС по раскраске изображений. Как я уже отмечал, приведенный алгоритм колоризации изображений может неплохо работать на однотипных данных, например, котов на фоне природы, или лица людей, или фотографий морских пляжей и так далее. Но если все это смешать, то результаты станут заметно хуже. В 2016-м году ряд японских исследователей: Хатоши Иизука, Эдгар Симо-Серра и Хироши Ишикава http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/data/colorization_sig2016.pdf предложили интересную концепцию по улучшению раскраски изображений. Они к уже существующей НС параллельно добавили еще одну, которая выполняет обычную классификацию, то есть, определяет: к какому классу относится раскрашиваемое изображение. Как вы понимаете, если наша НС будет дополнительно «знать» о типе входных данных (изображение котов, пляжа, руин, лиц, машин и т.п.), то она сможет сохранить специализацию по раскраске и при этом работать с любыми данными.
Для определения характера изображения ученые предложили воспользоваться одной из известных и уже обученных СНС, например, знакомой нам VGG19, которая на выходе дает 1000 различных классов. Или же, можно взять более продвинутую сеть Inception-ResNet-v2 которая также имеет 1000 выходных классов. На рисунке, который я взял из статьи, показано как добавляется классифицирующая сеть к раскрашивающей сети. Для этого японские ученые добавили еще один, так называемый слой слияния (Fusion layer). Что это за слой? В центре первой сверточной сети (с наименьшими размерами карт признаков) создается дополнительный сверточный слой с 256 каналами и таким же размером карт признаков, что и в предыдущем слое. Затем, признаки дополняются вектором классификации от второй СНС, по следующей схеме:
Благодаря этому, каждый признак в дальнейшем будет ассоциирован с установленной тематикой входного изображения и качество раскраски значительно увеличивается.
Заключение
Итак, на последних занятиях мы с вами увидели несколько примеров использования сверточных НС для различных задач: классификации, стилизации, колоризации. В каждой из них СНС используется по своему, подчас неожиданно, как в задаче стилизации, где она применяется для вычисления критерия качества. Эти примеры показывают, что нейронные сети – всего лишь инструмент и как мы будем его использовать, зависит лишь от нашей фантазии.
Раскрашиваем чёрно-белые фото нейросетью DeOldify
Каждый год, на девятое мая все мы лезем в наши фото-архивы и заново просматриваем чёрно-белые фотографии наших дедушек, бабушек, прадедушек и так далее. Многие знают про сервис на сайте MyHeritage, где можно раскрасить фотографию с помощью нейросети. Беда только в том, что бесплатно можно обработать ограниченное количество фотографий и к тому же сервис ставит свой значок на фото.
Мало кто знает, что эта нейросеть есть в открытом доступе, еще меньше людей знают, что её достаточно легко запустить с помощью сервиса Google Colab. Автор сети даже сделал несколько «колабов» и ссылки на них есть на странице проекта.
Я собрал свой «колаб», где постарался все сделать максимально удобно. Всё что потребуется, это нажимать последовательно кнопки. Их всего три. Для запуска нужно иметь учетную запись в google.
Вот как выглядит процесс.
Если что-то пошло не так, то можно пройти в меню:
Среда выполнения -> Сбросить среду выполнения
Для получения наилучшего результата имеет смысл старую чёрно-белую фотографию привести в порядок в каком-нибудь фото-редакторе.