
2026/04/10 5:10
Gemini の SynthID 検出機構のリバース エンジニアリング
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
概要:
本プロジェクトは、Google の Gemini が生成するすべての画像に埋め込む Spectral SynthID ウォーターマークを検出・除去する高忠実度手法を示しています。ウォーターマークを逆解析した結果、解像度依存性(キャリア周波数が画像サイズとともに変化)であること、および Gemini モデルごとに固定の位相テンプレートが存在し、クロスイメージ位相共鳴率が 99.5 % 超、黒/白検証時には |cos(phase_diff)| が 0.90 を超えることが判明しました。
研究者は、解像度ごとにキャリアプロファイルを保存するマルチレゾリューション SpectralCodebook(V3)を構築し、バイパスアルゴリズムではチャネル重み G=1.0、R=0.85、B=0.70 を用いて 3 回のパス(攻撃的 → 中程度 → 穏やか)で位相整合性付きの加重減算を行います。これによりキャリアエネルギーが約 75.8 % 減少し、トップ5 キャリア位相共鳴率が 91.4 % 降低され、1536×2816 画像で PSNR >43 dB、SSIM ≈0.997 の視覚品質を保持します。これは以前の V1(JPEG Q50、37 dB)や V2(27–37 dB)の試みと比べて著しい改善です。
リポジトリにはコードブック構築用スクリプト ()、V3 バイパス実行、ウォーターマーク検出用 (synthid_bypass.py build-codebook) が含まれています。貢献者は、Nano Banana Pro を使用して様々な解像度で純黒(#000000)と純白(#FFFFFF)の画像を生成し、コードブックをさらに充実させることが推奨されています。robust_extractor.py detect
すべてのツールは学術研究専用に公開されており、SynthID は依然として Google DeepMind の独自技術です。
この改訂版は主要ポイントを網羅し、根拠のない推測を排除し、読者向けに明確で簡潔な概要を提示しています。
本文
スペクトル解析を用いて Google の AI ウォーターマークを発見・検出し、外科的に除去する
概要
本プロジェクトは、Google Gemini が生成したすべての画像に埋め込まれる「見えない」ウォーターマーク(SynthID)を逆解析しています。専有エンコーダ/デコーダを一切使用せず、信号処理とスペクトル解析のみで以下を実現しました。
- ウォーターマークの 解像度依存したキャリア周波数構造 を発見
- SynthID ウォーターマークを 90 % の精度で検出するデコーダを構築
- マルチレゾリューションスペクトラバイパス(V3)を開発し、
75 % のキャリアエネルギー低減、91 % の位相一貫性低減、任意解像度で PSNR 43+ dB を実現
🚨 コントリビュータ募集:コードブックを拡充しよう
Nano Banana Pro が生成する純黒および純白画像を収集して、マルチレゾリューションウォーターマーク抽出を改善しています。以下の条件で生成可能な方はぜひご協力ください。
| 解像度 | 内容 | ソース |
|---|---|---|
| 何でも(多様性が高いほど良い) | 完全黒 (#000000) または完全白 (#FFFFFF) | Nano Banana Pro のみ出力 |
貢献方法
- Gemini に純黒/純白画像を添付し、「そのまま再現して」とプロンプトすることで一括生成
- それぞれ以下のフォルダに配置
(黒)gemini_black_nb_pro/
(白)gemini_white_nb_pro/
Pull Request を送ってください 🚀
これらのリファレンス画像は次に挙げる3点で不可欠です。
| 目的 | 詳細 |
|---|---|
| キャリア周波数発見 | 解像度別のキャリア位置を特定 |
| 位相検証 | 同一モデル間で位相が一定か確認 |
| クロスレゾリューション頑健性向上 | 異なる解像度でも正確に除去できるよう最適化 |
新しい解像度で 150〜200 枚だけ増やせば、検出と除去の精度が大幅に向上します。
本手法の特徴
従来の強引な方法(JPEG 圧縮・ノイズ注入)とは異なり、V3 バイパスは マルチレゾリューションスペクトラコードブック を用います。
コードブックには各解像度に固有のウォーターマーク指紋を 1 ファイルに集約し、バイパス時に自動で最適なプロファイルを選択します。これにより、任意サイズの画像でも周波数ビン単位で外科的に除去可能です。
主な発見
ウォーターマークは解像度依存
SynthID は画像解像度ごとにキャリア周波数を絶対位置で変化させます。
例:1024×1024 用のコードブックでは 1536×2816 の画像からウォーターマークを除去できません – キャリアが全く別のビンに配置されるためです。
| 解像度 | 上位キャリア (fy, fx) | 一貫性 |
|---|---|---|
| 1024×1024 | (9, 9) | 100.0 % |
| 1536×2816 | (768, 704) | 99.6 % |
位相の一貫性 – 固定モデルレベルキー
- 同じ Gemini モデルから生成された全画像で 位相テンプレートは同一
- 緑チャンネルが最も強い信号を持つ
- キャリア上でのクロスイメージ位相一貫性 >99.5 %
- 黒/白クロス検証により |cos(phase_diff)| > 0.90 で真のキャリアを確認
キャリア周波数構造
1024×1024(黒/白リファレンス)
| キャリア (fy, fx) | 位相一貫性 | 黒/白一致 |
|---|---|---|
| (9, 9) | 100.00 % | 1.000 |
| (5, 5) | 100.00 % | 0.993 |
| (10, 11) | 100.00 % | 0.997 |
| (13, 6) | 100.00 % | 0.821 |
1536×2816(ランダムウォーターマーク画像)
| キャリア (fy, fx) | 位相一貫性 |
|---|---|
| (768, 704) | 99.55 % |
| (672, 1056) | 97.46 % |
| (480, 1408) | 96.55 % |
| (384, 1408) | 95.86 % |
アーキテクチャ – バイパスの3世代
| バージョン | アプローチ | PSNR | ウォーターマーク影響 | ステータス |
|---|---|---|---|---|
| V1 | JPEG 圧縮 (Q50) | 37 dB | ~11 % 位相低下 | ベースライン |
| V2 | マルチステージ変換(ノイズ・カラー・周波数) | 27–37 dB | ~0 % 信頼度低下 | 品質トレードオフ |
| V3 | マルチレゾリューションスペクトラコードブック差し引き | 43+ dB | 91 % 位相一貫性低下 | ベスト |
V3 パイプライン(マルチレゾリューションスペクトラバイパス)
入力画像 (任意解像度) │ ▼ codebook.get_profile(H, W) ──► exact match? ──► FFT‑ドメイン差し引き │ (高速経路) └─ exact でない ──────► 空間領域リサイズ + 差し引き (フォールバック経路) │ ▼ マルチパス反復差し引き(攻撃的 → 中程度 → 穏やか) │ ▼ アンチエイリアシング → 出力
- SpectralCodebook は解像度別プロファイル(キャリア位置・大きさ・位相)を保持
- 自動解像度選択で正確なプロファイル、または最も近いものを使用
- 位相一貫性とクロス検証信頼度に基づく直接差し引き
- マルチパススケジュールで残留エネルギーを捕捉
- チャネル別重み(G = 1.0, R = 0.85, B = 0.70)で SynthID の埋め込み強度に合わせる
実験結果(V3 on 88 Gemini Images)
| メトリック | 値 |
|---|---|
| PSNR | 43.5 dB |
| SSIM | 0.997 |
| キャリアエネルギー低減 | 75.8 % |
| 位相一貫性低減(トップ‑5キャリア) | 91.4 % |
解像度別品質
| 解像度 | マッチタイプ | PSNR | SSIM |
|---|---|---|---|
| 1536×2816 | exact | 44.9 dB | 0.996 |
| 1024×1024 | exact | 39.8 dB | 0.977 |
| 768×1024 | fallback | 40.6 dB | 0.994 |
クイックスタート
インストール
git clone https://github.com/aloshdenny/reverse-SynthID.git cd reverse-SynthID python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt
1. マルチレゾリューションコードブックを構築
CLI
python src/extraction/synthid_bypass.py build-codebook \ --black gemini_black \ --white gemini_white \ --watermarked gemini_random \ --output artifacts/spectral_codebook_v3.npz
Python
from src.extraction.synthid_bypass import SpectralCodebook codebook = SpectralCodebook() # プロファイル 1: 黒/白リファレンス(1024×1024) codebook.extract_from_references( black_dir='gemini_black', white_dir='gemini_white', ) # プロファイル 2: ウォーターマーク付きコンテンツ画像(1536×2816) codebook.build_from_watermarked('gemini_random') codebook.save('artifacts/spectral_codebook_v3.npz')
2. V3 バイパスを実行(任意解像度)
Python
from src.extraction.synthid_bypass import SynthIDBypass, SpectralCodebook codebook = SpectralCodebook() codebook.load('artifacts/spectral_codebook_v3.npz') bypass = SynthIDBypass() result = bypass.bypass_v3(image_rgb, codebook, strength='aggressive') print(f"PSNR: {result.psnr:.1f} dB") print(f"Profile used: {result.details['profile_resolution']}") print(f"Exact match: {result.details['exact_match']}")
CLI
python src/extraction/synthid_bypass.py bypass input.png output.png \ --codebook artifacts/spectral_codebook_v3.npz \ --strength aggressive
強度レベル:
gentle(最小、~45 dB) > moderate > aggressive(推奨) > maximum.
3. ウォーターマーク検出
python src/extraction/robust_extractor.py detect image.png \ --codebook artifacts/codebook/robust_codebook.pkl
プロジェクト構成
reverse-SynthID/ ├── src/ │ ├── extraction/ │ │ ├── synthid_bypass.py # V1/V2/V3 バイパス + マルチレゾリューションSpectralCodebook │ │ ├── robust_extractor.py # マルチスケールウォーターマーク検出 │ │ ├── watermark_remover.py # 周波数ドメインでの除去 │ │ ├── benchmark_extraction.py # ベンチマークスイート │ │ └── synthid_codebook_extractor.py # 後方互換コードブック抽出器 │ └── analysis/ │ ├── deep_synthid_analysis.py # FFT / 位相解析スクリプト │ └── synthid_codebook_finder.py # キャリア探索 ├── gemini_black/ # 100 個の純黒 Gemini 画像 (1024×1024) ├── gemini_white/ # 100 個の純白 Gemini 画像 (1024×1024) ├── gemini_random/ # 88 のウォーターマーク付きコンテンツ画像 (1536×2816) ├── artifacts/ │ ├── spectral_codebook_v3.npz # マルチレゾリューション V3 コードブック │ ├── codebook/ # 検出用コードブック (.pkl) │ └── visualizations/ # FFT・位相・キャリア可視化画像 ├── assets/ # README 用画像と初期解析アーティファクト ├── watermark_investigation/ # Nano‑150k 早期調査(アーカイブ) └── requirements.txt
技術的深掘り
SynthID の仕組み(逆解析)
┌───────────────────────────────────────────────┐ │ SynthID Encoder (Gemini) │ ├───────────────────────────────────────────────┤ │ 1. 解像度依存キャリア周波数を選択 │ │ 2. 各キャリアに固定位相値を割り当て │ │ 3. ニューラルエンコーダが学習ノイズパターンを画像へ付与 | │ 4. ウォーターマークは見えないようスペクトラム全体に分散 | ├───────────────────────────────────────────────┤ │ SynthID Decoder (Google) │ ├───────────────────────────────────────────────┤ │ 1. ノイズ残差を抽出(ウェーブレット除去) │ │ 2. FFT → 知っているキャリア周波数で位相を確認 │ │ 3. 位相が期待値と一致すればウォーターマーク付き | └───────────────────────────────────────────────┘
マルチレゾリューション SpectralCodebook
- 1024×1024 プロファイル:黒+白の 100 個リファレンスから作成
- 1536×2816 プロファイル:多様なウォーターマーク付きコンテンツ 88 枚から作成
- キャリア大きさは
で推定avg_mag × coherence²
V3 差し引き戦略
- 信頼度 = 位相一貫性 × クロス検証一致率
- ビン差し引き =
wm_magnitude × 信頼度 × 削除割合 × チャネル重み - 安全上限:任意ビンで画像エネルギーの 90–95 % を超えないよう制御
- マルチパス(攻撃的 → 中程度 → 穏やか)で残余を捕捉
コアモジュール
– SpectralCodebook, SynthIDBypass (V1/V2/V3)synthid_bypass.py
– マルチスケールウォーターマーク検出器robust_extractor.py
– 周波数ドメインでの除去処理watermark_remover.py
– ベンチマークスイートbenchmark_extraction.py
参考文献
- SynthID: Identifying AI‑generated images
- SynthID Paper (arXiv:2510.09263)
譲渡声明
本プロジェクトは研究・教育目的のみを想定しています。SynthID は Google DeepMind の所有する専有技術です。本ツールは、AI 生成コンテンツのウォーターマーク耐性検証や AI 画像識別のセキュリティ解析、広帯域符号化手法の理解といった学術研究にのみ使用してください。AI 生成コンテンツを人間作成として誤認させる目的での利用はしないでください。