# 進階功能插件
在網路上尋找有關Stable difusion AI繪圖的方法時,很多人都有提到Controlnet這個插件非常的好用,更多的像是Dynamic Prompts、Cutoff、Face Editor插件能夠幫助使用者更迅速、更精準的畫出自己想要的圖片
# ControlNet(控制網路模型)
- 簡單原理
當我丟入一張圖片到controlnet裡他會先經過一個預處理模型,然後生成出標記圖(Annotation),然後標示圖和我的所提供的提示詞會拿進AI裡面演算並得出一張同時符合提示詞和標示圖的新圖片
- 安裝經歷
下載這個插件時,除了跟之前一樣要在WebUI裡輸入網址外,我發現還要額外下載他每個小功能的模型,而且他模型每個都差不多1GB,而且小功能全部加起來大概十三個,所以下載小模型時花了我不少時間
[**需要下載的小模型:**](https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main)


## 邊緣提取類別(簡單測試)
### Canny邊緣檢測模型
**示範圖(不更改提示詞)**
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | |  |
### Lineart線稿模型
**示範圖(更改小細節提示詞)**
1. Controlnet小模型(control_v11p_sd15_lineart [43d4be0d])
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | |  |
2. Controlnet小模型(control_v11p_sd15s2_lineart_anime [3825e83e])
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | ||
### SoftEdge模型
**示範圖(更改重要提示詞)**
1. Controlnet預處理器(softedge_pidinet)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | |
|
2. Controlnet預處理器(softedge_hedsafe)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | ||
### Scribble塗鴉模型
**示範圖(更改重要提示詞)**
1. 直接使用模型
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | ||
2. "自己塗鴉後"在使用模型
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | | |
### MLSD模型(Mobile Line Segment Detection)
1. 使用一位女生圖
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| || |
2. 使用建築物圖片
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
## 大色塊類別(簡單測試)
### Depth模型
1. Controlnet預處理器(depth_midas)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
2. Controlnet預處理器(depth_leres++)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
### Normal向量模型
1. Controlnet預處理器(normal_midas)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | ||
2. Controlnet預處理器(normal_bae)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
### Seg語意分割模型(Segmentation)
1. Controlnet預處理器(normal_bae)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
2. Controlnet預處理器(depth_leres++)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
## 細節精修類別(簡單測試)
### Inpaint模型
- 改變面部表情
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | ||
- 改造手臂變成機械手臂
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| | | |
### Tile模型
1. ==高清圖片修復功能== **(主要功能)**
我先將我的範例圖壓縮到80×80像素的圖片在擴回512×512像素,就得到一張低解析度的圖片
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
2. ==能夠改善圖片的不良細節==
**經過R-ESRGAN 4x+放大成效不好的圖**
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
| |||
**之前有瑕疵的生成圖**
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
||||
3. ==更改圖片中內容,並將圖片重新生成一次==
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
4. ==更改整張圖片風格(改變Checkpoint、改變提示詞與Controlnet的影響程度)==
| 原始圖 | 標記圖 |
| :--------: | :--------: |
|| |
==Checkpoint模型:cyberrealistic_v32.safetensors [9584e2c050]==
| 生成圖 <br>(Balanced平衡模式) | 生成圖<br>(我的提示詞更重要) | 生成圖<br>(ControlNet更重要) |
| :--------: | :--------: | :--------: |
|<img src="https://hackmd.io/_uploads/BkHjLw_p3.png" alt="" width="512" class="" data-position="6004" data-size="51" loading="lazy">|<img src="https://hackmd.io/_uploads/rkLqIwd6n.png" alt="" width="512" class="" data-position="6004" data-size="51" loading="lazy">|<img src="https://hackmd.io/_uploads/B1yqUPO6h.png" alt="" width="512" class="" data-position="6004" data-size="51" loading="lazy">|
==Checkpoint模型:v1-5-pruned-emaonly.safetensors [6ce0161689]==
| 生成圖 <br>(Balanced平衡模式) | 生成圖<br>(我的提示詞更重要) | 生成圖<br>(ControlNet更重要) |
| :--------: | :--------: | :--------: |
|| | |
### OpenPose模型
1. 預處理模型(openpose_full)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
2. 預處理模型(dw_openpose_full)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
3. 預處理模型(openpose_faceonly)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
## 特殊模型(簡單測試)
### Shuffle模型
- 文生圖使用 (圖片概念類似但會有變化)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
- 圖生圖使用 (增強圖片裡的顏色渲染)
| 原始圖 | 標記圖(另一張顏色鮮豔的圖片) | 生成圖 |
| :--------: | :--------: | :--------: |
||原圖<br><br> ⇓ 經過了預處理器⇓<br> | |
### IP2P模型
- 提示詞使用 (make background into moring、moring)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
- 提示詞使用 (make girl into burning、burning girl)
| 原始圖 | 標記圖 | 生成圖 |
| :--------: | :--------: | :--------: |
|| | |
### Reference模型
- 使用原圖提示詞
| 原始圖 | 標記圖 |
| :--------: | :--------: |
|| |
| 生成圖1 <br> | 生成圖2<br> | 生成圖3<br> |
| :--------: | :--------: | :--------: |
||||
- 使用==不同==的提示詞
| 原始圖 | 標記圖 |
| :--------: | :--------: |
|| |
| 生成圖1 <br> | 生成圖2<br> | 生成圖3<br> |
| :--------: | :--------: | :--------: |
||||
## ★ ControlNet(深入測試)
在先前的簡單測試中我只是稍為的帶入之前使用過的提示詞和之前的生成圖進行ControlNet的每個小功能測試,這次深入測試我著重在Normal、OpenPose、Shuffle、Reference這四個我覺得值得研究的模型,並且著重在ControlNet這個插件內的可調變數,例如:控制權重、開始與停止控制步數、Control Mode差別
### 深入測試 Normal模型
#### <1> 預處理器分別
我尋找了兩張圖片,一張是非常2D沒有立體的動漫圖片,另一個是非常立體的真人圖
| |  |
| -------- | -------- |
而Normal模型裡的預處理器有normal_bae、normal_midas,我將圖片丟入預處理器後得到四張圖
| | 2D平面動漫人物圖 | 3D立體人物風景圖 |
| :--------: | :--------: | :--------: |
| normal_bae |  |  |
| normal_midas |  |  |
從這四張圖就能很明顯的看出兩個預處理器的差別,像是bae處理器保留了較多背景資訊,而midas更注重人體紋理的細節而忽視了背景資訊
:::warning
後續更新
------
我發現了normal_midas其實可以勘查背景資訊,在使用此預處理器時會顯示出一個叫Normal Background Threshold的控制條,我會調整數值並列表
| 數值:0.1 | 數值:0.3 | 數值:0.5 | 數值:0.7 | 數值:0.9 |
| :-------: | :-------: | :-------: | :-------: | :-------: |
|  |  |  |  |  |
:::
#### <2> 開始實驗
最重要的可調變數有三個:控制權重、ControlNet開始與停止控制步數、Control Mode差別

