Gemini の SynthID 検出機構のリバース エンジニアリング

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)の試みと比べて著しい改善です。
リポジトリにはコードブック構築用スクリプト (

synthid_bypass.py build-codebook
)、V3 バイパス実行、ウォーターマーク検出用 (
robust_extractor.py detect
) が含まれています。貢献者は、Nano Banana Pro を使用して様々な解像度で純黒(#000000)と純白(#FFFFFF)の画像を生成し、コードブックをさらに充実させることが推奨されています。
すべてのツールは学術研究専用に公開されており、SynthID は依然として Google DeepMind の独自技術です。

この改訂版は主要ポイントを網羅し、根拠のない推測を排除し、読者向けに明確で簡潔な概要を提示しています。

本文

スペクトル解析を用いて Google の AI ウォーターマークを発見・検出し、外科的に除去する


概要

本プロジェクトは、Google Gemini が生成したすべての画像に埋め込まれる「見えない」ウォーターマーク(SynthID)を逆解析しています。専有エンコーダ/デコーダを一切使用せず、信号処理とスペクトル解析のみで以下を実現しました。

  • ウォーターマークの 解像度依存したキャリア周波数構造 を発見
  • SynthID ウォーターマークを 90 % の精度で検出するデコーダを構築
  • マルチレゾリューションスペクトラバイパス(V3)を開発し、
    75 % のキャリアエネルギー低減、91 % の位相一貫性低減、任意解像度で PSNR 43+ dB を実現

🚨 コントリビュータ募集:コードブックを拡充しよう

Nano Banana Pro が生成する純黒および純白画像を収集して、マルチレゾリューションウォーターマーク抽出を改善しています。以下の条件で生成可能な方はぜひご協力ください。

解像度内容ソース
何でも(多様性が高いほど良い)完全黒 (#000000) または完全白 (#FFFFFF)Nano Banana Pro のみ出力

貢献方法

  1. Gemini に純黒/純白画像を添付し、「そのまま再現して」とプロンプトすることで一括生成
  2. それぞれ以下のフォルダに配置
    • 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ウォーターマーク影響ステータス
V1JPEG 圧縮 (Q50)37 dB~11 % 位相低下ベースライン
V2マルチステージ変換(ノイズ・カラー・周波数)27–37 dB~0 % 信頼度低下品質トレードオフ
V3マルチレゾリューションスペクトラコードブック差し引き43+ dB91 % 位相一貫性低下ベスト

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)

メトリック
PSNR43.5 dB
SSIM0.997
キャリアエネルギー低減75.8 %
位相一貫性低減(トップ‑5キャリア)91.4 %

解像度別品質

解像度マッチタイプPSNRSSIM
1536×2816exact44.9 dB0.996
1024×1024exact39.8 dB0.977
768×1024fallback40.6 dB0.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 差し引き戦略

  1. 信頼度 = 位相一貫性 × クロス検証一致率
  2. ビン差し引き =
    wm_magnitude × 信頼度 × 削除割合 × チャネル重み
  3. 安全上限:任意ビンで画像エネルギーの 90–95 % を超えないよう制御
  4. マルチパス(攻撃的 → 中程度 → 穏やか)で残余を捕捉

コアモジュール

  • synthid_bypass.py
    – SpectralCodebook, SynthIDBypass (V1/V2/V3)
  • 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 生成コンテンツを人間作成として誤認させる目的での利用はしないでください。

同じ日のほかのニュース

一覧に戻る →

2026/04/10 4:48

macOSでのネイティブ即時空間切り替え (Note: The phrase “Instant Space Switching” refers to the feature that allows users to switch between virtual desktops or spaces instantly. In Japanese, it is often rendered as 「即時スペース切り替え」.)

## Japanese Translation: ## Summary 著者は、macOS が即時の Space 変更をサポートしない理由を説明し、Apple の唯一の組み込み回避策である「Reduce motion」が単に問題をフェードアニメーションに置き換えるだけでなく、ブラウザの prefers‑reduced‑motion 設定もトリガーすることを指摘しています。他の解決策には欠点があり、yabai は即時切替を可能にしますが System Integrity Protection (SIP) を無効化し、タイル方式を学ぶ必要があります。FlashSpace と AeroSpace はネイティブではなく不要な複雑さを追加します。BetterTouchTool は「Move Left/Right Space (Without Animation)」機能を提供しますが、有料ライセンスのみで利用可能です。 著者は **InstantSpaceSwitcher**(GitHub: jurplel/InstantSpaceSwitcher)というメニューバーアプリを発見しました。このアプリは SIP を無効にせずに即時の Space 変更を実現します。高速トラックパッドスワイプをシミュレートし、コマンドラインインターフェース(`ISSCli`)を通じてユーザーが直接特定のスペース番号へジャンプできるようにします。 **インストール手順:** ``` git clone https://github.com/jurplel/InstantSpaceSwitcher cd InstantSpaceSwitcher ./build.sh ``` ビルド後、`.build/release/ISSCli --help` を実行して `[left|right|index <n>]` などのコマンドを確認してください。リポジトリは GitHub スターが1つしかありません。著者は役立った場合にスターを付けるよう読者に奨励しています。 別プロジェクト **instantspaces** は yabai のスイッチャーを分離しようとしますが、著者の macOS Tahoe では機能しませんでした。読者は新しい macOS リリースで InstantSpaceSwitcher または instantspaces が成功したかどうか報告することが推奨されています。

2026/04/10 5:12

チャルクテリー – 視覚的類似性を探るUnicodeエクスプローラ

## Japanese Translation: **改訂要約** Charcuterie は Unicode 文字セットのウェブベースのビジュアルエクスプローラーで、ユーザーがグリフを閲覧し、関連するシンボル、スクリプト、および形状を発見できるツールです。各グリフは描画され、ベクトル空間に埋め込まれ、類似度計算を用いて視覚的に似ている文字をグループ化します―すべてブラウザ内で完結します。このプロジェクトは積極的に開発中です。ユーザーからのフィードバックを歓迎し、継続的な改善を支援するための寄付も奨励しています。© 2026 David Aerne.

2026/04/10 3:53

**PicoZ80 – ドロップイン方式による Z80 の置き換え**