阿里天池FashionAI服裝屬性標籤識別Top1%方案分享
前言
上週六剛剛結束FashionAI2018服裝屬性標籤識別的複賽,比賽競爭十分激烈。比賽總共報名近3000支隊伍,經過3個月的比拼,我們隊伍最終獲得了第11名的成績。雖然離第十名只有一步之遙,但是我不遺憾,畢竟這是我第一次參加天池比賽,對於這個結果我感覺對得起自己三個月的辛苦。
乾貨
下面從以前幾點來講解該比賽及方案
- FashionAI比賽內容
- FashionAI比賽方案
- 未來計劃
- 原始碼分享
比賽內容
該比賽是對服裝不同屬性進行識別,服裝的屬性包含:coat length 、collar design、neck design、neckline design、pant length、skirt length、sleeve length,每種服裝屬性包含若干類別,我們需要做的是識別服裝的每個屬性的不同類別。具體類別請參考下圖,該比賽只涉及到了脖領設計、領子設計、翻領設計、頸線設計、袖長、衣長、裙長、褲長八個屬性,每個屬性都有自己的分類。該比賽需要我們分別對每個屬性設計分類器,對每個屬性單獨分類,最終評價分類器每個屬性識別準確率好壞。
詳情請參考阿里天池-服裝屬性標籤識別
任務的定義很直白,簡而言之是分類任務。
比賽方案
首先這是比賽的總體框圖
總體來說有五大部分:
1. 改進版多工訓練
2. Mask RCNN 和CPN的應用
3. 輸入影象大小的影響
4. 資料增廣
5. 多通道網路的訓練
改進版多工訓練
由於是分類任務,目前做分類任務做好的方法是使用深度CNN網路,所以該比賽毋庸置疑必須要有GPU才能做。我們做這個比賽使用了3塊1080Ti、4塊K80(穩定)。最多的時候用了6塊1080Ti、3塊1080、7塊K80 和 1塊P100。(應急的時候借師兄師姐師弟師妹的GPU)是不是感覺GPU有點多,畢竟要不斷的嘗試方案,在有限的時間裡訓練多種不同的方案需要一些GPU,最終定下方案的時候只需要使用2塊卡就足夠訓練了。
一旦使用深度卷積神經網路,不可避免的一點就是資料量的問題。初賽的時候資料量比較小,而現有的分類效果良好的CNN引數量較大,如何用比較少的資料量訓練比較深的網路是要解決的難點之一。
因此,多謝技術圈中培文大佬的分享,使得我們對於這個難點有了新的思路:這個思路便是採用多工學習的方式進行訓練,從而彌補資料量的不足。多工學習在分類和檢測任務中很常見,比如FasterRCNN便同時可實現對物體位置的定位和分類。我們不再對每個屬性單獨訓練,而是將所有的屬性合併起來共同訓練。
多工訓練結構圖如下圖所示:詳細的程式碼請看NasNet程式碼
這個圖來自培文大佬開源的程式碼的視覺化圖。
多工訓練的思想在於如何多種相似資料集共同輸入至網路訓練,對於分類網路而言,所有的任務共享卷積層,全連線層獨立,例如coat輸入到網路中,將會有結果同時在八個全連線層輸出,但只更新coat的全連線層,其他七個FC層不更新,FC層之外的Conv層是都更新的:即共享不同屬性的結構資訊。
這個方法對於資料集數量不多,但是不同資料集的結構特徵很相似的情況下很有用,能夠提升約1個百分點的準確率。
而直接使用八個屬性進行多工訓練是存在不足的,因為八個多工需要識別的特徵是有差異的,比如design和length的顯著性特徵是不同的。因此提出了一種分離多工訓練策略:屬性分成length屬性和coat屬性,分別對這兩個不同屬性進行多工訓練。分離成這樣的多工,每個多工分類器需要分類四個屬性,使用這種方法準確率進一步提升。
但是僅僅是這樣也是不足夠的,如果使用了檢測將衣服關注區域crop之後,design的多工策略需要改變,因為我們對於neck和collar切的影象區域很小,使用的是CPN的方法,而lapel和neckline切的影象區域較大,使用的是MaskRCNN。使用了這種不同策略的影象crop之後,影象的解析度將發生變化,此時影象的結構資訊發生改變,不能將這四個屬性一起多工訓練,於是lapel和neckline合併進行多工訓練,neck和collar合併進行多工訓練。
如下圖所示,分成三個部分進行多工訓練:
以上便是我們採用的改進版多工訓練的方法
Mask RCNN 和CPN的應用
此部分簡單說一下,因為這部分是由本次比賽的主力二號來自上交的老哥做的。由於FashionAI同時舉辦了服裝關鍵點檢測和服裝屬性標籤識別,所以具有服裝關鍵點的資料集,而且屬性標籤識別的比賽允許使用關鍵點對影象進行預處理,因此我們採用關鍵點檢測先對訓練集進行預處理,之後送入分類網路中訓練。
由於length屬性容易出現裁剪不恰當導致服裝部分被裁掉,進而出現服裝length識別錯誤的問題,即length對於裁剪比較敏感,因此本次比賽僅對length的pant和skirt進行裁剪,而且裁剪的也是大圖,無法切成小圖。
因此對design進行裁剪,design中的lapel和neckline佔據較大的面積,因此不能切割很小的影象,於是保留了大部分的影象,而neck和collar在影象中佔據的面積較小,因此可以切割較小的圖。
切割影象示例:
neck:collar:
lapel:neckline:
skirt:pant:
輸入影象大小的影響
輸入影象的大小對於結果的影響很顯著,對於識別而言,官方給的影象都在1000以上,如果輸入到網路的影象resize更大,則對識別而言,影象特徵更明顯更清晰,卷積核提取到更有判別性的特徵。
比賽中,我選用了Inception系列的網路用作識別,因為Inception結構具備多尺度提取特徵的特性。
Inception典型結構如下圖所示:
1x1卷積用來整合concat層通道資訊,用不同大小的卷積多尺度地提取特徵,每個卷積核提取到的featuremap擁有不同的感受野。對於服裝屬性識別任務,多尺度特性提取有助於抓住關鍵資訊,我認為這具有間接attention的作用。
InceptionV3一般輸入大小是299,由於最後分類的FC層擁有Global Average Pooling,所以輸入大小可以改變,並不是固定的,因此,根據下圖在ImageNet的實驗,我採用了393的輸入大小:
其實,對於這個任務而言,可以輸入更大的影象,但是會帶來視訊記憶體佔用顯著增加,對於393的大小,我感覺預測速度明顯變慢,視訊記憶體佔用很嚴重。由於考慮到時間不夠長,就沒能嘗試更大的影象。
資料增廣
這是做影象識別的最基本的技巧,也是在資料集不夠的情況下的一種妥協。一般來說,不同的資料集需要做不同的資料增廣,這是case-by-case的。因此對於一般的影象識別而言,mirror、rotation、random crop都是必須要做的。在服裝屬性識別任務中,我們除了上述的通用的增廣方式,同時也採用了channel shift,也就是顏色通道的變化,使得影象具有不同的顏色。這個操作在一定程度上是有幫助的,避免了顏色資訊影響影象的識別。另外,影象的旋轉對於這個資料集很有幫助,因為測試集中具有很多旋轉的圖片,通過資料增廣,可以對旋轉的圖片更魯棒的識別。
多通道網路訓練
官方限制只能使用兩個模型,因此,為了獲得更好的單模型效能,本次比賽採用了多通道網路訓練策略。
該多通道模型是端到端可訓練的網路結構。不同於訓練完模型之後的簡單融合,其實就是相當於加寬了網路。訓練結構圖如下圖所示:
因為考慮到不同模型結構對於網路的特徵提取不同,因此,我們使用了三種不同的網路特性結構,
通過多網路聯調訓練方式,加深了網路,獲得不同網路對於特徵的提取特性。
這種策略在單模型上很有用,缺陷在於訓練耗時,測試時間長,視訊記憶體佔用比較大。
未來計劃
將在一週內公開原始碼。將來一段時間部落格的內容主要是tensorflow的講解,預計會開一個專欄,專門將tensorflow的重點用法。tensorflow的靈活性使得做競賽、做實驗都很方便