[English ver. (WIP)](./README_en.md) # Dump U-Net ## 目次 - [Dump U-Net](#dump-u-net) - [1. 目次](#1-%E7%9B%AE%E6%AC%A1) - [2. これは何](#2-%E3%81%93%E3%82%8C%E3%81%AF%E4%BD%95) - [3. できること](#3-%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8) - [4. 特徴量の抽出](#4-%E7%89%B9%E5%BE%B4%E9%87%8F%E3%81%AE%E6%8A%BD%E5%87%BA) - [4.1. U-Net の特徴量画像](#41-u-net-%E3%81%AE%E7%89%B9%E5%BE%B4%E9%87%8F%E7%94%BB%E5%83%8F) - [4.1.1. 画面説明](#411-%E7%94%BB%E9%9D%A2%E8%AA%AC%E6%98%8E) - [4.1.2. Colorization](#412-colorization) - [4.1.3. Dump Setting](#413-dump-setting) - [4.1.4. 抽出画像の例](#414-%E6%8A%BD%E5%87%BA%E7%94%BB%E5%83%8F%E3%81%AE%E4%BE%8B) - [4.2. アテンション層の特徴量抽出](#42-%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%AE%E7%89%B9%E5%BE%B4%E9%87%8F%E6%8A%BD%E5%87%BA) - [4.2.1. 画面説明](#421-%E7%94%BB%E9%9D%A2%E8%AA%AC%E6%98%8E) - [4.2.2. 例](#422-%E4%BE%8B) - [5. ブロックごとのプロンプトの変更](#5-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%94%E3%81%A8%E3%81%AE%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AE%E5%A4%89%E6%9B%B4) - [5.1. 概要](#51-%E6%A6%82%E8%A6%81) - [5.2. 画面説明](#52-%E7%94%BB%E9%9D%A2%E8%AA%AC%E6%98%8E) - [5.3. 記法](#53-%E8%A8%98%E6%B3%95) - [5.4. 例](#54-%E4%BE%8B) - [5.5. Dynamic Prompts との併用](#55-dynamic-prompts-%E3%81%A8%E3%81%AE%E4%BD%B5%E7%94%A8) - [6. TODO](#6-todo) ## これは何 U-Net の特徴量を可視化するための [stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) の拡張です。 ## できること 1. モデルの途中出力の可視化:U-Net の各ブロックおよびアテンション層の特徴量を可視化する。 2. 層別プロンプト:U-Net の各ブロックでプロンプトを変更しながら画像を生成する。 3. 2.でプロンプトを変更したときの U-Net の特徴量の差分を可視化する。 ## 特徴量の抽出 例として以下の画像を使用する。  ``` Model: waifu-diffusion-v1-3-float16 (84692140) Prompt: a cute girl, pink hair Sampling steps: 20 Sampling Method: DPM++ 2M Karras Size: 512x512 CFG Scale: 7 Seed: 1719471015 ``` ### U-Net の特徴量画像 たとえば以下のような画像を生成する。 グレースケール出力 `OUT11, steps 20, Black/White, Sigmoid(1,0)`  カラー出力 `OUT11, steps 20, Custom, Sigmoid(1,0), H=(2+v)/3, S=1.0, V=0.5`  #### 画面説明 
IN11-M00-OUT00は繋がっている。Layers で指定したブロックの詳細が出力される。White/Black は特徴量を v として、|v| が大きいピクセルを白、小さいピクセルを黒で表示する。Red/Blue は v が大きいピクセルを赤、小さいピクセルを青で表示する。
Custom は v の値から RGB もしくは HSL 色空間の値を自由に計算する。Auto [0,1] は与えられた特徴量の最小値と最大値を使って値を [0,1] に線型変換する。Auto [-1,1] は同じく [-1,1] に線型変換する。Linear は Clamp min./max. を指定して、その範囲を Colorize method が White/Black のとき [0,1] に、それ以外のとき [-1,1] に線型変換する。
Sigmoid は gain と offset を指定して、v + offset をシグモイド関数で変換する。出力は Colorize method が White/Black のとき [0,1] に、それ以外のとき [-1,1] になる。
Value transform で変換した値 v をピクセル値に変換するコードを書く。v の範囲は Colorize method および Value transform の指定により [0,1] もしくは [-1,1] で与えられる。計算結果は [0,1] でクリップされる。numpy をグローバル環境として実行される。たとえば、abs(v) は numpy.abs(v) の意味になる。
h=8 なので画像が8つ並ぶことになる。
「`pink hair` はこの層に効いてるのかな?」みたいなことが分かる。
- IN01

- M00

- OUT10

## ブロックごとのプロンプトの変更
### 概要
内容は以下の記事を参照。
[Stable DiffusionのU-Netでブロックごとに異なるプロンプトを与えて画像生成する(ブロック別プロンプト)](https://note.com/kohya_ss/n/n93b7c01b0547)
```
Model: waifu-diffusion-v1-3-float16 (84692140)
Prompt: a (~: IN00-OUT11: cute; M00: excellent :~) girl
Sampling Method: Euler a
Size: 512x512
CFG Scale: 7
Seed: 3292581281
```
上の画像は順番に、
- `a cute girl` で生成した画像
- IN00 のみ cute を excellent に変更して生成した画像
- IN05 のみ cute を excellent に変更して生成した画像
- M00 のみ cute を excellent に変更して生成した画像
となっている。
### 画面説明

ほぼ [U-Net の特徴量画像](#41-u-net-%E3%81%AE%E7%89%B9%E5%BE%B4%E9%87%8F%E7%94%BB%E5%83%8F) と同じ。