影象風格遷移(Style Transfer)是一種計算機視覺技術,旨在將一幅影象的風格應用到另一幅影象上,從而生成一幅新影象,該新影象結合了兩幅原始影象的特點,目的是達到一種風格化疊加的效果,本次我們使用Stable-Diffusion結合ControlNet來實現影象風格遷移效果。
首先確保本地已經安裝並且設定好了Stable-Diffusion-Webui服務,關於Stable-Diffusion-Webui,請參見:人工智慧,丹青聖手,全平臺(原生/Docker)構建Stable-Diffusion-Webui的AI繪畫庫教學(Python3.10/Pytorch1.13.0),這裡不再贅述。
隨後進入專案目錄,啟動Stable-Diffusion-Webui服務:
python3 launch.py
如果是沒有N卡的電腦,就使用cpu模式啟動:
python3 launch.py --skip-torch-cuda-test --upcast-sampling --use-cpu interrogate
選擇外掛(Extensions)索引標籤
點選從url安裝,輸入外掛地址:github.com/Mikubill/sd-webui-controlnet.git
安裝成功後,重啟WebUI介面。
由於ControlNet預設是一層網路,風格化操作我們需要兩層,所以在設定選單(Settings)中,將多層網路設定為2。
設定好之後,下載模型檔案:huggingface.co/webui/ControlNet-modules-safetensors/tree/main
將模型放入 stable-diffusion-webui/extensions/sd-webui-controlnet/models目錄
這裡還需要單獨下載一個風格遷移模型,地址是:huggingface.co/TencentARC/T2I-Adapter/blob/main/models/t2iadapter_style_sd14v1.pth
同樣放入stable-diffusion-webui/extensions/sd-webui-controlnet/models目錄
至此,Stable-Diffusion-Webui服務的ControlNet外掛就設定好了。
現在,我們開啟ControlNet的第一個圖層,將原始影象的輪廓渲染出來,因為需要保證原始影象的基本形狀。
這裡前處理器選擇head,模型使用ControlNet的head模型即可。
可以看到基本輪廓已經得到了保留,風格化只負責顏色和線條。
隨後設定第二個ControlNet圖層,前處理器選擇t2ia_style-clipvison,模型選擇剛剛下載的t2iadapter_style_sd14v1.pth,預設影象權重為1,先不要動。
接著上傳一張目標風格的圖片,這裡我們選擇文森特梵高的表現主義作品《星空》:
隨後點選Generate按鈕做圖生圖(img2img)操作即可。
經過一段時間的本地推理,生成結果如下:
效果並不盡如人意,這也是大多數深度學習入門者會遇到的問題,也就是過擬合問題。
過擬合(Overfitting)是指在訓練模型時,模型過度地學習了訓練資料的特徵和噪聲,從而導致模型在新資料上表現不佳的問題。
通俗地講,過擬合就像是一名學生背誦考試答案,但是他只是死記硬背了考試題目的答案,沒有真正理解題目的本質和解題思路。當他遇到新的考試題目時,由於沒有理解題目的本質和解題思路,他就無法正確回答。
在機器學習中,過擬合的原因是模型複雜度過高,導致模型對訓練資料中的噪聲和特徵都過度追求,並且忽略了資料背後的本質規律和特徵。因此,當模型面對新的資料時,由於沒有真正理解資料的本質規律和特徵,它就無法正確地對新資料進行預測。
說白了,就是對於原始圖的特徵過分追求,從而淡化了目標圖的風格,還記得ControlNet預設權重是1嗎?這裡我們只需要將權重往下調整,比如調成0.8,再次嘗試生成:
效果不錯,既保留了原始圖的大部分細節,又增加了梵高的表現主義風格。
當然了,權重也不能一味地往下調整,否則也會出現欠擬合(Underfitting)問題,整個風格化遷移的過程也可以理解為是一種「調參」的過程。
通過Stable-Diffusion結合ControlNet外掛,我們可以得到一幅新的影象,該影象結合了兩幅原始影象的特點,既具有內容影象的內容,又具有風格影象的風格。影象風格遷移也可以應用於其他的領域,比如電影、遊戲、虛擬現實和動畫創作等等。