1. **控制權重測試**
ControlNet使用的圖片

預處理器選用:normal_bae

**實驗結果圖**


2. **ControlNet開始與停止控制步數測試** ==(無特殊提示詞)==
這個變數能夠控制ControlNet插件在生成圖片的整個過程的參與時長,例:0% ➞ 50%就是ControlNet參與前半部分的演算、0% ➞ 100%就是ControlNet參與整張圖片的演算
| 0% ➞ 100% | <font color="#0000E6">0% ➞ 50%</font> | <font color="#0000E6">25% ➞ 75%</font> | <font color="#0000E6">50% ➞ 100%</font> |
| :-------: | :-------: | :-------: | :-------: |
|  | |  | |
| <font color="#f00">0% ➞ 25%</font> | <font color="#f00">25% ➞ 50%</font> | <font color="#f00">50% ➞ 75%</font> | <font color="#f00">75% ➞ 100%</font> |
|:---------:|:---------:|:---------:|:----------:|
|  |  | |  |
3. **ControlNet開始與停止控制步數測試** ==(提示詞:蘭頭髮、古代建築、宮廷服飾)==
| 0% ➞ 100% | <font color="#0000E6">0% ➞ 50%</font> | <font color="#0000E6">25% ➞ 75%</font> | <font color="#0000E6">50% ➞ 100%</font> |
| :-------: | :-------: | :-------: | :-------: |
| | | | |
| <font color="#f00">0% ➞ 25%</font> | <font color="#f00">25% ➞ 50%</font> | <font color="#f00">50% ➞ 75%</font> | <font color="#f00">75% ➞ 100%</font> |
|:---------:|:---------:|:---------:|:----------:|
| |  | |  |
4. **Control Mode與控制權重測試** ==(提示詞:蘭頭髮、古代建築、宮廷服飾)==

