
обратная разработка обнаружения SynthID от Gemini
Обнаружение, выявление и хирургическое удаление ИИ-водяного знака Google с помощью спектрального анализа
Посетите нас на PitchHut
Этот форк добавляет десктопное приложение с функцией drag-and-drop для обхода V3, после настройки командная строка не требуется. См. gui/README.md по установке и использованию.
SynthID кодирует незаметный шаблон непосредственно в значения пикселей. На чисто белом изображении, сгенерированном Gemini, водяной знак составляет почти весь сигнал. Усильте высокочастотный остаток, и он выглядит так:
Усиленный шаблон несущей SynthID, извлечённый из чисто-белого изображения Gemini. Диагональные полосы — это пространственно-частотная сигнатура водяного знака — цель нашей спектральной атаки.
Этот проект выполняет обратную разработку системы нанесения водяных знаков Google SynthID — невидимого водяного знака, встраиваемого в каждое изображение, сгенерированное Google Gemini. Используя только обработку сигналов и спектральный анализ (без доступа к проприетарным кодеру/декодеру), мы:
gemini-3.1-flash-image-preview и nano-banana-pro-preview, фазового консенсуса между цветами на 6 однотонных фонах и калибровочного цикла с участием человека, который настраивает силу вычитания каждой несущей на основе ручных подсчётов обнаружения из приложения GeminiVT-OxFF создал действительно классный визуализатор, который показывает процесс того, как водяной знак SynthID добавляется к изображениям, здесь (также доступен в описании репозитория)!
После шести итеративных раундов состязательной разработки конвейер bypass_v4_final / bypass_v4_nuke из Раунда 06 побеждает детектор SynthID Gemini на изображениях как gemini-3.1-flash-image-preview, так и nano-banana-pro-preview с визуально без потерь выводом.
Слева: вывод Раунда 01 (gentle — только щадящее спектральное вычитание). Справа: вывод Раунда 06 (final — VAE + эластичная деформация + сжатие + цвет + JPEG). Оба выглядят для человеческих глаз одинаково; только Раунд 06 побеждает детектор SynthID.
| Раунд | Стратегия | Результат |
|---|---|---|
| 01 | Консервативное спектральное вычитание (щадящее) | ✗ |
| 02 | Агрессивное спектральное вычитание + JPEG | ✗ |
| 03 | Целевое воздействие на абсолютные бины по руководству | ✗ |
| 04 | Извлечение фазы из шумоподавленного остатка | ✗ |
| 05 | Регенерация через Diffusion-VAE + геометрическая деформация | ✗ |
| 06 | Всё-в-одном: VAE + эластичная фрагментация + сжатие + цвет + JPEG | ✓ |
Прорыв в Раунде 06 произошёл благодаря использованию списка опубликованных режимов отказа самого приложения Gemini в качестве спецификации атаки:
«Когда изображение, сгенерированное ИИ, является частью сложного коллажа, расположено за другими элементами или имеет множество различных текстур и наложенных поверх узоров, детектор может испытывать трудности с изоляцией конкретной сигнатуры из общего файла.» — приложение Gemini, справочный текст по обнаружению SynthID
Этап эластичной деформации моделирует этот эффект на уровне пикселей: плавное, низкочастотное случайное поле искажений даёт каждому району размером ~50 пикселей собственное независимое субпиксельное смещение, фрагментируя пространственный фазовый консенсус водяного знака без внесения видимых искажений.
V4 — это переосмысление кодовой книги с нуля, построенное на гораздо более богатом наборе данных:
gemini-3.1-flash-image-preview и nano-banana-pro-preview (плюс необязательная псевдомодель union).black, white, blue, green, red, gray) для каждой модели и разрешения, плюс gradient и diverse в качестве базовых уровней содержимого.carrier_weights в кодовой книге обновляется на основе обратной связи от ручного обнаружения в приложении Gemini.Для каждого частотного бина (fy, fx) и канала ch:```
consensus(fy, fx, ch) = | mean_over_colors( exp(i * phase_color(fy, fx, ch)) ) |
Значения, близкие к `1.0`, означают, что фаза в этом бине заблокирована для всех сплошных цветных фонов, что верно только для водяного знака. Контентные бины падают до `< 0.3`, потому что их фаза рандомизирована разными оттенками цвета. В кодовой книге V4, построенной на обогащенном наборе данных, 99%+ контентных бинов оказываются ниже порога по умолчанию `tau=0.60`, поэтому диссолвер V4 никогда их не трогает — именно это восстанавливает PSNR.