見出し画像

美大卒SEがClaudeと作る、和紙×ブロックチェーンの画像保護サービス開発記

AI画像が商用利用に達するために。

By TextureLoRALab(Shitsukan)

実験参加者を募集しています この透かし技術を一緒に検証してくれるクリエイターを探しています。

参加してくれた方には裏彩色メンバーシップ2ヶ月無料を提供します。🔗 TextureLoRALab — 公式リンク集詳しくは記事末尾にて。

高校で日本画を学んだ。

公立芸大で芸術学を専攻し、イギリスで博物館学の修士号を取った。

よく聞かれる。「なぜエンジニアを?」

僕にとっては同じことだ。

美術品をどう残すか。どう証明するか。

博物館学で向き合ったのはその問いで、いま作っているものも、その続きにある。

Claudeと一緒に「和紙の繊維パターンで画像を保護するサービス」を作っている。

ブロックチェーン付きで。

この記事は作りながら書いている。

迷ったことも、やり直したことも、そのまま残す。

なぜ「和紙」なのか

僕が研究しているのは「質感LoRA」——AIに物質の手触りを教える技術だ。

金箔の重み。螺鈿の光沢。

岩絵具のザラつき。普通のLoRAが「絵柄」を学ぶのに対して、僕のLoRAは「物質そのもの」を学ぶ。

この技術を、画像保護に使えないかと考えた。

和紙LoRAで生成したテクスチャには、繊維のランダムな交差パターンが含まれている。

これを保護したい画像の上に、極めて薄く重ねる。

不透明度3%。人間の目には見えない。

だが周波数解析をかけると、和紙の繊維パターンがはっきり出る。

見えない。でも、ある。

和紙の繊維が、画像の中で静かに息をしている。

既存の透かしとの違い

電子透かしは昔からある。

GoogleのSynthID、Adobeのコンテンツ認証。

それらは「企業が提供するサービス」だ。

透かしのパターンを自分で作ることはできない。

SHIFUKUは違う。

ユーザーが自分のSeed値で和紙テクスチャを生成する。

そのSeed値でしか生まれない繊維パターン。

それがその人だけの「指紋」になる。

自分で作った透かしを、自分の画像に、自分で重ねる。

誰にも預けない画像保護。

Claudeとの開発

このサービスの開発は、AnthropicのClaude(Coworkモード)と進めている。

比喩ではない。会話の中でコードが生まれ、実験が走り、デザインが決まっていく。

僕が「こういう体験にしたい」と言う。

Claudeがコードを書く。

僕が「これだと不安になる」と返す。

Claudeが直す。その繰り返しだ。

Day 1 和紙テクスチャの生成条件を決めた。

LoRA Weight 0.6から1.4まで。

1.0がよかった。0.8は繊維感が出ない。

1.4は壁になった。

オーバーレイ合成のテスト。

不透明度1%〜10%、ブレンドモード2種類、8条件。

全条件でPSNR 48〜51dB。

人間の目には見えない。

FFT検出では不透明度1%でも和紙の信号が出た。

Solanaブロックチェーンにテクスチャのハッシュを刻む仕組みを作り、CLIツールをブラウザ版に変換した。

Canvas APIでサーバー不要。

HTMLファイル1枚で完結する。

ここまで1日だった。

Day 2〜3 RunPodでGPUを借りて、img2imgでの攻撃耐性テストを実施した。

同時にProtectページを本番サイトに組み込み、Netlifyにデプロイ。

Day 4 技術的には動いた。

だが使ってみて、手が止まった。

保護前と保護後の画像が、見た目でまったく同じなのだ。

「これで本当に保護されているのか」

自分で作ったサービスなのに、自分の中に不安が残った。

ここから6回のやり直しが始まる。

「見えない保護」を、どう信じてもらうか

これは技術の問題ではなかった。

透かしは正しく埋め込まれている。

検出もできる。ブロックチェーンにも刻まれる。

数値上は問題ない。

でもユーザーの目に映るのは、変わらない2枚の画像だけ。

そこで、透かしの存在を「見える形」にすることにした。

保護前と保護後のピクセル差分を計算し、ヒートマップとして表示する。

和紙の繊維パターンがどこに織り込まれているか、目で確認できるようにする。

最初は紫と赤のカラーマップにした。

信号の強い場所が赤く燃えるように光る。

技術的には正確だ。

