Задача fake images detection
В этом посте я расскажу о задаче детекции сгенерированных изображений (fake image detection). Сначала мы поймем, почему эта задача не так проста, как кажется на первый взгляд, а затем разберем основные подходы к решению этой задачи.
В чем суть задачи и почему она не так проста
Задача fake image detection — отличить изображения, сгенерированные нейросетью, от реальных. В свете того, что в последнее время выходит много классных open-source моделек для генерации картинок, и генерируют они уже довольно качественно (вы только посмотрите на IF!), задача начинает быть актуальной. Вспомним хотя бы картинку Папы Римского в пуховике и картинки Трампа за решеткой: насколько я слышала, на них реально повелось много народу.
Несмотря на актуальность задачи, с исследовательской точки зрения подступиться к ней не так просто. Главный нюанс — непонятно, как построить датасет и систему оценки моделей.
Смотрите, мы, по сути, решаем задачу бинарной классификации: отличаем фейки от реальных картинок. Логично, что датасет должен состоять из двух видов картинок: реальных и фейковых. И вот тут начинаются проблемы:
1️⃣ Моделей для генерации картинок много разных. И постоянно выходят новые. Если собрать датасет картинок из конкретных моделей и учить на нем нейронку, есть риск переобучить ее на эти конкретные модели. И когда выйдет новая генеративка IF-2.0, на ней детекция фейков работать не будет. Ну и смысла в таком детекторе, который детектит только картинки из конкретных моделей, нет.
Эту проблему чаще всего решают так: собирают датасет фейковых картинок из нескольких моделей. И в тренировочной части оставляют фейки только из одной модели (например, ProGAN). А в тестовой части данных остаются фейки из всех других моделей — SD, Glide, других ГАНов, DALL-E и т.п. Таким образом проверяется то, что ваша модель для детекции может быть обучена на фейках из одной конкретной модели, но при этом научиться детектить фейки и из других генеративок.
Такой принцип разделения данных на трейн и тест сейчас, насколько я вижу, стандартный для статей в области детекции фейков.
2️⃣ Вторая проблема связана с балансированием фейковых и реальных картинок в датасете. Мы хотим, чтобы наша модель научилась отличать любые фейковые картинки от любых реальных. Для этого нужно убедиться, что в ваших данных реальные картинки отличаются от фейковых именно теми характеристиками, которые влияют на "фейковость". А в остальном распределения фейковых и реальных картинок должны быть одинаковы. Если сделать датасет из реальных картинок попугаев и фейковых картинок слонов, нейросеть прекрасно обучится их разделять, но что-то мне подсказывает, что на картинках вне этого датасета она хорошо работать не будет)
А сбалансировать датасет сложно. Нужно придумать такой принцип генерации данных, чтобы можно было из разных генеративных моделей генерировать максимально разнообразные, но похожие между собой по распределению данные. Задача еще усложняется тем, что некоторые модели генерят картинки на основе текста, а некоторые — нет.
3️⃣ Третья проблема такая: мы хотим, чтобы наша модель для детекции работала "в полевых условиях". То есть, детектила фейки в интернете и где угодно. А в интернете картинки проходят 100500 стадий изменений: где-то они сжимаются (тот же jpeg), где-то на них накладывается шум. Да и сами люди после генерации картинки нейросетью могут изменять ее: накладывать фильтры или править что-то в фотошопе. Все это меняет характеристики картинки, и может сломать модели для детекции. Кажется, что решение — это добавить в датасет картинки, измененные разными способами, но этих способов — просто уйма. Поэтому вместо этого хочется уметь создавать модели, робастные к подобным изменениям. А эту робастность нужно уметь проверять — и тут тоже непонятно, какой протокол тестирования этой робастности выбрать.
4️⃣ А можно же не только генерить картинки с нуля, но и изменять реальные картинки. И получать фейки. И тут непонятно, учитывать ли такие "полуфейковые" картинки в подобных датасетах, или нет. И насколько картинка должна быть "изменена", чтобы считать ее фейком.
Из-за подобных проблем какого-то общепринятого бенчмарка (датасета) для задачи fake image detection пока нет. Ну, или я его не нашла. Каждая статья, которую я читала, придумывала свой датасет, собранный вручную авторами. В последней статье, которую я видела (будет на CVPR-23, кстати!) авторы вообще не сказали, как именно они генерили свой датасет ¯\_(ツ)_/¯ Они, правда, его выложить обещали, посмотрим)
Ну и еще к описанию задачи можно добавить два замечания:
- Задача fake image detection очень похожа на задачу deepfake detection. Отличие в том, что под "дипфейками" обычно понимают картинки или видео людей, которые либо сгенерированы с нуля, либо изменены. Вот по этой задаче литературы и датасетов уйма. Конечно, модели для deepfake detection заточены именно под дипфейки (т.е. картинки людей), но некоторые идеи, может быть, можно использовать и в более общей задаче fake image detection.
- Если мы научимся делать хорошие детекторы фейковых картинок, начнутся поиски идей, как эти детекторы обмануть. То есть, приходим к той же парадигме, что в adversarial attacks: строим защиту -> строим атаку, которая сбивает защиту -> строим защиту от этой атаки -> ...
На самом деле, так даже уже немного происходит) Это мы увидим ниже, когда будем разбирать идеи детекции фейковых картинок.
Вот так как-то. В целом, область fake images detection довольно нова, работы и подходы тут только развиваются, поэтому и много неопределенности. Но область явно важная с практической точки зрения.
На этой ноте давайте переходить к тому, как эту задачу можно решать:
Подходы к решению задачи fake images detection
Здесь я суммарную идеи решения задачи, которые встретились мне, когда я эту задачу разбирала.
Идея #1: решение "в лоб"
То есть, берем какую-нибудь нейросеть вроде ResNet или ViT, и обучаем ее на тренировочной части наших данных на задачу бинарной классификации ("fake" или "real"). Тут всплывает первая проблема, описанная выше: при таком подходе нейросеть легко переобучается под те модели генераторов, картинки из которых находились в тренировочной выборке.
Примеры статей, предлагающих подобный подход:
- Detecting Generated Images by Real Images (ECCV-2022)
- DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer
- Deepfake Video Detection Using Convolutional Vision Transformer
- ResNets for detection of computer generated images
Идея #2: model fingerprints
Оказывается, есть такая интересная вещь: еще в 2019 году было замечено, что модели-генераторы оставляют на сгенеренных картинках свои спецефичные "отпечатки" (fingerprints).
- берем картинку X, прогоняем ее через denoising filter, получаеся f(X). Получаем шум R = X - f(X). Этот шум считается суммой некоей случайной компоненты, и некоей детерминированной компоненты, которая спецефична для модели-генератора, который эту картинку создал.
- чтобы выделить детерменированную компоненту, проделываем операцию выше для батча картинок и усредняем их шумы (усредняем R). К итоговому R_mean применяем преобразование Фурье и результат визуализируем.
В итоге получаются картинки, которые вы видите ниже. Тут визуализированы fingerprints нескольких разных моделей, в том числе диффузий. Картинки взяты из этой статьи, в ней авторы подробно исследовали эту тему:
Видно, что у каждой модели "отпечаток" свой, но при этом у всех моделей он есть, и довольно заметный.
На основе этих отпечатков можно пытаться строить детекторы фейковых картинок. Да их и строят, на самом деле. Но тут есть две сложности:
- Как видно, отчетливый отпечаток визуализируется только при усреднении шума с нескольких изображений. У каждой отдельной картинки он не такой отчетливый. А детектор хочется построить такой, чтобы он мог по одному изображению понять, фейковое оно или нет;
- Можно пытаться придумать техники постобработки сгенерированных картинок, которые будут картинки от подобных отпечатков избавлять. И такое уже есть: на CVPR-2022 была статья под названием "Think Twice Before Detecting GAN-generated Fake Images from their Spectral Domain Imprints". В ней авторы предлагают нормализовать спектральную компоненту изображения, чтобы "отпечаток" исчез.
Вот это я имела в виду выше, когда писала о том, что гонка "fake detection -> защита -> обход защиты" в этой задаче уже началась =)
Да и вообще, обычная обработка картинки типа сжатия jpeg или наложения фильтров уже может исказить эти спектральные компоненты.
Но само по себе то, что fingerprints существуют — штука интересная. Можно еще подумать, почему у разных генеративок "отпечатки" выглядят именно так.
Вот какие статьи можно по этой теме почитать:
- Intriguing properties of synthetic images:
from generative adversarial networks to diffusion models - On the Detection of Synthetic Images Generated by Diffusion Models
Идея #3: чем проще, тем лучше
Авторы этого типа подходов к детектированию фейковых картинок говорят вот что: мы видим, что модели для fake detection постоянно переобучаются на те модели, картинки из которых были в обучающей выборке. А значит, лучшим подходом будет тот, в котором обучаемая компонента как можно меньше. А в качестве модели-выделятора фичей из изображений для последующей классификации на фейк-не фейк используется что-нибудь предобученное.
Эту идею хорошо иллюстрируют две следующие статьи:
1. Towards Universal Fake Image Detectors that Generalize Across Generative Models
Идея тут такая: берем предобученный image encoder из CLIP. Из него получаем эмбеддинги всех картинок тренировочного датасета. На этих эмбеддингах обучаем простую модель: KNN или логрегрессию. Когда к нам приходит новая (тестовая) картинка, получаем ее эмбеддинг из CLIP и подаем в модель (KNN/логрег). Так получаем ответ.
То есть, идея такая: обучаем что-то суперпростое поверх эмбеддингов из предобученной модели. Это суперпростое что-то сильно явно не переобучится.
И это работает. Ниже показаны результаты по метрике accuracy, которые репортят в статье. Протокол обучения и тестирования был стандартный: обучаем на фейковых картинках только из BigGAN, тестируем на всем остальном. Правда, тут есть один нюанс: в статье не написано, как был сгенерирован обучающий дотаяет. Но авторы обещали выложить код (он будет тут), посмотрим.
2. Pattern Detection in the Activation Space for Identifying Synthesised Content
Общая идея этой статьи такая: берем предобученную сеть для классификации картинок. Можно взять даже сеть, обученную детектировать фейковые картинки: например, дискриминатор ГАНа. Далее берем набор реальных картинок, прогоняем их через сеть, запоминаем активации нейронов скрытых слоев.
Далее когда к нам приходит новая картинка, прогоняем ее также через сеть, получаем активации. Эти активации с помощью статистического критерия сравниваем с набором активаций реальных картинок. На основе стат. критерия выдаем ответ — реальная картинка или фейковая.
Здесь, как видно, вообще не предлагается никакого обучения. (в статье, правда, предлагают еще один вариант алгоритма, где небольшое обучение присутствует. Об этом можно прочитать в разделе 3.2)
Минус этой работы в том, что тут странный, я бы сказала, протокол тестирования. В качестве реальных изображений для получения активаций сети брались картинки из датасетов CelebA HQ, MNIST и CycleGAN, а фейковые картинки генерировались с помощью PGGAN. При чем я не смогла понять, на чем PGGAN был обучен.
Но да ладно, это не столько важно. Суть тут в том, что такая идея — использовать стат. критерии для проверки фейковости картинки — тоже имеет место быть. Я видела эту идею еще в одной статье, более недавней, но сейчас снова найти ее не смогла. Если найду, добавлю на нее ссылку.
Заключение
Как-то так. В этой статейке мы описали задачу fake image detection, поняли, почему задача не так проста, и обсудили, какие бывают подходы к ее решению. В целом, задача довольно новая и актуальная. Посмотрим, как будут развиваться дела: получатся ли у нас настолько хорошие генераторы картинок, что их нельзя будет распознать ни одним методом, или же найдется универсальный способ детекции фейковых картинок =)