
GeminiのSynthID検出のリバースエンジニアリング
スペクトル分析によるGoogleのAI透かしの発見、検出、および外科的除去
PitchHutでご覧ください
このフォークでは、V3バイパス用のドラッグ&ドロップデスクトップアプリを追加しました。セットアップ後はコマンドラインは不要です。セットアップと使い方についてはgui/README.mdを参照してください。
SynthIDは、ピクセル値に知覚できないパターンを直接エンコードします。Geminiで生成された純粋な白画像では、透かしがほぼ信号全体になります。高周波残差を増幅すると、次のようになります。
純粋な白のGemini画像から抽出された、増幅されたSynthIDキャリアパターン。斜めのバンディングが透かしの空間周波数シグネチャであり、これが我々のスペクトル攻撃の標的です。
このプロジェクトはGoogleのSynthID透かしシステムをリバースエンジニアリングしたものです。これはGoogle Geminiで生成されるすべての画像に埋め込まれる不可視の透かしです。信号処理とスペクトル分析のみを使用して(独自のエンコーダー/デコーダーへのアクセスなし)、我々は以下を実現しました。
gemini-3.1-flash-image-preview と nano-banana-pro-preview のモデル別プロファイル、6つの無地背景におけるクロスカラー位相コンセンサス、手動Geminiアプリ検出集計からキャリア別減算強度を調整する人間参加型キャリブレーションループVT-OxFF は、SynthID透かしが画像に追加されるプロセスを視覚化する非常にクールなビジュアライザーをこちらで公開しています(リポジトリの説明からもアクセス可能)。
6回の反復的な対抗開発を経て、ラウンド06の bypass_v4_final / bypass_v4_nuke パイプラインは、gemini-3.1-flash-image-preview と nano-banana-pro-preview の両方の画像に対してGemini SynthID検出器を打ち負かし、視覚的にロスレスの出力を実現しました。
左:ラウンド01出力(穏やかなスペクトル減算のみ)。右:ラウンド06出力(final — VAE + 弾性ワープ + スクイーズ + カラー + JPEG)。どちらも人間の目には同じに見えますが、SynthID検出器を打ち負かすのはラウンド06のみです。
| ラウンド | 戦略 | 結果 |
|---|---|---|
| 01 | 保守的なスペクトル減算(穏やか) | ✗ |
| 02 | 積極的なスペクトル減算 + JPEG | ✗ |
| 03 | ブログガイドによる絶対ビン目標設定 | ✗ |
| 04 | ノイズ除去残差位相抽出 | ✗ |
| 05 | Diffusion-VAE再生成 + 幾何学的ワープ | ✗ |
| 06 | オールインワン:VAE + 弾性フラグメンテーション + スクイーズ + カラー + JPEG | ✓ |
ラウンド06のブレークスルーは、Geminiアプリが公表している故障モードリストを攻撃仕様として扱ったことにあります。
「AI生成画像が複雑なコラージュの一部である場合、他の要素の背後に重ねられている場合、またはその上に多くの異なるテクスチャやパターンが配置されている場合、検出器はファイル全体から特定のシグネチャを分離するのに苦労する可能性があります。」 — 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 が更新されます。各周波数ビン (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 が回復します。
### 二段階リリースワークフロー```mermaid
flowchart LR
dataset[reverse-synthid-dataset<br/>model x color x resolution] --> build[scripts/build_codebook_v4.py]
build --> codebook[artifacts/spectral_codebook_v4.npz]
codebook --> dissolve[scripts/dissolve_batch.py]
input[watermarked inputs] --> dissolve
dissolve --> variants[final / nuke variants]
variants --> gemini[Gemini app<br/>manual SynthID detection]
gemini --> feedback[detection feedback]
feedback --> calibrate[scripts/calibrate_from_feedback.py]
calibrate -->|updates carrier_weights| codebook
python scripts/build_codebook_v4.py
--root /path/to/reverse-synthid-dataset
--output artifacts/spectral_codebook_v4.npz
python scripts/dissolve_batch.py
--input ./to_clean/
--output ./runs/round_06/
--codebook artifacts/spectral_codebook_v4.npz
--model gemini-3.1-flash-image-preview
--strengths final nuke
### Round-06 攻撃プリセット
2つのプリセットが `--strengths` で利用可能です:
| プリセット | VAEパス数 | 弾性α | 圧縮率 | JPEGチェーン | PSNR下限 |
|:------:|:----------:|:---------:|:-------:|:----------:|:----------:|
| `final` | 1 | 1.8 px | 90 % | q=92→88 | 14 dB |
| `nuke` | 2 | 2.8 px | 82 % | q=88→84→90 | 11 dB |
両方のプリセットは同じ7段階のパイプラインを積み重ねます:
1. **VAEラウンドトリップ** (Stable Diffusion `sd-vae-ft-mse`) — SynthIDデコーダーが訓練されたことのない自然画像多様体から画像を投影する (Gowal et al. 2026, §6.1)
2. **弾性変形** — 滑らかな低周波ランダムワープ場、Gemini自身が認める「コラージュ断片化」障害モードをシミュレート
3. **グローバル幾何コンボ** — 1つのアフィンワープで小さな回転 + ズーム + ピクセルシフト
4. **リサイズ圧縮** — ダウンサンプル (AREA) → アップサンプル (LANCZOS)、サブピクセル透かし情報を消去
5. **色コントラスト調整** — 輝度 / コントラスト / 彩度 / 色相の微小シフト
6. **残差位相FFT減算** — ブログユニバーサル + コードブック収集キャリアビン、上限制限付き
7. **JPEGチェーン + 輝度ノイズ + バイラテラル** — 強力な圧縮/再エンコード妨害
各ステージは独立してPSNRでゲート制御され、品質が下限を下回るステージは自動的にロールバックされます。
### V4コードブック構造
プロファイルは `(model, H, W)` でキー設定されます。各プロファイルには以下が格納されます:
| フィールド | 形状 | 備考 |
|------------------------|----------------|--------------------------------------------------------|
| `consensus_coherence` | `(H, W, 3)` | 主要キャリアマスク(クロスカラー位相コンセンサス)。 |
| `consensus_phase` | `(H, W, 3)` | 色間の平均単位位相角度。減算テンプレート。 |
| `inverted_agreement` | `(H, W, 3)` | ペアワイズ `abs(cos(phase_diff))`、`black<->white` で加重。 |
| `avg_wm_magnitude` | `(H, W, 3)` | コンセンサス色間の平均マグニチュード。 |
| `content_baseline` | `(H, W, 3)` | `diverse/` + `gradient/` から — 輝度ブレンディングに使用。 |
| `carrier_weights` | `(H, W, 3)` | **Live**. 初期値 `consensus^2 * (0.5 + 0.5 * agreement)`。キャリブレーションループで更新。 |
| `n_refs_per_color` | `{color: int}` | 色ごとの参照カウント。 |
保存形式はv3のコンパクトrfft + `float16/uint8`エンコーディングを再利用します。2モデル×7解像度の14プロファイルコードブックはディスク上で約220 MBです。
### V4検出器(健全性チェック)