●書接上回
本篇講解如何建立一條基本的工作流程,安裝方式見上一篇。兩篇看完就可以安心開始進行基礎的文生圖,也配有影片。
你對ComfyUI的印象是甚麼?
我的話,在我被逼著開始用它之前,我對它的印象是這樣的……
說老實話,我第一次看到這個畫面的時候,立刻默默地把它又關掉了,感覺跟走錯KTV包廂一樣,只想趕快跑。
但其實,這個強大的工具並沒有想像中那麼難理解,反而是一個最佳的由淺入深學習AI圖像生成的平台。不要被這個畫面嚇跑了,它其實,也可以長這樣。👇
Comfy它是一個用功能模組
和節點
來編輯可視化流程
的AI繪圖-圖形使用者介面(GUI)。
它的優點除了本身精簡輕巧、執行速度快、資源消耗較低,還具有更加直觀的使用方式、更加自由的自動化流程、以及更加方便的工作流程分享。
白話一點來說,跑得快、能用更低的電腦資源跑圖,可以看清楚完整的pipline架構,
隨心所欲創造屬於自己的生產流水線,透過在comfy讀取一張AI生成的圖片,可以得到生成這張圖時的完整流程,但它還有一個更輕便的方式,就是工作流程的 json檔,這是一種超級輕巧的資料交換格式,在各種資料傳輸的領域中受到廣泛應用。
(進階閱讀:JSON是什麼?輕量級的資料交換格式基本介紹|天矽科技網頁設計)
想加深對運作邏輯的理解的朋友,可以打開comfy跟著我一起做,我們來拉一個基礎的工作流程,也就是workflow。
這邊推薦搭配影片,可以看清楚操作方式。
如果你的畫面不是空白的,點一下clear
就可以清空。
在空白處用左鍵點兩下就可以打開模組搜尋框
,光看名字不清楚是甚麼東西的話,可以都叫出來看看,不對再砍掉就好。
滑鼠滾輪
可以縮放畫面。
左鍵長按著模組方塊
可以拖動方塊,長按著空白處
可以拖動畫面。
按住shift
選中多個方塊可以一起拖動,同時會讓方塊對齊背景的網格,有強迫症的朋友可以安心了。
這張是官方提供的快捷鍵表,就在comfy的github下面,或者是你從安裝comfy的資料夾裡面找到README點開,是同一份文件。
現在,回想一下,在你的認知中,
AI生成圖像會需要輸入哪些元素、設定哪些參數、經過哪些關卡?
我們先把想到的東西都叫出來擺在畫面上。
首先我會想到prompt,那我就打……欸,不是打prompt,而是text encode來找,第一個就是基礎的文字編碼器,全名CLIPTextEncode
。
但除了正向提示詞之外,有時候還需要設反向提示詞嘛,那麼可以再重複一次剛才的搜尋+新增動作,或是按著alt
拖曳一下這個框,就可以複製一個出來。
擔心會分不出來哪個是哪個的話,comfy是可以改模組方塊的顏色跟名字的。我通常就改個常見的綠色跟紅色區分一下。
接下來還有甚麼是基礎生成流程中,必須要有的?我會想到模型——大模型,那大模型的英文是checkpoint,可以用這個來搜尋。
在checkpoint loader跟loader simple之間我選擇simple,CheckpointLoaderSimple
,現在要建構的是最簡單的流程,我手上沒有config要放,所以選擇使用simple。
有了模型跟提示詞,下一步呢?想一下之前我們聊過的diffsion model生成原理,最重要的那個概念,整張圖的基礎是甚麼?
雜訊嘛~那麼我們要給它一個初始雜訊,在這邊不叫noise,它叫做latent image,EmptyLatentImage
。
打開就可以看到熟悉的設定畫布尺寸,還有一次算幾張的欄位。
下一個你會想到甚麼?step?cfg?guidance scale?seed?還是sampler?
這些參數在comfy都被整合在KSampler
裡面,這個方塊之重要。你會看到點兩下之後出現的列表,他就排在第一個。
真正在進行降噪生成的並不是大模型,而是在這個區塊中,大模型是作為一個被預先訓練好的資料庫,供sampler來調用,後面接線的時候這個邏輯就會很清楚了。
到這邊前端的輸入跟中端的處理都打開了,下一步我應該需要一個output的方塊,用來顯示生成結果嘛。
這裡必須要先提到一個之前在基礎課一直被我略過的東西——Decoder。
有去看過李宏毅老師的課的話,就會知道,其實在整個生成過程中,雜訊是以人類讀不懂的型態來存在的,你可以叫它向量,或是中間產物,或是latent representation,總之它是一個機器能夠辨識,但對人類而言並不是視覺影像的型態。
當這個中間產物經過前面所有流程後,就需要經過一個decoder來把它解碼為人類能夠理解的視覺影像。
在comfy,它叫做VAEDecode
。
那現在我們也有decoder了,最後一步就是加上output。
comfy裡面你可以選擇用preview image
或save image
,save會自動把圖片存到output資料夾裡面,preview不會儲存,但也可以在生成後右鍵選擇儲存,只保留你滿意的圖。(在無限生成模式的時候可能就不太適合XD)
接下來只要把這些方塊連接起來,就可以開始工作了!
那,怎麼接……?
現在的comfy有幫你做基礎防呆,大部分的節點都有顏色區分。但是,我們還是要來理一遍,為什麼要這樣接,因為這才是幫助你理解AI繪圖工具運作邏輯的關鍵。
模組方塊左邊的點是輸入,右邊的點是輸出。
我們一樣從頭開始,首先是prompt,我們的文字,需要經過文字編碼器來轉換成向量,那麼就把模型中的CLIP輸入到prompt這邊來。
接著encode好的prompt,輸入到sampler裡面。接著把大模型和初始雜訊也一起送進去。
開始denoise前,記得看一下sampler這邊的設定,control_after_generate是在控制每次生成後,seed要不要變動。
說真的,我一直到用了comfy之後才搞清楚,原來sampler(採樣器)跟scheduler(調度器)是兩個東西,以前一直以為是同一個東西,兩個不一樣的名字。
最後,把降噪完的雜訊,也就是那個中間產物,輸出到decoder裡。
那我們用甚麼來decode它?用模型裡面自帶的vae來decode也可以,或是你想另外讀取一個vae也可以,只是要拉出來,增加一個VAELoader
的方塊。
到這邊,最基礎的工作流程就完成了!🎉
然後可能有特別聰明的朋友已經發現了……嘿,對,你點一下那個Load Deault它就會自動給你排一串這樣的基礎流程。
但是自己親手拉一遍完整的流程圖,才能確實把東西學進腦袋裡,還是推薦大家跟著我前面說的一起做一遍。
現在,寫個prompt,調整一下參數,測試看看你的流程圖能不能跑起來吧!
最後來分享一個實用的小技巧。
是我剛開始不是很介意,刷了一陣子之後才想起來應該要去改的東西——設定儲存圖檔的資料夾跟檔案名稱。
comfy的檔名語法表在那個使用手冊有說明,時間跟日期還蠻好懂的嘛,這邊我就只解釋一下關於其他的數值要怎麼放上檔名。
它的基本結構是:%node_name.widget_name%
首先你要開啟Properties Panel,也就是屬性面板,在模組方塊上面按右鍵可以找到。
那這個node name要寫的是每個模組方塊上面的這個標題(Title),如果你沒有改過它的名字,或是你讀取的workflow的作者沒有改過它的名字,那就必須把這整串包含空格都打上去,必須要一模一樣才會成功顯示。
如果你覺得太長,或是同時有兩個以上的方塊是同樣的名字,那標題
跟最下面的Node name for S&R
,可以任選一個作修改。
改SR這個是不會動到畫面上方塊的標題列,如果改標題的話就是畫面上的標題也會跟著改變。並且SR這個名稱如果維持預設的話,寫進語法內是讀取不到的,至少要變更過一次才有效。這是我目前測試的結果。
widget name則是參數的名稱,一樣需要打完整,底線也要打。每個語法只能指定一個方塊內的一個參數,所以比方說如果你要寫畫布長寬,就得分開寫latent的長度跟latent的寬度。
只要沒設定成功,就會看到檔名變成一大串語法,
←like this。
我寫了一些基本組合放在這邊,有需要的朋友可以自己複製一下。
日期:%date:yyyy-MM-dd%
時間:%date:hhmmss%
畫布尺寸(長x寬):%Empty Latent Image.width%x%Empty Latent Image.height%
SDXL的seed:%SDXL Sampler v3 (Searge).noise_seed%
一般的seed:%KSampler.seed%
大模型檔名:%Load Checkpoint.ckpt_name%
Lora檔名:%Load LoRA.lora_name%
我現在用的格式:%date:yyyy-MM-dd%/%date:MMdd%_%Empty Latent Image.width%x%Empty Latent Image.height%_%SDXLSampler.noise_seed%
按照日期建資料夾,然後顯示日期、長寬、seed。
Comfyui的起手前置可能有點麻煩,它的介面可能乍看之下有點嚇人,但我真的建議大家用用看,真的好用,開得快、關得快、跑圖也快,消耗資源少,你電腦配備不用很頂,也比較不會在無限跑圖的時候,遇到記憶體不足的問題。
開始接觸comfy之後,我是變得挺懶得開SD的,一方面是run甚麼都比comfy久一點,一方面是因為它之前莫名其妙壞掉,刪掉重裝的時候我完全沒留checkpoint跟lora那些當初載老半天的東西……現在有點不想面對。😭
希望這篇文章有幫助到你,有任何問題歡迎在文章下方或影片下方留言。
也歡迎跟我分享你的使用心得!