### 深入測試OpenPose模型
#### <1> 預處理器分別
**先在網路上找一個全身Pose圖**

然後放入不同的預處理器內看差異:
| dw_openpose_full | **openpose** | openpose_face |
|:--------: | :--------: | :--------: |
|  | |  |
| openpose_faceonly | openpose_full | openpose_hand |
|:--------: | :--------: | :--------: |
|  |  | 
|
這六個預處理器可以讓我們自由選擇需要控制身體姿勢、臉、手勢或是全身姿勢
#### <2> 預處理器測試
我想了解預處理器能夠辨識人物姿勢到什麼樣的程度,所以我給了他一些似人非人的圖片處理
1. 使用預處理器:openpose_full
| 單人圖 | 多人圖 | 機器人 |
|:---------:|:---------:|:---------:|
|  | |  |
| **狼人** | **西施惠** | **火柴人** |
| | |  |
2. 使用預處理器:dw_openpose_full
| 單人圖 | 多人圖 | 機器人 |
|:---------:|:---------:|:---------:|
|  |  |  |
| **狼人** | **西施惠** | **火柴人** |
|  |  |  |
- ==由這兩個實驗可以發現openpose_full這個模型的強項是可以一次辨認兩個人,而dw_openpose_full的強項是辨識姿勢能力很好,以後我可以斟酌使用兩個模型==
#### <3> 開始姿勢實驗
我會調整臉的角度以及變換身體與手部姿勢,我想讓AI生成出雖然姿勢奇怪但成品卻無傷大雅的圖片
| 正常姿勢 | 奇怪姿勢1 | 奇怪姿勢2 | 奇怪姿勢3 |
|:---------:|:---------:|:---------:|:---------:|
|  |  |  |  |
|  |  |  | 
|
### 深入測試Shuffle模型
#### <1> ==同張==圖片與==不同==的Shuffle顏色渲染圖
**測試圖片**
| 原圖 |  |  |  |  |
|:-------:|:-------:|:-------:|:-------:|:-------:|
|**預處理圖** | | | | |
| **成果圖**| || | |
### 深入測試Reference模型
我想了解控制權重、ControlNet開始與停止控制步數、Control Mode差別,這三者變數再使用Reference模型時會擦出什麼火花,而不同狀態下Reference模型會有怎麼樣的變化
| 原圖片 |
| :--------: |
|  |
#### <1>控制權重、ControlNet開始與停止控制步數、Control Mode,三變數實驗圖