Claudeに見せた瞬間、画面を見て思った。怖い。

やり直した。

緑のドットに変えた。信号の強い場所が緑に光る。

黒い背景に、和紙の繊維が緑色の星座のように浮かぶ。

これは悪くなかった。

だが別の問題が出た。画像の暗い部分や明るすぎる部分では、Overlayブレンドの特性上、透かし信号がほぼゼロになる。

ヒートマップ上では真っ黒のまま。

「ここは保護されていないのでは」と思われる。

全面に薄い緑のベースラインを敷いて、黒い部分をなくす案を試した。

見た目の不安は消えた。

だが——それは嘘だ。信号がない場所に信号があるように見せている。

やめた。

最終的に、正直なヒートマップをそのまま見せることにした。

黒い部分は黒いまま。その代わり、なぜ黒いのか、なぜそれでも大丈夫なのかを、言葉で伝えることにした。

技術用語は全部外した。

「信号強度」も「Overlayブレンドの中間点」も要らない。

ユーザーが知りたいのは一つだけだ。

「私の画像は守られているのか」。

答えはこう書いた——

「暗く見える場所があるのは、元の画像の色合いによる見え方の違いです。

透かしは画像全体に織り込まれているので、どこか一部を切り取られても、コピーされても、あなたの作品だと証明できます」

6回やり直して、たどり着いたのは派手な可視化ではなかった。

正直な表示と、丁寧な言葉。

それだけだった。

ここから先は、技術的な詳細と、実際のコード、そして「商用サービスとして成立するのか」の検証結果を書く。

<!-- ここから有料 -->

なぜ「見えないのに検出できる」のか

画像は2つの領域で構成されている。

空間領域(ピクセルの色)と周波数領域(パターンの繰り返し)。

人間の目は空間領域を見ている。

不透明度3%の変化はRGB値で±7程度。

256階調のうちの7。

知覚閾値以下だ。

だが周波数領域では話が違う。

和紙の繊維パターンには特有の周波数特性がある。

繊維の交差が作る、ランダムだが統計的に一貫したパターン。

中周波〜高周波帯に独特のエネルギー分布を持つ。

オリジナル画像とのFFT差分を取ると、この繊維パターンのエネルギーが浮かび上がる。

不透明度が低くても、パターンの「形」は保存されている。

だから検出できる。

検出スコア = (中周波帯エネルギー + 高周波帯エネルギー) / 2
閾値: 1e-8 以上で検出

テスト結果(着物画像、1024×1024px):

条件PSNR (dB)検出Overlay 1%51.2YESOverlay 3%48.1YESOverlay 5%46.3YESSoft Light 3%49.4YES

全条件で成立した。

コード:オーバーレイ合成

python

import numpy as np from PIL import Image import hashlib def normalize_texture(texture_img): """テクスチャをグレースケール化し、128中心に正規化""" tex_arr = np.array(texture_img, dtype=np.float32) tex_gray = np.mean(tex_arr, axis=2) tex_norm = (tex_gray - tex_gray.mean()) + 128.0 tex_norm = np.clip(tex_norm, 0, 255) return np.stack([tex_norm] * 3, axis=2).astype(np.uint8) def overlay_blend(base_arr, over_arr, opacity): """Overlay blend mode""" b = base_arr / 255.0 o = over_arr / 255.0 mask = b < 0.5 result = np.where(mask, 2*b*o, 1 - 2*(1-b)*(1-o)) blended = b * (1-opacity) + result * opacity return np.clip(blended * 255, 0, 255).astype(np.uint8)

normalize_textureがポイントだ。

テクスチャをグレースケールに変換し、平均値を128に中心化する。

Overlayブレンドでは128が「透明」になる。

テクスチャの凹凸情報だけが合成される。

Solanaブロックチェーン登録

なぜBitcoinではなくSolanaか。

BitcoinのOpenTimestampsは無料だが、確定まで数時間かかる。

SolanaのMemo Programは1回0.00025 SOL(≒0.01円)で即時確定。

「ボタンを押して3秒で証明書が出る」のと「数時間お待ちください」では、体験がまったく違う。

Memo Programにテクスチャのハッシュ値を書き込む。

トランザクションの署名がそのまま登録証明になり、Solscanで誰でも検証できる。

python

memo_data = { "protocol": "SHIFUKU_v0.1", "texture_hash": "a1b2c3...", "result_hash": "d4e5f6...", }

