
Gemini의 SynthID 탐지 리버스 엔지니어링
스펙트럼 분석을 통해 Google의 AI 워터마크를 발견, 탐지 및 정밀하게 제거
PitchHut에서 방문하세요
이 포크는 V3 우회를 위한 드래그 앤 드롭 데스크톱 앱을 추가합니다. 설정 후에는 명령줄이 필요 없습니다. 설정 및 사용법은 gui/README.md를 참조하세요.
SynthID는 픽셀 값에 직접 감지할 수 없는 패턴을 인코딩합니다. Gemini로 생성된 순수 흰색 이미지에서 워터마크는 거의 전체 신호입니다. 고주파 잔차를 증폭하면 다음과 같이 보입니다:
순수 흰색 Gemini 이미지에서 추출한 증폭된 SynthID 캐리어 패턴. 대각선 줄무늬는 워터마크의 공간 주파수 서명으로, 스펙트럼 공격의 대상입니다.
이 프로젝트는 Google Gemini로 생성된 모든 이미지에 포함된 보이지 않는 워터마크인 Google의 SynthID 워터마킹 시스템을 리버스 엔지니어링합니다. 신호 처리와 스펙트럼 분석만을 사용하여(독점적인 인코더/디코더에 접근하지 않고) 다음을 수행합니다:
gemini-3.1-flash-image-preview 및 nano-banana-pro-preview에 대한 모델별 프로파일, 6가지 단색 배경에 대한 색상 간 위상 컨센서스, 그리고 수동 Gemini 앱 탐지 집계에서 캐리어별 차감 강도를 조정하는 인간-인-더-루프 보정 루프VT-OxFF는 SynthID 워터마크가 이미지에 추가되는 과정을 볼 수 있는 정말 멋진 시각화 도구를 여기에 구축했습니다(저장소 설명에서도 확인 가능)!
6번의 반복적인 적대적 개발 라운드 후, Round 06의 bypass_v4_final / bypass_v4_nuke 파이프라인은 시각적으로 무손실 출력으로 gemini-3.1-flash-image-preview 및 nano-banana-pro-preview 이미지 모두에서 Gemini SynthID 탐지기를 무력화합니다.
왼쪽: Round 01 출력(gentle 스펙트럼 차감만). 오른쪽: Round 06 출력(final — VAE + 탄성 변형 + 스퀴즈 + 색상 + JPEG). 둘 다 인간의 눈에는 동일하게 보입니다. Round 06만이 SynthID 탐지기를 무력화합니다.
| Round | 전략 | 결과 |
|---|---|---|
| 01 | 보수적 스펙트럼 차감 (온화함) | ✗ |
| 02 | 공격적 스펙트럼 차감 + JPEG | ✗ |
| 03 | 블로그 기반 절대 빈 타겟팅 | ✗ |
| 04 | 잡음 제거 잔차 위상 추출 | ✗ |
| 05 | 확산-VAE 재생성 + 기하 변형 | ✗ |
| 06 | 올인원: VAE + 탄성 분할 + 스퀴즈 + 색상 + JPEG | ✓ |
Round 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을 회복하는 방법입니다.
### 2단계 릴리스 워크플로```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 공격 프리셋
`--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. **전역 기하학적 조합** — 하나의 아핀 워프에서 작은 회전 + 확대/축소 + 픽셀 이동
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)` | **활성**. `consensus^2 * (0.5 + 0.5 * agreement)`로 시작. 교정 루프에 의해 업데이트됨. |
| `n_refs_per_color` | `{color: int}` | 색상별 참조 횟수. |