#### <2>從三個方向觀察此實驗
1. 從ControlNet開始控制時間為主體觀察
- 控制時間 0% ➞ 100%
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | |  |  |
| **[ControlNet]<br>weight:1.0** |  |  |  |
| **[ControlNet]<br>weight:1.5** | | | |
- 控制時間 30% ➞ 100%
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | | | |
| **[ControlNet]<br>weight:1.0** | | | |
| **[ControlNet]<br>weight:1.5** | | | |
- 控制時間 60% ➞ 100%
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | | | |
| **[ControlNet]<br>weight:1.0** | | | |
| **[ControlNet]<br>weight:1.5** | | | |
2. 從ControlNet控制權種為主體觀察
- ControlNet權重0.5
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **控制時間<br> 0% ➞ 100%** | | | |
| **控制時間<br> 30% ➞ 100%** | | | |
| **控制時間<br> 60% ➞ 100%** | | | |
- ControlNet權重1.0
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **控制時間<br> 0% ➞ 100%** | | | |
| **控制時間<br> 30% ➞ 100%** | | | |
| **控制時間<br> 60% ➞ 100%** | | | |
- ControlNet權重1.5
| | Blance | Prompt<br>important | ControlNet<br>important |
|:---------:|:---------:|:---------:|:---------:|
| **控制時間<br> 0% ➞ 100%** | | | |
| **控制時間<br> 30% ➞ 100%** | | | |
| **控制時間<br> 60% ➞ 100%** | | | |
3. 從Control Mode為主體觀察
- Blance Mode
| | **控制時間<br> 0% ➞ 100%** | **控制時間<br> 30% ➞ 100%** | **控制時間<br> 60% ➞ 100%** |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | | | |
| **[ControlNet]<br>weight:1.0** | | | |
| **[ControlNet]<br>weight:1.5** | | | |
- 提示詞比較重要
| | **控制時間<br> 0% ➞ 100%** | **控制時間<br> 30% ➞ 100%** | **控制時間<br> 60% ➞ 100%** |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | | | |
| **[ControlNet]<br>weight:1.0** | | | |
| **[ControlNet]<br>weight:1.5** | | | |
- ControlNet比較重要
| | **控制時間<br> 0% ➞ 100%** | **控制時間<br> 30% ➞ 100%** | **控制時間<br> 60% ➞ 100%** |
|:---------:|:---------:|:---------:|:---------:|
| **[ControlNet]<br>weight:0.5** | | | |
| **[ControlNet]<br>weight:1.0** | | | |
| **[ControlNet]<br>weight:1.5** | | |  |
- 總結:
當我們從控制時間來看,可以非常的明顯看出0%到100%的背景大致沒有什麼變化,而30%到100%和60%到100%這兩者已經不是原本的背景了,然而0到100%的人物姿勢與物件因為其他兩者參數影響而變化最多,所以假設ControlNet生成圖片時比較晚開始運算的話其他兩者參數可改變量就較低。
# Cutoff
這是一個 Stable Diffusion web UI 的擴展插件,它可以限制某些提詞的影響範圍,而作者設計出這個插件其中一個目的是為了阻止過多的顏色提示詞導致Stable Diffusion混亂,而生成不出我要的對應圖
## 實驗
我先隨便打一些跟顏色提示詞相關的字
Prompt:1girl,blue jacket,green hair,red eyes,(yellow_rain_boots:1.2),(white_shirt:1.3),black_pleated_skirt,yellow_star_earrings,full body,
使用Cutoff時要和ControlNet一樣將Cutoff插件啟用並且再輸入欄打上你需要的顏色

- ==沒有==Cutoff的生成圖

- ==使用==Cutoff的生成圖

