語義分割(Semantic Segmentation)指的就是針對畫面中每個像素點進行辨別分類(山、河流、人、車、沙發….等),並將同一類型的區域分塊標註成特定顏色。而ControlNet的控制約束裡就有這一項功能。
從下方圖示就可以很清楚明瞭何謂語義分割 :
(上圖來自網站OneFormer : https://huggingface.co/spaces/shi-labs/OneFormer,很多時後ControlNet本身的Segmentation預處理器辨識分類效果不理想時也可以直接到這網頁上試看看其它演算的效果,產出Segmentation Map 再丟回SD算圖)
ControlNet的Seg預處理器目前有3種,各別預處理圖的效果與成像實例如下圖所示。目前測試下來,絕大多數的情況,seg_ofade20k的效果都比較理想,辨別的準度相較較高。
Segmentation的預處理圖讓我想到之前圖生圖裡的Sketch塗鴉功能。只是在用Sketch塗鴉功能時,在提示詞裡多少還是要將畫面的內容物進行文字的描述,告訴SD畫面中我塗鴉的地方各別大約需要些什麼內容物。但如果應用上Segmentation,語義分割事先就將每個不同的顏色定義出特定的物品類型了,我們可以不用再多做文字描述SD就知道該畫些什麼東西出現在畫面中。而且很多時後,當畫面內容物愈複雜時,SD未必就這麼看得懂你所有的文字描述,但語義分割後的區塊則就很明確有效地限制住SD該畫些什麼類型的物品出來。
(PS.題外話~ 在AI繪圖開始熱門後,網路上風氣好像AI繪圖就得要去學很高深複雜的”詠唱術”,非得寫出一堆落落長的文字描述不可才比較厲害,然後就得到處去學/找/抄提示詞來愈加愈長。但我真的很不喜歡這種方式,我還是喜歡圖像盡量可以回歸直覺直觀的用圖去和AI溝通。所以在所有的文章範例中或是平時在用AI產圖時,我都是盡可能的不去寫太多提示詞的文字描述,甚至有時能省就省給它全空白。我相信AI只會愈來愈聰明,未來不斷出現的繪圖模型被餵進去的原圖品質只會愈來愈好,應該不用永遠都需要我很囉唆地去講一堆文字描述說明我的想法或是去規定它的畫質/品質吧~)
我們可以事先把一張看起來符合自己大致理想的畫面構圖進行語義分割,之後再丟進Photoshop裡自行塗鴉調整/增減畫面中的色塊(內容物) :
如下圖,原圖中左邊的草地禿了一塊,我想把它補上,另外左後方再加間小木屋。
又或者可以自行查看 Segmentation Color Code ,找出每種物品類型對應的顏色來畫張色塊塗鴉稿,再讓SD來生圖。
從Color Code裡找到Lake的色碼是”#0ABED4″,同樣上面這張風景圖我就再加上個門前有湖、門口出入的道路改道繞一下…..
另外一個搭配應用就是,前面文章我們提到過Depth深度約束能夠表達畫面物品前後深度關係,但並無法紀錄下不同深度下的內容物品分別是什麼,而現在Seg則是可以標註畫面區塊的內容物類別,可是它是平面的,缺少深度的訊息。
那麼在使用SD生成圖像必要時我們就可以把這兩者互相配合使用,就像前一篇OpenPose動作姿勢約束裡的案例一樣,有些需要考慮深度前後位置關係的動作光靠骨架圖無法直接產出理想的畫面時,我們就再加一個Depth深度約束來一起使用。
ControlNet的某些約束類型很多時後單一使用並不這麼好用/或是無法有效解決問題,總是會覺得還不夠精準明確/有點廢。但其實就是要多花些時間/耐心,想一下把各種組合搭配試看看/截長補短,同時也可以結合原本所學過的其它軟體應用一起實驗。最後會發現很多功能再廢,經過思考配合,在某些特定時後它也是能發揮出大作用的~