Создание инструмента «Колор»

Описание• Процесс

Рассказывает Рома Косовичев

После прочтения поста Темы про восстановление цвета, появляется идея сделать сервис.

Поскольку найти быстрое коробочное решение сложно, погружаемся в существующие алгоритмы распознавания объектов.

Выходит библиотека машинного обучения от Google TensorFlow и уже работает фреймворк Caffe, который умеет классифицировать объекты изображения. В открытом доступе — множество научных статей по компьютерному зрению.

Начинаем с изучения работы Гонконгского университета, упомянутой в Темином посте.

Иллюстрируем то, что входит в попиксельный анализ.

Пишем на Python упрощенную программу обхода картинок. Берем за основу сегментацию (Semantic Segmentation, Normalized Cuts and Image Segmentation ).

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

Для каждого пикселя исходной картинки программа анализирует окружающую его область и пытается найти максимально похожий на нее образец из базы.

Сравниваются два массива (вектора): исходный (область вокруг пикселя) и массив из базы. Значение всех элементов зависит от тона пикселей.

Найдя ближайшее соответствие, берется цвет образца и раскрашивается пиксель выборки без изменения его тона.

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

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

Получилось что-то вроде выделения «волшебной палочкой» в «Фотошопе» и колоризации выделенной области. Алгоритм лабораторный — нет большой базы паттернов и вычисления функций нахождения U и V, учитывающих потери и погрешности. Но этого результата достаточно, чтобы разобраться в принципе попиксельного обхода. Продолжаем изучать системы восстановления цвета с открытым исходным кодом.

К этому моменту машинное обучение начинает обсуждаться активнее, и число научно-популярных постов в блогах увеличивается.

Через некоторое время находим совместную работу Чикагского университета и Технологического университета «Тойота» — Learning Representations for Automatic Colorization, с использованием Caffe. Среди прочего, она опирается и на исследования из Гонконга.

В основе обработки также лежит сверточная нейронная сеть распознавания изображений (CNN), которую разработал Ян Лекун.

CNN похожа на работу нейронов, соединенных со зрительной зоной коры большого мозга: мелкоклеточные нейроны реагируют на простейшие изменения изображения и группами передают сигналы крупноклеточным для последующей обработки и передачи нервным клеткам.

CNN чередует эти передачи сигналов сверточным (наложение двух векторов, convolution layer) и обобщающим (субдискретизирующим, subsampling layer) слоями, каждый раз получая карту признаков (feature maps) и уменьшая ее размерность.

После наложения всех слоев для каждого пикселя получаем многослойный срез — гиперколонну, по которой предсказывается тон и цвет.

Настраиваем алгоритм на виртуальной машине и добавляем отдельный модуль автоматической контрастности и баланса белого, который срабатывает после основных вычислений. Тестируем.

В среднем на обработку одного изображения алгоритм тратит около тридцати секунд. Пробуем сделать прелоудер в виде глитча.

Анимация немного раздражает, меняем эффект на пикселизацию изображения.

Перед анонсом переводим часть вычислений в облако, чтобы выдержать большую нагрузку.