--- tags: Paper, CLIP --- # 【論文筆記】CLIPascene: Scene Sketching with Different Types and Levels of Abstraction 論文連結: https://arxiv.org/abs/2211.17256 ## Overview 這篇研究提出了一個使用不同類型和層級的抽象概念將给定場景(scene)圖像轉換成草圖的方法。例如以下左圖,每張圖片都有兩個草圖作為例子,左邊的更接近原圖也比較精細,右邊的比較抽象也更鬆散。 作者將草圖的抽象概念區分成兩類,分別是保真度(fidelity)和簡化度(simplicity),並且用兩個 axes 分別控制這兩個方向的程度差異。沿著 fidelity axis,草圖的樣子會從更精確、更接近原圖構造的圖像逐漸轉變成比較鬆散的圖像;沿著 simplicity axis,草圖的樣子會從細節較多轉變成比較稀疏的描繪。 ![](https://i.imgur.com/HjCkqPM.jpg) 過去有少許的研究專注於生成不同層級抽象概念的草圖,但這些研究都是以物品或肖象畫為主,而非場景圖。作者更指出說過往並沒有研究會將抽象概念區分成不同的種類,因此提出這個想法是他們創新的部分。 ## Method 考慮一張 input image,目標是要生成一批的草圖,分別可以對應到不同種類和層級的抽象概念,所以最後會這些生成的草圖會構成一個二維的 abstraction matrix。 整個大致的流程可以透過下圖理解。針對此 input image,首先會先沿著 fidelity axis 學習生成不同真實度的草圖,此時還不會考慮簡化,所以構成的是 abstraction matrix 的第一列。接著針對每一層級的 fidelity 進行簡化,構成對於這張 input image 的 abstraction matrix。 ![](https://i.imgur.com/9QIgbAH.png) ### Training Scheme 定義一張草圖為 $n$ 條在白色背景上的筆畫,我們把一條筆畫視為是具有 4 個控制點的 Bezier curve,此時第 $i$ 條筆畫可以記為 4 個點的集合 $$ z_i = \{(x_i, y_i)^j\}_{j=1}^4 $$ 而一整張草圖可以記為 $$ Z = \{z_i\}_{i=1}^n $$ 代表所有控制點的集合。 生成單一張草圖的整個 training 架構如下圖: ![](https://i.imgur.com/h5tU5iZ.png) #### Fidelity Axis 我們先暫時忽略左下角的 $MLP_{simp}$,只看灰底的部分。將初始的草圖 $Z_{init}$ 餵給一個可訓練的 $MLP_{loc}$,輸出是所有控制點的位移量 $\Delta Z$,將初始控制點的和位移量相加之後得到控制點的最終位置,通過一個可微的 rasterizer $R$ 就可以得到草圖 $S$。 這裡的 rasterizer 是一個可以將向量圖像(vector graphics)轉換成像素圖的方法,因此可以把原先以 Bezier curve 表示的圖像轉換成像素圖。 為了控制 $MLP_{loc}$ 的 training,接著使用到了預訓練的 ViT-CLIP 模型(ViT-B/32)之中的 image encoder。原圖和我們生成出來的草圖都分別輸入一個 CLIP model,loss function 定義為兩者從 CLIP 第 $k$ 個 layer $\ell_k$ 輸出的 activation 之間的 L2 distance: $$ \mathcal{L}_{CLIP}(S, I, \ell_k) = ||CLIP_{\ell_k}(S) - CLIP_{\ell_k}(I_k)||^2_2 $$ 得到 loss function 之後,就可以做 back-propagation 對 $MLP_{loc}$ 的參數進行更新,而 CLIP 和 rasterizer 的參數則凍著不變。進行這個過程直到收斂,我們就可以得到一張 input 圖像的草圖。 比較特別的地方是,整個訓練過程不需要外部的資料,而是只單純靠單一張圖像訓練後直接得到單一張草圖。注意這裡的單一張草圖只對應到單一層級的 fidelity。 為了實現多層級的 fidelity,作者選擇了 ViT-CLIP 中不同 layer 的輸出來計算 loss,對應訓練了不同的 $MLP_{loc}$。這麼做的原因是因為 ViT 的特性,透過比較淺層的 layer 輸出來訓練,可以讓最後的草圖維持更多細節,而透過比較深層的 layer 輸出來訓練則可以讓草圖更不在乎細節,只保持圖像的 semantic meaning。 ![](https://i.imgur.com/Eezodsr.jpg) #### Simplicity Axis 有了各個層級 fidelity 的草圖之後,我們可以針對各個層級的草圖來進行簡化。給定一張在 fidelity level $k$ 的草圖 $S_k$,我們目標是要找到逐漸簡化的草圖 $\{S^1_k, S^2_k, ..., S^m_k\}$,達成此目標的想法是學習如何去掉一些筆畫並改善剩餘筆畫的位置,但仍舊維持整個草圖的辨識度。 生成單一層級的簡化草圖 $S^j_k$ 的過程可以再次透過先前的 training 架構圖了解。訓練一個 $MLP_{simp}$,其輸入是一個常數向量,輸出一個 $n$ 微的向量 $P=\{p_i\}_{i=1}^n$,$p_i$ 代表第 $i$ 個筆畫在簡化的圖中出現的機率,$P$ 會接著輸入到 rasterizer 來生成簡化的草圖 $S^j_k$。 為了訓練 $MLP_{simp}$,定義一個 loss 負責控制讓草圖可以越稀疏越好: $$ \mathcal{L}_{sparse}(P) = \frac{||P||}{n} $$ 在訓練 $MLP_{simp}$ 的同時,也會同時 fine-tune $MLP_{loc}$,也就是說我們的目標函數為 $$ \mathcal{L}_{CLIP}(S^j_k, I, \ell_k) + \mathcal{L}_{sparse}(P) $$ 但截至目前為止我們只考慮生成單一層級 simplicity 的草圖。要控制不同層級的簡化程度,我們還需要考慮 $\mathcal{L}_{CLIP}$ 和 $\mathcal{L}_{sparse}$ 之間的平衡。定義一個 loss function 負責控制兩者的平衡: $$ \mathcal{L}_{ratio} = ||\frac{\mathcal{L}_{sparse}}{\mathcal{L}_{CLIP}} - r||^2_2 $$ 其中 $r$ 是兩個 loss 之間的 ratio,當我們將 $r$ 調小,就會傾向讓 $\mathcal{L}_{sparse}$ 較小,生成一個更稀疏的草圖。因此,要訓練 $MLP_{simp}$ 將一個草圖 $S_k$ 簡化至某單一層級的簡化度,目標函數其實是 $$ \mathcal{L}_{simp} = \mathcal{L}_{CLIP} + \mathcal{L}_{sparse} + \mathcal{L}_{ratio} $$ 下圖展示了要生成一系列簡化的草圖 $\{S^1_k, S^2_k, ..., S^m_k\}$ 的整個過程: ![](https://i.imgur.com/B2JCD4C.png) 給定一張 input image 和已經訓練好的 $MLP_{loc}$,就可以接續訓練 $MLP_{simp}$ 以及微調 $MLP_{loc}$。例如針對第一級的簡化度,我們用第一個 ratio 值 $r^k_1$ 來決定 $\mathcal{L}_{ratio}$ 並訓練 $MLP_{simp}$。生成出第一個層級的簡化草圖 $S^k_1$ 後,再繼續迭代對 model 進行微調來符合相對應的目標函數 $\mathcal{L}_{simp}$,並生成相對應的簡化草圖。 ### Decomposing the Scene 作者發現一次生成整張圖像的草圖有時候可能會產生一些問題,例如隨著生成的草圖越不真實,圖像中的主體可能會被過度誇大,又或者隨著生成的草圖越減化,主體可能會消失在背景當中。 為了減少這些問題,他們將圖像的前景和背景分開,分別生成草圖再合併在一起。作者使用預訓練好的 U^2-Net 抽取圖中最顯著的 object,再用預訓練的 LaMa 模型將圖中的空缺補齊,得到前景和背景圖。 ![](https://i.imgur.com/ldQs38x.png =500x) 分開前景和背景進行草圖還可以對草圖有額外的控制,例如讓前景和背景的草圖簡化層級不同,或者控制背景的透明度等等。下圖為一些分開草圖前景和背景的結果,以及額外控制的例子: ![](https://i.imgur.com/DDaP7Xr.jpg =500x) ## Results 結果的部分,作者都是使用前景和背景分開生成草圖的方法。 ### Qualitative Evaluation ![](https://i.imgur.com/ybkS1Xr.jpg =500x) 上圖顯示本研究提出的方法可以產生很好的效果。上半部沿著 fidelity axis 由左到右,草圖漸漸變得不精確,例如最左邊的草圖,筆畫會特別強調邊界或陰影處,最右邊的圖則是只用簡單的筆畫來表示輪廓或意象,但我們仍然可以辨識出圖像上的東西是什麼。下半部沿著 simplicity axis 由左至右,草圖漸漸變得越來越簡化,但比較少的筆畫依然可以保持圖像的辨識度。 ### Compare with Other Methods 下圖顯示和其他方法進行的比較,可以發現大部分的方法能夠生成細節較多的草圖,和本研究實現的結果中最左邊的那一列最為接近。作者指出說這些其他的方法都不能產生出不同 level 的簡化,而這是他們特別的地方。 ![](https://i.imgur.com/2UsBFKh.jpg) 下圖顯示本研究和 [CLIPasso](https://arxiv.org/abs/2202.05822) 的結果比較。從 (a) 可以看到本研究在重點物體和背景的平衡上較好,這是因為前景和背景有分開產生草圖,但 CLIPasso 是直接對整張完整的圖像進行操作。 (b) 展示了兩個方法在不同層級的簡化度上的差異,其中 CLIPasso 必須明確給定簡化的草圖所需要的筆畫數量,例如下圖分別為筆畫 64、32、16 和 8,但本研究的方法不需要給定筆畫數量,每張簡化所呈現的筆畫數量是用學出來的。兩個方法還有另一個差別是 CLIPasso 並沒有辦法控制 fidelity。 ![](https://i.imgur.com/KV50LWl.jpg =500x) ### Sketch Recognizability 作者在這部分評估產生的草圖是否仍然可辨識,從 CIFAR-100 和 COCO 資料集當中取用了 150 張圖像作為測試集。他們使用一個預訓練好的 ViT-B/16 CLIP model,針對每一張 input image 和相對應的 16 張草圖(4 階層的 fidelity,4 階層的 simplicity)做 zero-shot image classification。 如果一張草圖辨識出來前三名的類別有在 input image 的前三名類別裡,就當作此草圖是可辨識的。會取用前三名的類別是因為作者認為場景圖常常包含一個以上的物體,所以 classifier 分類出來的結果可能在 input image 和對應的草圖上會稍有不同。 下表顯示各個種類的圖像在不同層級的 simplicity 和 fidelity 的草圖對應的可辨識率(recognizability rates)。可以看到隨著草圖越簡化,可辨識率雖然有自然下降,但基本上辨識度都還算高。比較特別的是在第一層 fidelity level,有部分類別(people, animals)的辨識度偏低。作者認為這是因為第一層 fidelity level 對應的草圖比較專注在 image structure 上,而不是抽象的 semantic meaning,所以才會辨識率較低。 ![](https://i.imgur.com/pLvgYQK.png =500x) ### Simplicity Levels 下表顯示在各個 fidelity level 下,每一個 simplicity level 產生的草圖對應的平均筆畫數量。透過圖表可以看到,隨著 simplicity level 越高,草圖會使用的筆畫數量的確也跟著下降,表示真的有做到簡化。 ![](https://i.imgur.com/SW0VAag.png =500x) ## Limitations 這個方法最大的限制是生成草圖所需的時間,因為對每一張 input image,我們都需要先將前景和背景分開,再針對兩者都生成很多張草圖。作者指出若使用一張 GPU 生成一張圖像的一個 4x4 的 abstraction matrix,也就是 16 張草圖,需要花上 3 個小時。 其他限制還包含有些草圖仍然會生成不夠完整或含有異常,以及只將抽象概念分成兩個維度。這些都是在 future work 可以嘗試解決的方向。