Реставрируем фотографии с помощью нейросетей |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-05-31 01:08 Всем привет, я работаю программистом-исследователем в команде компьютерного зрения Mail.ru Group. Ко Дню Победы в этом году мы решили сделать проект по реставрации военных фотографий. Что такое реставрация фотографий? Она состоит из трех этапов:
В этой статье я детально пройдусь по каждому из этапов реставрации и расскажу, как и где мы брали данные, какие сети мы учили, что у нас получилось, на какие грабли мы наступили. Поиск дефектов Мы хотим найти все пиксели, относящиеся к дефектам на загруженной фотографии. Для начала нам нужно понять, какие фотографии военных лет будут загружать люди. Мы обратились к организаторам проекта «Бессмертный полк», которые поделились с нами данными. Проанализировав их, мы заметили, что люди зачастую загружают портреты, одиночные или групповые, на которых есть умеренное или большое количество дефектов.
В конце концов, увеличив вес , поменяв архитектуру и использовав In-place BatchNorm, мы начали искать дефекты на фотографии. Но задёшево можно было сделать ещё чуть лучше, добавив Test Time Augmentation. Мы можем прогнать сеть один раз на входном изображении, потом отзеркалить его и прогнать сеть ещё раз, это может помочь нам найти маленькие дефекты. В результате наша сеть сошлась на четырёх GeForce 1080Ti за 18 часов. Inference занимает 290 мс. Получается достаточно долго, но это плата за то, что мы хорошо ищем небольшие дефекты. Валидационный равен 0,35, а — 0,93. Реставрация фрагментов Решить эту задачу нам снова помог Unet. На вход ему мы подавали исходное изображение и маску, на которой единицами отмечаем чистые пространства, а нолями — те пиксели, которые хотим закрасить. Данные мы собирали следующим образом: брали из интернета большой датасет с картинками, например OpenImagesV4, и искусственно добавляли дефекты, которые похожи по форме на те, что встречаются в реальной жизни. И после этого обучали сеть восстанавливать недостающие части. Я упоминал, что мы искусственно добавляли дефекты в чистые изображения. При обучении нужно очень внимательно следить за максимальным размером накладываемых дефектов, потому что при очень больших дефектах, которые сеть никогда не видела в процессе обучения, она будет дико фантазировать и давать абсолютно неприменимый результат. Так что, если вам нужно закрашивать большие дефекты, при обучении тоже подавайте большие дефекты. Вот пример работы алгоритма: Раскрашивание Мы сегментировали дефекты и закрасили их, третий шаг — реконструкция цвета. Напомню, что среди фотографий «Бессмертного полка» очень много одиночных или групповых портретов. И мы хотели, чтобы наша сеть хорошо с ними работала. Мы решили сделать свою колоризацию, потому что ни один из известных нам сервисов не раскрашивает портреты быстро и хорошо. На GitHub есть популярный репозиторий для раскрашивания фотографий. В среднем, он хорошо делает эту работу, но у него есть несколько проблем. Например, он очень любит раскрашивать одежду в синий цвет. Поэтому его мы тоже отвергли. Итак, мы решили сделать нейросеть для колоризации. Самая очевидная идея: брать чёрно-белое изображение и предсказывать три канала, красный, зелёный и синий. Но, вообще говоря, мы можем упростить себе работу. Можем работать не с RGB-представлением цвета, а с YCbCr-представлением. Компонента Y — это яркость (luma). Загружаемое черно-белое изображение и есть Y канал, мы будем его переиспользовать. Оставалось спрогнозировать Cb и Cr: Cb — это разница голубого цвета и яркости, а Cr — это разница красного цвета и яркости.Почему мы выбрали YCbCr-представление? Глаз человека более восприимчив к перепадам яркости, чем к изменениям цвета. Поэтому мы переиспользуем Y-компоненту (яркость), то, к чему глаз изначально хорошо восприимчив, и прогнозируем Cb и Cr, в которых мы можем чуть больше ошибаться, поскольку «фальш» в цветах человек замечает меньше. Этой особенностью начали активно пользоваться на заре цветного телевидения, когда пропускной способности канала не хватало, чтобы передавать все цвета полностью. Изображение передавали в YCbCr, передавали Y-компоненту без изменений, а Cb и Cr сжимали в два раза. Как собрать baseline Можно снова взять Unet с предобученным энкодером и минимизировать L1 Loss между настоящим CbCr и прогнозируемым. Мы хотим раскрашивать портреты, поэтому кроме фотографий из OpenImages нам нужно добавить специфические для нашей задачи фотографии. Мы сравнением наш результат с фотографией Ground Truth — ручной колоризацией художника под ником Klimbim Как решить эту проблему? Нам нужен дискриминатор: нейронная сеть, которой мы на вход будем подавать изображения, и она будет говорить, насколько реалистично это изображение выглядит. Ниже одна фотография раскрашена вручную, а вторая — нейросетью. Как вы думаете, какая? Ответ В качестве дискриминатора мы используем дискриминатор из статьи Self-Attention GAN. Это небольшая свёрточная сеть, в последние слои которой встроен так называемый Self-Attention. Он позволяет больше «обращать внимание» на детали изображения. Также мы используем спектральную нормализацию. Точное объяснение и мотивацию можно найти в статье. Мы обучили сеть с комбинацией L1-loss и ошибки, возвращаемой дискриминатором. Теперь сеть лучше раскрашивает детали изображения, а фон получется более консистентным. Еще один пример: слева результат работы сети, обученной только с L1-loss, справа — с L1-loss и ошибкой дискриминатора. На четырёх Geforce 1080Ti обучение заняло два дня. Сеть отрабатывала за 30 мс на картинке 512 х 512. Валидационная MSE — 34,4. Как и в задаче inpainting, метрикам можно верить не до конца. Поэтому мы отобрали 6 моделей, которые имели лучшие метрики на валидации, и вслепую голосовали за лучшую модель. После выкатки модели в production мы продолжили эксперименты и пришли к выводу, что лучше минимизировать не попиксельный L1-loss, а perceptual loss. Чтобы его посчитать, нужно прогнать предсказание сети и исходную фотографию через cеть VGG-16, взять карты признаков на нижних слоях и сравнить их по MSE. Такой подход закрашивает больше областей и помогает получить более красочную картинку.Вручную раскрашена левая фотография. Выводы и заключение Unet — это классная модель. В первой задаче сегментации мы столкнулись с проблемой при обучении и работе с картинками большого разрешения, поэтому используем In-Place BatchNorm. Во второй задаче (Inpainting) вместо обычной свёртки мы использовали Partial Convolution, это помогло достичь лучших результатов. В задаче колоризации к Unet мы добавили небольшую сеть-дискриминатор, которая штрафовала генератор за нереалистично выглядящее изображение и использовали perceptual loss. Источник: habr.com Комментарии: |
|