Широко известно, что нейронные сети обладают широким спектром возможностей, но, держу пари, вы не задумывались об этом конкретном использовании. Это не только умно, но и имеет потенциальную практическую ценность.
В мире полно старых черно-белых фотографий и видео, на которые широкая публика не будет тратить время, потому что им не хватает цвета. Поэтому раскрашивание изображений и видео вызывает большой интерес. В большинстве случаев это делается вручную с помощью любой доступной технологии цифровой живописи. Есть даже группа Reddit, посвященная этой теме, которая показывает впечатляющие результаты.
Можно ли обучить нейронную сеть делать эту работу?
На первый взгляд это кажется маловероятным. Это очень сложная задача. Сеть должна будет распознать объект — скажем, лицо — и его границы и присвоить цвет типичному лицу. Однако нейронные сети хорошо распознают вещи, так почему бы не попробовать. Именно это и сделал Райан Даль с помощью Google TensorFlow.
В стороне, похоже, что выпуск TensorFlow действительно стимулировал более широкое использование и эксперименты с нейронными сетями.
Первая хорошая новость заключается в том, что данные для обучения тривиальны. Просто возьмите любую цветную фотографию и обесцветьте ее, чтобы получить версию в оттенках серого. Вы можете использовать это для обучения сети, используя оригинал в качестве цели.
Фактически используемая архитектура нейронной сети полностью описана в подробном сообщении в блоге, но она начинается с обученного классификатора изображений, а затем изучает сопоставление изображений в оттенках серого с цветными изображениями. Это предлагаемая новая модель — «остаточный декодер», который похож, но больше, чем автоэнкодер, который отображает изображения в градациях серого на изображения в градациях серого.
Так это работает?
Ответ должен быть «вроде как».
Большая проблема в том, что предметы и цвета не всегда даже немного коррелируют. Представьте, что в сети представлено множество изображений головных уборов — какого цвета шляпа? Очевидно, что шляпы — это почти любой цвет, о котором вы только можете подумать, и поэтому сеть будет сходиться на каком-то коричневом цвете, который представляет собой смесь всех возможностей. Если корреляция между объектом и цветом заметна, тогда сеть узнает такие вещи, как «большинство автомобилей черные» и так далее. Эта проблема цветовой корреляции является причиной того, что сеть имеет тенденцию создавать изображения в тонах сепии, но результаты на удивление хороши:
Первая фотография — это исходное изображение, средняя — выходное, а последняя фотография — это правильное цветное изображение. Они взяты из набора для валидации, и нейронная сеть на них не обучена; следовательно, он никогда их раньше не видел.
Обратите внимание, что сеть работает очень хорошо, и если что-то идет не так, вы можете понять, почему это происходит. Например, сеть не может знать цвет грузовика, и почему она должна знать цвет зеленой полосы по нижнему краю кабины? Это тем более впечатляет, когда знаешь, что это было всего после одного дня тренировок.
В сообщении блога есть еще много примеров, в том числе те, где что-то не сработало.
Так как же это повлияло на человеческую окраску? Если быть точным, против группы Reddit?
На этот раз изображение справа — это версия, раскрашенная вручную. Вы можете видеть, что сеть на самом деле не выполняет работу той же лиги, но для такой простой системы она работает лучше, чем вы могли ожидать. Обратите внимание, что в первом примере небо не полностью окрашено, а во втором не хватает рук. Такого рода проблему можно решить, если потренироваться.
Есть и другие примеры, когда дела идут не так хорошо, но все равно впечатляют. У него есть некоторые интересные особенности — он имеет тенденцию окрашивать черных животных в коричневый цвет, а всю траву — в зеленый.
Это только начало проекта; есть много идей, как сделать это лучше. В частности, есть расширение для видео.
Вы можете просто закодировать каждый кадр, используя сеть, но очевидно, что существует взаимосвязь между кадрами, которую можно использовать — раскраска должна быть согласованной по кадрам. Однако посмотрите, насколько хороши результаты, если использовать наивный метод раскрашивания отдельных кадров по отдельности:
Не идеально, но очевидно, что в этой технике есть большой потенциал.
Вы можете найти больше информации в блоге и скачать модель в формате TensorFlow.