;-)

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

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

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

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

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

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

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

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

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

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

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

Используем Метод Оцу (бинаризацию), чтобы разделить изображение на полезные и фоновые пиксели.

1

2

3

4

5

import cv2

import numpy as np

 

# Otsu's thresholding

binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

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

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

1

2

from sklearn.metrics.pairwise import cosine_similarity

cosine_similarity(vectors[pix] - self.base[i])

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

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

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

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

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

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

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

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

Слои для Caffe с размером ядра — вектора для сверточного слоя — и количеством фильтров объявляются в шаблоне.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

layer {{

    name: "conv1"

    type: "Convolution"

    bottom: "data"

    top: "conv1"

    convolution_param {{

        num_output: 20

        kernel_size: 4

        weight_filler {{

            type: "xavier"

        }}

        bias_filler {{

            type: "constant"

        }}

}}

Классификатору Caffe передаются шаблон и весá (натренированная модель).

1

classifier = load_classifier(f.name, weights=weights_fn)

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

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

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

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

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