之江杯2020零样本目标分割题参赛总结
文章目錄
- 一、賽題簡介
- 二、ZS3Net簡介
- 三、我的tricks
- 四、總結
??比賽鏈接:https://zhejianglab.aliyun.com/entrance/531816/rankingList。我最終排名第四,這是綜合決賽第一輪、第二輪線上成績和最后答辯成績的排名,實際上我最后決賽第二輪線上成績已達到第二。和商業賽不同,之江杯更關注學術問題,這個賽題也比較前沿,報名團隊只有三百多個,但看最后的決賽名單就知道,來的多是非常專業的團隊。我這次依然是solo參賽,最后居然沖到了前排,真是沒想到,實屬幸運。
一、賽題簡介
??本題屬于圖像語義分割任務,零樣本是指沒有提供任何測試集類別的樣本,但提供了和測試集相似類別的圖像及語義分割標注作為訓練集,此外可以使用已訓練好的詞向量表來連結訓練集類別和測試集類別間的語義關系,(詞向量可以理解為一種用數字編碼表示的詞典)。舉例:訓練集中提供了西瓜的圖像分割樣本,測試集要求實現哈密瓜的圖像分割,好比一個人見過西瓜但從來沒有見過哈密瓜,他可以通過查閱西瓜和哈密瓜的詞典來推測哈密瓜長什么樣子。
??零樣本目標分割任務的初衷是為了解決圖像語義分割問題標注成本非常高的問題,同時這也是對更為通用的人工智能的一種探索,要求機器不僅能夠識別圖像,還要把圖像名稱的語義和圖像特征對應起來。本賽題訓練集200類(下稱已知類,seen),共約80000張圖片,是和ImageNet風格類似的實物照片,測試集初賽和決賽都各有不同的50類(下稱未知類,unseen),每類約100張圖片。
??這個問題比較前沿,相關文獻和開源不多,能夠查到的按時間順序排序是SPNet -> ZS3Net -> CaGNet。CaGNet應該是當時的SOTA,這次比賽CaGNet的作者團隊也來了,但最后沒有獲獎,學術和比賽畢竟還是不一樣,比賽需要很多trick,就比如孔子參加科舉未必能中舉因為他不會寫八股文,但大師的成就不是區區小賽的成績所能比的,向他們致敬。這次比賽的冠軍團隊來自浙江大學,確實非常牛,心服口服,他們的方法已經撰寫論文被頂會錄用(好像是AAAI?),應該是新的SOTA了。
二、ZS3Net簡介
??由于賽程短,我還是零基礎進入,自然是采用本渣一貫的策略:走別人的路,讓別人無路可走(囧)。看了一圈文獻后,覺得CaGNet較難,估計來不及,所以從ZS3Net下手,ZS3Net是該領域較早期的一個作品。下面簡介一下ZS3Net和我的理解。
??原文NIPS2019:https://arxiv.org/abs/1906.00817
??代碼:https://github.com/valeoai/ZS3
??先放上論文主圖:
??ZS3在經典圖像分割網絡DeepLabV3+基礎上動手術,首先把網絡切開,切出末層和除末層之外的前層。網絡末層的輸出是像素級的分類結果,而末層的輸入就是每像素所屬類別的語義特征,語義特征是什么?也是詞向量。而零樣本任務中已知類和未知類的唯一連結就是詞向量,這樣我們從DeepLabV3+末層的輸入入手,就可以把已知類和未知類關聯起來。
??然而DeepLabV3+的末層輸入的這個詞向量和我們從其他文本中訓練得到的詞向量(我使用的是Glove6B)是不對應的。我們可以想象一下,假設末層輸入的語義特征是300維,它可能是按照顏色、紋理、形狀…這樣的300個屬性排列的,但我們從外界得到的詞向量可能是物種、材料…、形狀、紋理、顏色…等這樣的排列,兩者有交叉部分,但順序不同,描述方式也不同,好比是兩本詞典,你需要一個翻譯機制翻譯過來。
??ZS3Net創造性的提出用生成器的方式實現這個翻譯。這個生成器的輸入是外界得到的詞向量,比如Glove6B中詞向量,輸出是剛才提到特征向量(即DeepLabv3+末層的輸入,當然它也是前層的輸出),使用已知類的Glove6B詞向量和DeepLabv3+前層輸出特征向量訓練這個生成器,訓練好的生成器就掌握了這種翻譯機制,可以用來根據未知類的Glove6B詞向量生成未知類的特征向量。
得到了未知類的特征向量再用它來訓練DeepLabV3+的末層(前層凍結不訓練),得到了新的網絡權重,就可以直接用于未知類的分割任務了。
??這個問題可能有點繞,我再來捋一遍,其實就是分為3步:
??1,在已知類上把DeepLabV3+訓練充分;
??2,使用訓練集類別的詞向量和訓練集圖片經DeepLabV3+前層輸出的特征向量訓練一個生成器;
??3,從Glove6B中得到未知類的詞向量,用生成器生成特征向量,用這個特征向量替換訓練集圖片經DeepLabV3+前層輸出的特征向量(注,只替換目標部分,不替換背景),同時也替換訓練集標注Label中的已知類類別為未知類類別。然后再凍結前層,重新訓練末層。最后把前層權重和末層權重合并起來得到的新的網絡權重,就可以直接用于未知類測試集的推理。
??實際ZS3Net原文方法比我講的要復雜一些,還用了一些技巧,但核心原理就是我剛才講的三步。
三、我的tricks
??單靠已有開源想在這種比賽中獲勝是不可能的,我在仔細分析數據、調試網絡之后,進行了以下三點主要的改進,正是這三點改進使得分有了很大提高。
1、對訓練集逐類別加強訓練
??由于本題訓練集的類別數特別多,高達200類,而且各類差別很大,有的很好訓練,而有的很難訓練,主要是上帝造的東西都比較好訓練一些,人造的東西都難訓練。如果全部丟進去一起訓練,網絡訓練進展非常緩慢,而且我卡也有限,只有2080ti,跑兩天兩夜也只達到mIoU0.25的水平。逼的沒辦法,我設計了一種逐類別訓練的方法,效果不錯。具體如下:
??step1: 先把200類全部訓練幾個epoch,驗證每一類的IoU,把IoU達到一定閾值以上的類別稱為learned類,表示它們已經訓練好了,把剩余的稱為unlearn類。
??step2: 然后每epoch從unlearn類中隨機挑選10個作為to learn類,從learned類中每類選50張圖片以保持記憶性,從to learn中每類選200張圖片以加強訓練。每輪訓練結束再驗證,重新劃分learned類和unlearn類。
??如此循環往復。我最后達到159類learned,還有41類確實非常難以分類,仍然是unlearn。這樣可以達到mIoU0.36,比直接訓練法整整提高了11個點!
2、只使用優質數據訓練生成器
??ZS3Net的生成器使用GMMN,它比較簡單,參數也少,所以訓練它不難,不需要非常大量的數據。但是由于deeplabv3+本身在本題訓練集上的成績并不是很高,mIoU0.36實際上意味著它有很多分割結果仍是錯誤的,如果我們用這些錯誤的特征向量和類別對應關系去訓練這個生成器,這個生成器的翻譯就會不準。
??所以我們應該去掉那些錯誤數據,只喂給生成器最好的飼料來訓練。一個自然的想法是只用learned類來訓練它,更進一步還可以深入到每張圖片,比如計算每張圖片的acc,只用acc高的圖片來喂它。這樣訓練出來的生成器就更加準確。
3、用一種新穎的方法對結果進行融合
??觀察測試集推理結果我發現,網絡對很多圖片分割也都大致能分割出來,但分類卻是錯誤的,更細致的觀察我發現如果網絡對某張圖片分類錯誤時它會表現的沒有正確時那么“自信”,就是它分割出的面積會小一些,比如缺一塊或者中間有孔洞。這樣我就想出了采用如下方式進行融合:
??step1:在不同訓練條件下得到的各個權重分別對測試集做推理
??step2:對比同一張圖片在不同權重下的推理結果,選擇目標面積較大的一個作為最終推理結果。
這個方法也很有效,我在決賽第一輪的時候沒有使用融合,只排到第6名,決賽第二輪的時候使用了這個融合,排到第2名。
四、總結
??本次賽制是初賽取前12名進入決賽,決賽前6有獎,我是以初賽第11名進入決賽的,所以我去現場的時候沒報希望,心態也非常放松。由于決賽采用了未知類詞向量統一提供的方式,而初賽很多團隊在詞向量方面做了不少工作,所以改這種方式之后很多隊伍翻了船,而我自始至終本本分分的做零樣本網絡方面的工作,沒有去琢磨詞向量,所以決賽我占優勢。另外決賽第二輪我想到了用上面提到的融合方法又提了不少分,說實話第一輪我也想到了,但是當天一直在趕路,而且心態上沒抱希望所以沒有打起精神來改代碼就沒用融合。
這次比賽認識了很多大佬,結識了幾位朋友,收獲滿滿。
總結
以上是生活随笔為你收集整理的之江杯2020零样本目标分割题参赛总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异源遥感图像匹配的一种思路——智箭火眼2
- 下一篇: 基于深度学习和机器学习的心电图智能分析参