Вы когда-нибудь слышали о диффузионных моделях? Что ж, в наши дни некоторые люди делают с ними удивительные вещи. Найдите в поиске Dall-E 2 или Google Imagen, и вы поймете, о чем я говорю.

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

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

Для тех, кто не знаком с этой концепцией, когда мы говорим о диффузии, по крайней мере в наши дни, мы говорим о концепции, описанной в статье Denoising Diffusion Probabilistic Models by Ho et al.2020.

Очень простое объяснение концепции состоит в том, что мы начинаем с некоторых данных, скажем, изображения. Процесс диффузии состоит из шагов, на которых мы постоянно добавляем немного шума к нашему изображению, по чуть-чуть за раз. Если мы проделаем это достаточное количество раз, не имеет значения, сколько шума мы добавим, в конце концов мы получим изображение, состоящее из чистого шума, верно?

Итак, что удивительно в этом типе модели, так это то, что мы обучаем модель, которая для произвольного момента времени должна предсказывать, какой шум содержится в данных. Таким образом, если модель хорошо предсказывает ее, мы можем обратить процесс вспять и шаг за шагом удалить шум из данных de, чтобы получить наши исходные данные.

Удивительная загвоздка заключается в том, что модель изучает распределение наших данных, поэтому в случае генеративного приложения мы можем начать со случайного шума, и модель шаг за шагом будет удалять части шума, чтобы в В конце у нас есть изображение, похожее (или, по крайней мере, имеющее такое же распределение) на наш набор данных. Не знаю, как вам, но для меня это выглядит почти как волшебство, ха-ха.

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

С точки зрения компьютера изображение в основном состоит из 3-х матриц. Все эти матрицы имеют одинаковые размеры: высоту (количество строк) и ширину (количество столбцов). Каждое значение внутри матрицы соответствует значению пикселя, и у нас есть 3 матрицы, потому что нам нужно 3 канала цветов (красный, зеленый, синий).

Хорошо, мне нужно было это объяснить, потому что, если вы не знаете, что следующая часть не имеет смысла.

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

Дело в том, что с большей матрицей у нас больше значений пикселей. Например, по этой причине изображения с большим разрешением (больше пикселей) выглядят лучше, чем изображения с меньшим разрешением. Итак, чтобы сделать изображение больше, как я только что сказал, нам нужно только увеличить эту матрицу. Получить большую матрицу не проблема… настоящая проблема в том, что теперь нам нужно найти способ заполнить пробелы в большей матрице.

Существует множество стратегий, которые можно использовать для достижения этой цели: интерполировать значения, используя какой-либо алгоритм регрессии, повторять значения для их соседей и т. д. Как правило, инструменты, которые есть в программном обеспечении для обработки изображений, реализуют одну из этих стратегий. Они в порядке, но посмотрите на результат, который мы получили, используя такой простой алгоритм.

Это проблема, которую я хочу решить с помощью моей первой диффузионной модели, чтобы увеличенное изображение выглядело лучше. В области моделей компьютерного зрения эта конкретная проблема называется Super Resolution.

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

Я следил за статьей SRDiff [2]. Блестящая идея заключается в том, что нам не нужно создавать новое изображение с нуля. Вместо этого авторы предлагают повышать разрешение (увеличивать размер) изображения, используя один из более простых способов (да, тот же, что генерирует размытые изображения) и просто объединять его с изображением, которое выглядит как остаточное изображение, в чтобы полученное изображение выглядело красивее и четче.

Хорошо, как мы можем получить такое остаточное изображение? Что ж, поскольку изображения — это просто матрицы, если мы выберем изображение, которое уже находится в более высоком разрешении, которое нам нужно, давайте назовем его Xh. Затем мы можем уменьшить его разрешение и создать изображение с низким разрешением, которое мы назовем Xl. Затем мы можем повышать дискретизацию Xl, используя, скажем, билинейный интерполятор, и генерировать размытое изображение того же размера, что и Xh. Последний шаг к получению нашего остаточного изображения — просто сделать Xh = Xl. Ролевой процесс выглядит следующим образом:

Итак, цель нашей модели — генерировать такие изображения Xr, чтобы мы могли улучшить изображения с повышенной дискретизацией, следовательно, модель дедиффузии. Мы создадим модель диффузии, которая точно предсказывает изображение Xr (разница).

Для моей модели я использовал входы 64x64 и выходы 256x256. Для более техничных людей, поскольку они короткие, я обучил свою модель на RTX 3080 1 миллиону шагов примерно за 20 часов или около того. Я использовал набор фотографий со мной :) с 17k изображений. Мои шаги очень высоки, потому что я использовал размер партии 1 (да, я знаю, что могу сделать лучше). Что касается других вещей, я точно следовал оригинальной статье.

Вот мой лучший результат на данный момент:

Конечно, есть гифка, показывающая полностью обратный процесс в действии.

Я знаю, что, возможно, смогу продвинуть модель немного дальше, немного поправив ее тут и там… но пока это все.

Я оставлю объяснение кода и, возможно, ссылку на репозиторий с ним на другой раз, потому что это было бы слишком много для одной статьи 😉

Вот и все, спасибо за прочтение 😊

Ссылки:

[Ho et al., 2020] Джонатан Хо, Аджай Джейн и Питер Аббил. Шумоподавление диффузионных вероятностных моделей. Нейрипс, 2020 г.

[Li et al., 2021] SRDiff: сверхвысокое разрешение для одного изображения с вероятностными моделями диффузии, 2021.

[Никол и Дхаривал, 2021] Александр Куинн Никол и Прафулла Дхаривал. Улучшенные вероятностные модели диффузии шумоподавления, 2021 г.