天天看點

DeepFashion服裝檢索及代碼實作DeepFashion

DeepFashion

資料集介紹

DeepFashion是香港中文大學開放的一個large-scale資料集。包含80萬張圖檔,包含不同角度,不同場景,買家秀,買家秀等圖檔。總共有4個主要任務,分别是服裝類别和屬性預測、In-Shop和c2s服裝檢索、關鍵點和外接矩形框檢測。

每張圖檔也有非常豐富的标注資訊,包括類别,屬性,Bbox,特征點等資訊。部分任務中的資料集需要郵件聯系作者擷取解壓縮密碼。

Category and Attribute Prediction Benchmark

這個任務主要是做服裝分類和屬性預測的,其中共有50中分類标記,1000中屬性标記,包含289,222張圖像。每張圖像都有1個類别标注,1000個屬性标注,Bbox邊框,landmarks。更多資訊

DeepFashion服裝檢索及代碼實作DeepFashion

In-shop Clothes Retrieval Benchmark

這個任務的資料集為賣家秀圖檔集,每個商品id,有多張不同角度的賣家秀,放在同一個檔案夾内。總共7982件商品,52712張圖像,每張圖檔都有463中屬性,Bbox,landmarks,以及店鋪描述。更多資訊

DeepFashion服裝檢索及代碼實作DeepFashion

Consumer-to-shop Clothes Retrieval Benchmark

這個任務的資料集是賣家秀買家秀對應的資料集,每個商品id對應的檔案夾中包含一張賣家秀和幾張買家秀。總共33881種商品,239557張圖檔。每張圖檔都有Bbox,303種屬性,以及來源說明(賣家,買家)。更多資訊

DeepFashion服裝檢索及代碼實作DeepFashion

Fashion Landmark Detection Benchmark

這個任務的資料集主要是做landmark和Bbox用的,包含123016張圖檔,每張圖檔都有landmarks和Bbox的标記,還有類别标注(上衣,下裝,全身),以及姿态(正常姿勢,大幅度姿勢等)資訊。。更多資訊

DeepFashion服裝檢索及代碼實作DeepFashion

FashionNet

關于服裝檢索,這篇文章作者在In-Shop和C2S兩個子任務上做了BaseLine的工作,并将其命名為FashionNet,除了利用到了服裝的屬性、類别資訊之外,作者新穎的提出了使用landmarks輔助提取特征的方法。個人認為這種方法有一些attention的意思在裡面,通過landmarks detection子網絡得到服裝特征點以後,對特征點附近進行局部特征編碼,最終将其應用在服裝檢索任務中。

網絡結構

論文提到的FashionNet方法采用的網絡backbone為VGG16,實際上經過筆者的複現,使用更新、表征能力更強的網絡作為backbone時檢索精度還會得到提升;在VGG16網絡中,stage4之前的網絡結構權值都是共享的,在這一基礎上發展了三個網絡分支,如下圖所示:

DeepFashion服裝檢索及代碼實作DeepFashion

上圖的橙色部分、綠色部分和藍色部分分别代表了全局特征提取網絡、局部特征提取網絡和特征點回歸網絡。

  • 橙色部分(全局分支):基于共享的VGG16前4個stage,增加了自己的conv5卷積結構,然後接一個全連接配接層用于特征編碼,輸出特征作為最終檢索特征的一部分。
  • 藍色部分(關鍵點回歸分支):與VGG16網絡結構類似,在stage5卷積結構後面使用兩個全連接配接層進行特征編碼,根據輸出的特征分别再使用兩個全連接配接層輸出服裝關鍵點和關鍵點是否可見的标簽。
  • 綠色部分(局部分支):借助于藍色分支輸出的服裝關鍵點,論文作者提出了一個新的層,landmark pooling layer,與Faster RCNN中的ROI Pooling層類似,目的在于對提取特征圖上的某一塊區域進行統一的編碼工作。這部分的特征稱之為局部特征,将橙色部分和綠色部分的特征按通道組合在一起之後經過一個全連接配接層再編碼一次,然後基于這個特征對屬性、類别标簽進行分類學習,同時使用triplet loss進行輔助學習。

landmark pooling layer

landmark pooling layer是作者在本文的一個創新點,在圖像檢索中,landmark所代表的其實是一個局部的,細粒度的特征,通過将這部分特征與全局特征組合能較好的對圖像内容進行表征,基于這一點,作者設計了一個關鍵點回歸子網絡,基本部分與主網絡共享權值。輸出的關鍵點位置資訊作為輸入被綠色部分網絡所接收。綠色部分的網絡将關鍵點位置映射到VGG16 stage4 conv層的輸出特征圖上,對其附近的特征做統一size的Crop提取,稱之為局部特征圖。然後對于每一個局部特征圖,首先使用max-pooling層操作之後将所有的局部特征圖按通道組合在一起,後面使用一個全連接配接層對其進行編碼輸出,得到固定次元的局部特征。landmark pooling layer的圖示操作如下所示:

