Создание инструмента «Колор»
Рассказывает Рома Косовичев
После прочтения поста Темы про восстановление цвета, появляется идея сделать сервис.
Поскольку найти быстрое коробочное решение сложно, погружаемся в существующие алгоритмы распознавания объектов.
Выходит библиотека машинного обучения от 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) и уменьшая ее размерность.
После наложения всех слоев для каждого пикселя получаем многослойный срез — гиперколонну, по которой предсказывается тон и цвет.
Настраиваем алгоритм на виртуальной машине и добавляем отдельный модуль автоматической контрастности и баланса белого, который срабатывает после основных вычислений. Тестируем.
В среднем на обработку одного изображения алгоритм тратит около тридцати секунд. Пробуем сделать прелоудер в виде глитча.
Анимация немного раздражает, меняем эффект на пикселизацию изображения.
Перед анонсом переводим часть вычислений в облако, чтобы выдержать большую нагрузку.