這篇文章主要是想聊聊 Image-to-Image Translation (I2I translation) 以及它的幾個代表性方法。包含:Pix2pix、CycleGAN 和 CUT。
基本上是簡介的性質,內容不會很深。
提到的三個方法來自以下論文:
論文標題:Image-to-Image Translation with Conditional Adversarial Networks
論文標題:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
論文標題:Contrastive Learning for Unpaired Image-to-Image Translation
這次要談的 I2I translation,簡單來說,是把一張圖片轉換成另一張圖片。
通常我們會希望保留輸入圖片的結構、改變它的外觀。以最常見的馬與斑馬轉換為例,我們可能會希望在不改變馬原本肢體動作的前提下,給牠套上斑馬的外皮。
在生成對抗網路 (GAN) 發展起來後,Pix2pix 算是將 GAN 應用到這個領域的先河之一。
提到 GAN,大家可能常聽到關於它的比喻,像偽鈔鑑定就是一個例子。
GAN 最大的一個特色,就是我們要一次訓練兩種網路,它們分別扮演相反的角色。
用偽鈔鑑定當例子,我們的生成器 (generator) 要製造能以假亂真的偽鈔;站在它的對立面,辨別器 (discriminator) 就要對一張鈔票進行分類,鑑定它是真是假。
現今尤其在資料生成的領域,GAN 已經成為常用的技術之一。
傳統我們要判斷生成影像的好壞,並計算出 loss 使模型得以更新參數來學習,常用的方法可能是與 ground truth 計算每個像素的差值,再把所有像素的差距平均起來。
這樣一來,由於我們是計算平均值,在像素值變化劇烈的區域,模型可能會取一個折衷值來使 loss 降低,因此生成的結果通常會較為模糊。
而 GAN 的辨別器,因為它也是一個 deep NN,理論上它應該能學習圖片整體的結構、以及不同位置的像素之間的關係,因此我們希望它可以輔助生成器的訓練。
而 Pix2pix 則是把條件式生成的 GAN (Conditional GAN) 延伸到 I2I translation。也就是說,辨別器不只是看生成結果,它還要觀察輸入圖片當作判斷真假的條件。
以上圖為例,如果你把輸入圖片 (也就是鞋子的線稿) 跟真實的鞋子照片一起輸入給辨別器,辨別器要把它們分類為真;但把線稿與假的鞋子圖片 (由生成器產生) 一起輸入給辨別器時,它要把它們分類為假。相對地,生成器的目標就是讓辨別器認為:線稿與生成圖片之配對是真實的。
這樣的訓練過程,就可以學習輸入 (x) 與輸出 (y) 之間的關係,也就是 I2I translation 的目標。
但這個方法最大的缺陷,就是需要成對的資料 (paired data) 來訓練,也就是說你對每一張輸入圖片,都要給定一張相對應的、期望的輸出結果。這在實務上顯然不一定能輕易做到 (例如:你要蒐集一大堆馬和斑馬的照片,還要保證每一對圖片都符合你設想的條件)。
因此我們更傾向使用非成對的資料 (unpaired data),也就是我們只要求兩個類別 (domain) 各自有足夠的訓練圖片,但不強求它們符合某種對應關係。
但這樣要怎麼限制生成器、使它依照條件生成呢?CycleGAN 提出了 cycle consistency loss。
簡單來說,它會多訓練一組生成器與辨別器,假設我們原本的目標是把馬轉成斑馬,我們會讓另一個生成器去把第一個生成器產生的斑馬圖片再轉回馬的圖片,讓最後這張馬的圖片跟一開始的輸入愈相似愈好。
如此一來,就可以給生成器足夠的限制。
其實這個 loss function 不只是 I2I,後來很多跟 unpaired translation 相關的模型都有用到。
但這個方法的問題也很明顯,我們需要額外的空間與時間給多的這組生成器與辨別器。而且 CycleGAN 的假設太強,你要能把 X 類別的圖片轉換成 Y 類別的,又要能做到反方向的轉換,這有時會影響到生成圖片的品質。
於是 CUT (Contrastive Unpaired Translation) 這個方法,就專注在單方向的轉換,且不需要多一組生成器與辨別器。
顧名思義,這篇方法將 contrastive learning 的概念融入到 I2I translation。
Contrastive learning,大概翻譯成對比學習吧?在電腦視覺領域中,是自監督學習 (self-supervised learning) 很常用的方法。
相較於常見的監督式 (supervised) 訓練,這系列方法不需標記 (label) 圖片。
它會先用沒有標記的資料訓練模型,之後 (通常) 再在訓練好的模型後面接上針對你任務的全連接層 (或其他網路),再使用針對你任務的已標記資料做微調 (有的在這階段只會更新後面的全連接層),以微調的最終結果判斷自監督學習方法的好壞。
對比學習的訓練目標 (通常) 是,使 query 與正樣本在特徵空間或是 latent space 中,相似度提升;反之,與負樣本的相似度要降低。
以 SimCLR [論文連結] 為例,它的正樣本與負樣本都是在一個 mini-batch 裡取樣,mini-batch 的 N 張圖片,經過兩種隨機的 data augmentation (像是隨機裁切、亮度、色調變化等) 變成 2N 張圖片。
對於一張圖片,它經過不同 augmentation 所產生的兩張圖片彼此之間就是正樣本,至於其他 2N-2 張圖片就是負樣本。下面這張圖就展示了這個想法:
至於 CUT,則是把生成器看成 encoder 與 decoder 兩個部分。它在 encoder 後面再接上一個 MLP,把輸入的圖片投影到 latent space 上,接下來同樣是定義正樣本與負樣本,並套用以下的 loss function:
分子的作用是使 query 與正樣本的特徵相似;分母則是讓它與負樣本遠離。
至於為什麼要再多一個 MLP?這個其實就是 SimCLR 提出的,它證明了多了這一層空間的投射後,在下游任務的表現確實會好很多 (MLP 純粹用來做對比學習而已,預訓練結束後 MLP 會被丟掉)。
操作上,CUT 會把原始圖片與生成圖片都輸入給生成器,在生成圖片產生的特徵圖上隨機取一個位置,當作 query;在原始圖片的特徵圖上取 N+1 個位置,其中與 query 相同位置的當作正樣本,其他位置的則是負樣本,藉此控制生成圖片的結構。
此外,CUT 也用了辨別器來引導生成器學習。
最近也有一些針對 CUT 的改進工作。像是不使用隨機的方法,而是用一些方式「選擇」要拿來做 contrastive learning 的位置;或是把不同位置的圖塊之間的關係也納入訓練時的限制等等。
總而言之,I2I 這個領域真的很多人在做。挑這三個也只是因為我相對稍微熟一點而已。有什麼有趣的模型也歡迎留言分享XD
話說,我也是前陣子才發現,這幾篇幾乎是同樣的一批作者,都是足以推動這個領域進展的作品,實在太了不起了XD
我決定把這個系列叫「無鹽粄條加香菜」,算是我在學習過程中留下的一些心得吧。
這篇還是寫得很淺,想偷懶一下 (X
總是會有這種想法:每次寫這些文章,就是在直面自己的爛,但也希望藉由這種刺激,喚起自己的熱忱、歌頌知識的美妙。
總之再次感謝看到這裡的大家,我也還在學習中,文章的編排也仍在調整,若有哪裡寫得不好,都可以留言指出或是補充。
希望還有機會在這裡見到大家。
我是無鹽粄條,祝大家一切順心,大家再見。