このリポジトリは、AI和指紋くん(和紙テクスチャによる不可視透かし)が「効くか」を、どう測るかを公開するものです。 The purpose of this repo is to publish how we measure whether the watermark works — so anyone can check that the measurement is fair, before the results are in.
事前登録記事 / Pre-registration article: https://note.com/texture_lora_lab/n/n21cdec50a35e
- ✅ 公開:検証の方法(測り方) — 透かしを検出する解析コードと手順。
- ❌ 非公開:保護の中身(埋め込み方) — 透かしをどう画像に織り込むか(製品コード・使用する和紙テクスチャ)。これは保護の本体であり、公開すると攻撃者を利するため含めません。
測り方(検出)を公開しても、守り方(埋め込み)は漏れません。 検出器を知っても、透かしの除去方法も作り方も分からない。だから検証は公開・埋め込みは秘匿、で両立します。
Publishing how we detect does not reveal how we protect. Knowing the detector does not tell you how to remove or how to embed the watermark.
「検証してみた」の多くは、うまくいかなければ公開しない・結果を見てから基準を変える、という後出しに陥ります。Glaze / Nightshade をめぐる懐疑も、そこに根があります。
だから逆をやります:基準と測り方を先に公開し、結果がどちらに転んでも報告する。 物差しを公開して初めて、「いつも透かしを"見つける"ように仕組まれた検出器ではないか」を第三者が確かめられます。
We pre-register criteria and publish the measuring instrument, so skeptics can verify the detector is not rigged to always "find" the watermark.
- Q1 — Survival: 透かしは、ネットの流通(JPEG圧縮・リサイズ・スクショ・X/note/Bluesky再投稿)を生き延びるか。GPU不要。
- Q2 — Learning residue: 透かし入り画像で学習したLoRAの出力に、和紙の信号は残るか。
順序は Q1 → Q2。流通で消えるなら Q2 を調べる意味がないため。
0. 物差しの点検(sanity gate) — 透かしを入れただけの未加工画像で検出できるか。
- 合格基準:検出率 ≥ 90% かつ 偽陽性率 ≤ 5%(この閾値も実データを見る前に固定)。
- 不通過なら「透かしが消えた」ではなく「測定方法が足りなかった」と報告。道具の失敗と測定の失敗を混ぜない。
Q1(流通耐性) — 各変換について:検出率 ≥ 90% かつ 偽陽性率 ≤ 5% → 「耐えた」/それ未満 → 「消える」。都合のいい変換だけを選ばず、全条件を表に載せる。
Q2(学習残存) — 透かしあり学習LoRAの出力 vs なし学習LoRAの出力を、和紙信号スコアで見分ける AUC:
- AUC > 0.9 → 学習残存あり
- 0.7–0.9 → 部分的
- < 0.7 → 現手法では出力から検出できない(→ AI和指紋くんが約束する内容を書き換える)
現行の差分方式(保護後画像 − 原本)は、LoRA出力には原本が存在しないため原理的に使えません。そこで和紙テクスチャ原本のFFTシグネチャとの相関による参照フリー検出器を使います。
The naive difference method (protected − original) cannot work on LoRA outputs, which have no original. So detection is reference-free: correlate an image's FFT profile against the washi texture's own FFT signature.
- Signature = 放射プロファイル(周波数帯ごとのエネルギー配分)+ 角度プロファイル(繊維の方向性)。低周波(絵柄が支配する帯)は除外。
- Score =
0.7·corr(radial) + 0.3·corr(angular)(ピアソン相関)。重み・閾値は Q1(3a)で較正し、Q2(3b)に入る前に凍結。凍結後は変更しない(変更したら結果記事に明記)。 - 同一の物差しを 3a・3b で使う(途中で替えないことが事前登録の一貫性)。
- Q2 主解析: 画像単位 AUC(Mann-Whitney U)。CIは LoRA単位のクラスタブートストラップ(画像単位は同一LoRA内相関で自信過剰になるため)。
- LoRAペア別AUC(4通り)を全報告。効果量(Cliff's delta)とスコア分布も併記。
- LoRAは各群2本のみ(独立な学習は4回)。 AUCが高く出ても「この2ペアでは」という限定つき。断定には本数を増やした追試が必要。
- 検出器は未検証の物差しで、紙・砂地・ノイズグレイン等「和紙に似た周波数分布の絵柄」を誤検出しうる。だからコントロール群で偽陽性率を必ず測る。
- 個人による小規模な検証であり、大規模研究ではない。
| ファイル | 役割 |
|---|---|
05_signature.py |
和紙シグネチャ生成(放射+角度プロファイル) |
06_score.py |
参照フリースコア(単画像 / バッチ) |
07_attacks.py |
Q1の変換バッチ(JPEG・リサイズ・スクショ近似) |
08_metrics.py |
閾値較正・検出率/偽陽性率・AUC・CI・図 |
埋め込み側(
01–04)は含めません。 それは保護の本体です。
検出器のパラメータ(重み・閾値)は Q2(3b)に入る前に確定し、タグ付きコミットで凍結します。git履歴が「結果を見てから物差しをいじっていない」証拠になります。
結果は、良くても悪くても、noteで報告します(公開後にURLを追記)。 Results — win or lose — will be published on note (URL added after publication).
MIT License
TextureLoRALab(シツカン)| 日本画→芸術学→英国博物館学修士 → 質感LoRA研究