ユーザーは仮想通貨の知識が要らない。

サービス側のウォレットが裏で処理する。

ユーザーから見れば「保護ボタンを押したら証明書が出てきた」。

それだけだ。

商用サービスとして成立するか

正直に書く。

Lv.1(保存・スクショ) — 耐えられる。

透かしはピクセルレベルで埋め込まれている。

画面キャプチャでも残る。

Lv.2(JPEG圧縮・リサイズ・色調補正) — 概ね耐えられる。

中周波帯のパターンはJPEG圧縮に比較的強い。

ただしQ値が極端に低いと劣化する。

Lv.3(AI編集・img2img) — 実測済み。

RunPodでStable Diffusion img2imgを使い、Denoising Strength 0.3 / 0.5 / 0.7の3段階で攻撃テストを行った。

Denoising透かし相関 (r)画質劣化 (PSNR)実質的な保護0.30.059(微弱残存)27.6 dB(軽微)△ 検出可能だが弱い0.5-0.002(消失)23.0 dB(明らか)○ 盗用画像が使い物にならない0.7-0.028(消失)17.9 dB(壊滅的)◎ もはや別画像になる

二段構えになっている。

弱い攻撃では透かしが残る。

強い攻撃では画像自体が壊れる。

どちらに転んでも、保護は成立する。

Lv.4(専門除去ツール) — 厳しい。

だがこれは既存の商用透かしサービスも同じだ。

結論としては、カジュアルな盗用には十分効く。

プロの攻撃者には限界があるが、それは透かし技術そのものの宿命であり、このサービスだけの弱点ではない。

差別化は技術の強度ではない。

「自分で作れる」こと。

「和紙」という文化的な裏付けがあること。

「ブロックチェーン証明」がつくこと。

この三つが揃っていることだ。

現在地

texture-lora-lab.com にProtectページを組み込み済み。

HTMLファイル1枚、ブラウザ内で完結する。

保護実行後には透かし信号のヒートマップが表示され、和紙の繊維パターンがどこに織り込まれているかを目で確認できる。

次に進めること:

  1. CLIP(画像AI)での検出テスト——GPU環境で実行予定

  2. Solana本番接続——デモ版からメインネットへ

  3. 裏彩色メンバーシップとの連携

和紙透かしの「素材」は、どこから来るのか

この記事で「和紙LoRAで生成したテクスチャ」と何度も書いた。

このテクスチャこそが透かしの鍵であり、ユーザー固有の「指紋」になる。

その和紙LoRAはどうやって作るのか。

300回以上の試行錯誤を経て、日本の伝統素材——金箔、螺鈿、岩絵具、和紙——の質感をAIに学習させる手法を確立した。

素材を3つの距離で撮影し、30枚のデータセットからLoRAを訓練する「30枚メソッド」。

この手法を体系的にまとめたのがLoRA学習完全マスターコースだ。

マスターコースの全スライドの背景に使っている和紙テクスチャ。

あれがまさに、この透かし技術で使っている和紙LoRA(Weight 0.75)で生成した画像だ。

SHIFUKU公式サイトも同じ。

墨黒の背景と和紙白の背景が交互に現れるあのデザイン——白いセクションの背景は和紙LoRAで生成したテクスチャをそのまま使っている。

サイトのビジュアル。教材の背景。

画像保護の透かし。全部が、同じ一つの技術から生まれている。

透かしサービスを「使う」だけなら、コースは不要。

だが自分だけのテクスチャを自分で作りたいなら、ここがスタート地点になる。

🔗 SHIFUKU公式サイト — LoRA学習完全マスターコース

実験参加者募集

この透かし技術の精度を検証するために、テストに参加してくれるクリエイターを募集しています。

参加者には裏彩色メンバーシップ2ヶ月無料を提供。

🔗 TextureLoRALab — 公式リンク集

Tags: AI画像保護, 電子透かし, 和紙, LoRA, Solana, ブロックチェーン, Claude, SHIFUKU, TextureLoRALab, 質感LoRA, 学習防止, セルフ透かし

#創作大賞2026 #ビジネス部門

コメントやフィードバックをお待ちしています。いただいた声は、次の記事づくりに活かします。


質感LoRAラボの入口はこちら → https://note.com/texture_lora_lab/n/nc6b9fe2692a4 

いいなと思ったら応援しよう!