DeepFashion服裝檢索及代碼實作DeepFashion

需要注意的是,藍色部分的關鍵點回歸網絡其實除了輸出特征點的位置資訊之外,還輸出了關鍵點是否可見的标簽,在landmark pooling layer操作中,标簽為可見的關鍵點可以用作局部特征提取的輸入,但是對于不可見的關鍵點,論文并沒有給出詳細的操作訓示,筆者将其固定取圖像左上角的一塊特征區域,最終依然能複現出論文結果。

前向傳播

作者在論文中對FashionNet使用了multi-stage的訓練方式:

  • 首先在第一個stage中,作者設計将藍色網絡的loss權重調高,而用于屬性、類别分類及triplet學習的loss權值保持正常。經過一段時間的疊代訓練之後進入stage2。
  • 使用stage1中的最優模型作為fine-tune基礎,作者開始第二輪訓練,網絡結構和訓練資料保持不變,超參數不變(推測)。與stage1不同的是,這一階段的訓練中,關鍵點回歸子網絡中的loss比重與其餘loss保持一緻。

這樣做的理論依據在于,網絡的表征能力受到了關鍵點回歸準确程度的影響,在第一個訓練階段中,增加關鍵點回歸子網絡的loss比重,可以使得網絡在優化訓練過程中朝着關鍵點回歸任務偏移,但屬性、類别分類器的存在,也使得網絡在疊代過程中同時兼顧了服裝類别的區分。通過一段時間的第一階段訓練之後,将訓練政策調整為所有loss的權重平等,對于一開始就使用平等權重的loss進行訓練,能更好的達到局部特征輔助全局特征進行分類的效果。

反向傳播

FashionNet網絡在訓練過程中總共使用了4種loss結構

關鍵點回歸

關鍵點回歸使用了L2 regression loss,公式如下:

L l a n d m a r k s = ∑ j = 1 ∣ N ∣ ∣ ∣ v j ∗ ( l j ′ − l j ∣ ∣ 2 2 L_{landmarks}=\sum_{j=1}^{|N|}||v_{j}*(l_{j}^{'} - l_{j}||_{2}^{2} Llandmarks​=∑j=1∣N∣​∣∣vj​∗(lj′​−lj​∣∣22​

  • D D D 表示了訓練樣本
  • l j ′ l_{j}^{'} lj′​ 表示第 j j j個樣本的groundtruth關鍵點位置
  • l j l_{j} lj​ 表示預測出的第 j j j個樣本的關鍵點位置

關鍵點可見标簽和服裝類别标簽

這兩點使用了多标簽分類任務,Softmax分類器及其loss函數被用于訓練這部分内容,loss分别為 L v i s i b i l i t y L_{visibility} Lvisibility​和 L c a t e g o r y L_{category} Lcategory​。

屬性預測

屬性預測為帶權重的cross-entropy loss,其實就是Softmax loss在二分類上的展現,這裡需要注意的是對于不同的屬性,由于正負比例不均是以使用了不同的權重去定義該部分的loss,公式如下所示:

L a t t r i b u t e s = ∑ j = 1 ∣ D ∣ ( w p o s ∗ a j log ⁡ p ( a j ∣ x j ) ) + w n e g ∗ ( 1 − a j ) log ⁡ ( 1 − p ( a j ∣ x j ) ) L_{attributes} = \sum_{j=1}^{|D|}(w_{pos} * a_{j}\log p (a_{j} | x_{j})) + w_{neg} * (1 - a_{j}) \log (1 - p (a_{j} | x_{j})) Lattributes​=∑j=1∣D∣​(wpos​∗aj​logp(aj​∣xj​))+wneg​∗(1−aj​)log(1−p(aj​∣xj​))

其中:

  • x j x_{j} xj​和 a j a_{j} aj​分别表示第 j j j張服裝圖像及其對應的屬性标簽;
  • w p o s w_{pos} wpos​和 w n e g w_{neg} wneg​為兩個系數,這個就是上面提到的不同屬性标簽的loss權重,這個權重由某個屬性标簽positive和negative樣本數量來确定。

三元組損失函數

度量學習triplet loss同樣也被用于在組合特征中對不同的服裝類别進行區分度學習,其使用歐氏距離作為距離判定标準,限制條件為:

L t r i p l e t = ∑ j = 1 ∣ D ∣ max ⁡ { 0 , m + d ( x j , x j + ) − d ( x j , x j − ) } L_{triplet} = \sum_{j=1}^{|D|} \max \{0, m + d (x_{j}, x_{j}^{+}) - d (x_{j}, x_{j}^{-})\} Ltriplet​=∑j=1∣D∣​max{0,m+d(xj​,xj+​)−d(xj​,xj−​)}

對于三元組損失的詳細内容不再解釋,有需要請點選triplet loss

資源清單

官方首頁 - Large-scale Fashion (DeepFashion) Database

代碼實作 - 谷歌雲盤,代碼未整理

繼續閱讀