讓AI幫你穿搭!用CLIP實作一個時尚穿搭資料庫

近年來,深度學習除了在單一領域,如電腦視覺、自然語言、語音處理都開創了一片天外,也開始朝向multi-modal learning的方向發展。Multi-modal意指整合多於一種的資料類型共同學習,有點像是幼兒在探索世界時,會同時接收到視覺、聽覺、觸覺…等多種感受刺激,使其能更了解一些概念的不同面向,例如白兔有著大耳朵與短尾巴,摸起來毛茸茸等概念。

2020年由OpenAI團隊所提出的CLIP,就是multi-modal learning的經典模型架構,同時也是近來熱門的DALL-E-2等「AI算圖」工具的基本架構,本篇文章將簡單介紹CLIP模型的概念與架構外,並實際試做一個穿搭資料庫的應用。

程式碼連結(google colab)

什麼是CLIP模型架構?

圖1 Contrastive training of CLIP model

CLIP的目標是透過大量圖片及文字描述,建立兩者間的對應關係,如上圖1. 所示,CLIP模型包含幾個主要部份。首先Image Encoder(圖中綠色部分)是CNN或是ViT等架構,目標是將圖片編碼成固定長度的向量(embedding);而Text Encoder(紫色部分),使用的是Transformer架構,會將一段句子同樣編碼成相同長度的向量,並讓相對應的圖片-文字兩向量相似度越接近1越好,而沒有對應的圖片-文字向量則相似度要接近0 (圖的右側為相似度矩陣),如圖1.中總共有N張的圖片,以及相對應的N段文字,在取得圖片向量I與文字向量T後,我們希望右側矩陣中淺藍色的部分(代表是對應的圖片-文字)數值為1,而其他灰色的部分(非對應的圖片-文字)數值為0。

訓練完成的CLIP模型有著明確的優勢,就是Image encoder與Text encoder能將圖片與文字映射到同一個向量空間,因此可以直接計算圖片與句子的相似程度。若想將其應用到分類情境上,也只需要將不同類別的描述列出,並計算圖片與哪個描述最為相似即可(如圖2. 所示),可直接達到零樣本學習(zero-shot learning)的效果。若想進一步了解CLIP架構較為詳細的描述與應用,建議可參考OpenAI的官方部落格文章。

圖2. CLIP for classification

CLIP應用實作解析

接下來,我們將使用OpenAI釋出的CLIP預訓練模型,做到以文字搜尋資料庫中圖片的效果。本次使用的範例資料為Yang et al. 2014年於CVPR發表的資料集,其中共有1000張真人於室外拍的全身照(範例請見圖3.),在原資料集中也包含了這1000張照片中各個衣物部件的語義分割標籤,但在本次的應用中,並不會用到標籤的部分。

我們會將這個資料集作為穿搭的參考依據,根據輸入的服飾特徵描述,找出相似度最高的照片並呈現出來(用法與google圖片搜尋非常類似,但此方式與google背後的演算法機制不全然相同),一起來看看CLIP能做到什麼程度吧!

關於資料集的更多說明請參考kaggle連結

圖3. sample image of dataset

實作流程依序為

  • 載入CLIP預訓練模型
  • 將1000張圖片透過Image Encoder轉換為1000組向量
  • 根據我們想搜尋的文字描述(prompt),利用Text Encoder同樣轉換為1組向量(這個用來查詢的向量被我們稱為query)
  • 將query跟1000組圖片向量計算相似度
  • 找出前k個相似程度最高的圖片作呈現

程式碼連結(google colab)

實際看一下我們能夠在資料庫中搜尋到什麼穿搭。首先,假設下個月要去參加一場重要的活動,如研討會或婚禮,因此我以” Formal clothes for man.”作搜尋,可以看到CLIP的確幫我們找到資料庫中一些偏向正式的衣服,但可能是國外的穿搭比較前衛一點,長袖配短褲的部分還是讓人不敢貿然嘗試。

圖 4. Query text : Formal clothes for man.

但看到上述的穿搭,也許有人會想挑戰一些比較大膽的風格,因此再以”A man wearing Colorful shirts.”當作搜尋關鍵詞,這次出現的幾套穿搭的確可以考慮敗下去。

圖 5. Query text : A man wearing Colorful shirts.

有趣的是,若將同樣的句子丟到google圖片搜尋,反而得到以粉色系襯衫為主的搜尋結果,也許google對colorful的定義比較特別一點XD(note : 由於google搜尋資訊會持續更新,也許大家後續嘗試所得到的結果會跟我不一樣)。

圖6. search result from Google Image

接著,也考慮到除了衣著,連造型都想換一下。由於CLIP並非只考慮服裝的描述,因此,讀者也可以放入更多說明,這次選擇的輸入是”Man with beard, wearing stylish clothes.”,除了要留鬍子,還想穿得潮一點。的確看到許多潮男,不過似乎他們的帥與衣著無關,跟長相好像比較有關聯。

圖7. Query text : Man with beard, wearing stylish clothes.

想看更多不同的搜尋結果嗎?

圖8. Query text: Woman with white shirts.
圖9. Query text: Man dress like a cat.
圖10. Query text: Cold rainy days.

可以看到,無論是輸入特定顏色,或是比較抽象的描述,例如「穿的像貓的男人」、或是直接形容環境狀態,如「冷冷的下雨天」,都能得到精準度蠻高的結果,這也代表著CLIP某程度上,的確能根據使用者給與的文字描述找到類似的圖片。也歡迎大家嘗試輸入其他的描述內容並且試著玩玩看這樣子的應用。

總結

CLIP在整合文字資訊與圖像上做了非常大的突破,也能透過描述文句找到相對應的圖片,然而研究團隊也發現,要找到一個適當的句子並不容易;此外,在概念非常相似的句子上,搜尋結果也可能有一些差異,建議讀者也可以在上述的應用中,嘗試用不同的句子描述相同的概念,並觀察結果。針對要分類/搜尋的文句做設計,研究團隊稱之為prompt engineering,反倒成為後續需要較多人為介入的部分。

另外,由於CLIP中訓練資料主要是較為廣泛的圖片與句子配對,因此若希望將CLIP模型用於較為精細或領域專業的分類問題(fine-graind classification problem)則效果可能有限。而CLIP較不擅長的內容還包括較為抽象的任務,如在文句中提到數量相關的描述,CLIP也時常無法精確地理解。但是,CLIP的確是深度學習中的一個重要里程碑,也期待能看到更多CLIP延伸的應用以及多模態學習的領域上有趣的進展。(撰稿工程師:蔡岳霖

相關網站與資源

原文連結:利用CLIP模型做時尚穿搭資料庫搜尋