在使用Cutoff插件後後,能輕易地發現 左圖本來外套有一些些紅色,經過Cutoff後有了更改,而中間那張圖原本裙子顏色跟我描述的黑色白褶裙不同,經過Cutoff也修好了,而在右邊的圖是外套不是純藍色,經過Cutoff後成功還原出來藍色外套
# Dynamic Prompts
這個插件可以改善之前每更改提示詞就需要重新生成才能看到效果,不能同時用好幾種不同的提示詞同時生成圖片,並且運用特殊文法能夠在三個提示詞中隨機選擇兩個來生成,在測試新家的元素提示詞時非常好用
## 實驗
### <1> 單個提示詞
我就簡單的更改頭髮顏色來實際試一次這個插件
| | | |
| :-------: | :-------: | :-------: |
| | | |
Prompt:1girl,miko,street lamp,{white hair \ blonde hair \ purple hair \ blue hair \ brown hair \ black hair},
實際測試後發現這樣效率真的很高,以後遇到不確定要什麼Prompt效果較好時,可以使用這個插件測試看看
### <2> 三選二提示詞
| | ||
| :-------: | :-------: | :-------: |
| | | |
Prompt:1girl,miko,street lamp,blonde hair,{2$$Ghibli \ Makoto Shinkai \ Isayama Hajime},
我測試了三個不同的漫畫家,分別是 1. ⟪你的名字⟫的作者新海誠、 2. 吉卜力和 3. ⟪進擊的巨人作者⟫作者諫山創,而圖片是由左到右、上到下,依著1. 2、1. 3.、2. 1.、2. 3.、3. 1.、3. 2. 的順序去生成的
# 今日學習總結
## 心得
###
這一次報告中我將詳"詳細圖片參數"這個東西給拿掉了,第一點因為做這個步驟非常的繁瑣而且後來我發現並不是我將數據給你,你將數據複製貼進自己的Stable diffusion就可以獲得一模一樣的圖片,好像會遺失一些關鍵數據。第二點因為詳細圖片數據裡的英文加上數字一次就能有500-1000的文字長度,在我前一篇的時候就是因為此問題而需要轉將"詳細圖片參數"轉至Gooogle文件裡。並且因為ControlNet的小功能太多了,所以我先試試每一個功能後,挑了三個我自己比較好奇或是喜歡的功能進行詳細實驗,在這次深入測試中我最喜歡的是Shuffle模型,因為這個模型讓我聯想到了Instagram裡的濾鏡,有種我好像成功自己做了一個濾鏡的小小成就感,而後面的兩個插件呢早知道就早點下載了,害我之前每次生成圖片效率都很慢,遇到想改的提示詞,每次都要等生成完才可以改,現在有了Dynamic Prompts我就可以一次看很多不同提示詞的差別,選擇我最喜歡的提示詞進一步調整其他參數,而Cutoff讓我不會因為Stable diffusion選擇性色盲而讓我爆氣了,雖然我有時用Cutoff效果不是那麼明顯。
### 遇到的問題
這次遇到的問題蠻搞笑的,就是我剛開始使用ControlNet這個新插件的時候,我再生成圖片時把原本擁有的參數,跟ControlNet新加的參數還有預處理器阿ControlNet模型阿全部都調好了,然後生成了大概20-30張圖,我都看不出ControlNet到底在幹什麼,它看起來完全沒有參與到演算運算中,我在網路上找了很多資料,還去資料夾裡看是不是檔案出現了什麼小錯,結果最後我才發現是因為我!!沒有!!!!啟用!!!!!!!ControlNet!!!這讓我覺得自己做了一件好蠢好蠢的事,還耽誤了我很多的時間,哎呀真是氣死我了。

## 這次最喜歡的生成圖

我喜歡這張圖的原因是因為這張圖片跟原圖的感覺很相似,但是背景的建築風格、人的風格、衣服的風格都和原圖差異很大,讓我非常佩服ControlNet的發明者
**原圖:**

## 本日參考資料:
[番茄没有酱 (Youtube)](https://www.youtube.com/@lsm0315/videos)
[常用的ControlNet以及如何在Stable Diffusion WebUI中使用](https://zhuanlan.zhihu.com/p/620074109)
https://www.facebook.com/iamaprophet/photos/a.1767293973284961/1767293526618339/?type=3
https://www.pinterest.com/pin/63191201012404200/
https://github.com/huchenlei/sd-webui-openpose-editor
https://zh.moegirl.org.cn/zh-hk/%E7%81%AB%E6%9F%B4%E4%BA%BA
https://github.com/adieyal/sd-dynamic-prompts
https://mnya.tw/cc/word/1973.html
https://zhuanlan.zhihu.com/p/647051609
https://mnya.tw/cc/word/1940.html
https://www.scratchina.com/html/aihuihua/aihuihuajiaoxue/301.html
https://zhuanlan.zhihu.com/p/647051609
https://www.youtube.com/watch?v=P07S3GFd-7g&ab_channel=%E6%83%AB%E6%87%92%E3%81%AE%E6%AC%A7%E9%98%B3%E5%B7%9D
https://www.youtube.com/watch?v=WV_tW6OWPD8&t=810s&ab_channel=%E7%95%AA%E8%8C%84%E6%B2%A1%E6%9C%89%E9%85%B1
https://www.pinterest.com/pin/138485757381852585/