基於遷移學習的語義分割算法分享與代碼復現

摘要:語義分割的數據集是比較大的,因此訓練的時候需要非常強大的硬件支持。

本文分享自華爲雲社區《【雲駐共創】基於遷移學習的語義分割算法分享》,原文作者:啓明。

此篇文章是分享兩篇基於遷移學習的語義分割算法論文。第一篇:《Learning to adapt structured output space for semantic segmentation》,第二篇《ADVENT: Adversarial Entropy Minimization for Domain Adaptation in Semantic Segmentation》。

Part 1:遷移分割的背景介紹

語義分割,與檢測和分類,是機器視覺領域的三個主流方向。但是語義分割相對於檢測和分類來說,它面臨着2個非常困難的問題:

一是它缺少數據集。分類的數據集是指標註一個類別,檢測的數據集是指標註一個檢測框,而分割的話,它的目的是要做語義級的預測。這就意味着它的標註也需要是像素級別的標註。我們知道,標註一個像素級別的數據集是十分耗時耗力的,以自動駕駛裏面的Cityspaces舉例,此數據集標註一幅圖需要1.5個小時。在這種情況下,如果要我們自己來構建語義分割的數據集的話,時間精力成本是非常大的。

另一種問題,就是因爲語義分割還需要覆蓋現實世界的數據集。但實際情況是,它很難覆蓋所有的情況,比如不同的天氣,不同地方,建築的不同風格,這都是語義分割要面臨的問題。

那在面對上面兩種情況下,研究者是如何解決語義分割的這2個問題的呢?

除了要從數據集上來解決,他們發現可以通過計算機圖形學等技術通過合成出模擬的數據集代替真實世界的這些數據集,從而降低標註的成本。

以一款大家熟悉且常見的GTA5遊戲來說:在GTA5裏,有一個任務就是採集GTA5遊戲裏的模擬數據,然後通過數據引擎這種自然而然的標註去降低標註成本。但是這裏會出現一個問題:在這些模擬數據上訓練的模型,在實際現實世界的時候,會出現性能的降低。因爲傳統的機器學習需要有一個前提條件,就是你的測試集和你的訓練集是相同分佈的,而你模擬數據集和現實數據集必然的就存在分佈的差異。

因此我們現在的目標就是,通過研究出來的遷移算法解決在源域訓練的模型在目標域上性能降低的問題。

兩篇論文的主要貢獻介紹及相關工作

主要貢獻

第一篇:《Learning to adapt structured output space for semantic segmentation》:

1、提出了一種機遇對抗學習的遷移分割算法;

2、驗證了在output space 進行對抗能夠有效的對其兩個域的場景佈局和上下文信息;

3、利用對多個層次的輸出進行對抗,進一步提高了模型的遷移性能。

第二篇《ADVENT: Adversarial Entropy Minimization for Domain Adaptation in Semantic Segmentation》:

1、利用基於熵的損失函數,防止網絡對目標域做出可信度較低的預測;

2、提出了一種機遇熵的對抗學習方式,同時考慮熵減和兩個域的結構對齊;

3、提出了一種基於類別分佈先驗的約束方法。

相關工作

在講解兩篇論文之前,我們先簡單介紹另一篇文章:《FCNs in the wild》。這篇論文,是將遷移學習用在語義分割上的第一篇論文。其提出通過對語義分割的特徵提取器提取出來的特徵送入到這個判別器裏面,然後通過對齊Global的信息,完成分割任務上的遷移。

首先,我們先介紹一下常用的語義分割的網絡是一個什麼樣的形式。常用的語義分割一般是由兩部分組成:一部分是特徵提取器,比如可以用Resnet系列,或者VGG系列來提取圖片的特徵;二是分類器,將前面提取的特徵送入到分類器裏面(分類器比較常見的是PSP,或者DA分割裏面最常用的 DeepLab V2裏的ASPP)。通過把特徵提取提到的特徵送入到判別器裏面,進而來完成整個DA。

爲什麼把特徵送入判別器能完成DA呢?從判別器的作用上,我們可以來理解這個問題。

訓練判別器,就能讓它區分輸入進來的圖片到底是真還是假。在這個過程中,需要用判別器區分輸入的特徵是源域還是目標域。得到一個能夠區分特徵是源域和目標域的判別器之後,固定判別的參數不變,去訓練分割網絡的特徵提取器。如何訓練呢:讓這個特徵提取器來混淆這個判別器。

那麼特徵提取器又怎麼來混淆判別器呢?無論是提取源域還是目標域的特徵,都要把這兩個特徵的分佈對齊,這樣的話就相當於把這兩個域的特徵,使這個判別器區分不出來,那麼就完成了“混淆”的任務。一旦完成了“混淆”任務,就說明特徵提取器提取到了這個“域不變”的信息。

提取到“域不變”的信息,實際上就是在做一個遷移過程。因爲網絡有了提取“域不變”信息的功能,那麼無論是源域還是目標域都能提取出來一個非常好的特徵。

後面我們的兩篇文章都是基於“利用對抗及判別器”這個思想進行指導的,但不同的是,後面兩篇文章輸入判別器的信息不一樣,具體的我們後面再詳細介紹。

第一篇論文算法模型剖析:

文章標題:《Learning to adapt structured output space for semantic segmentation》

這篇論文和前面相關工作論文裏的第一篇工作一樣,是由分割網絡和判別器組成的。從上面的圖,或者就從題目上就可以看出,它是output space做adapted。那什麼是output space呢?

這裏的output space就是,語音分割網絡輸出的結果經過softmax之後,變成了一個概率的東西,我們稱這個概率爲output space,

此論文的作者認爲直接用特徵做對抗是不好的,不如用output space概率來做對抗,爲什麼呢?因爲作者認爲,在原本,就比如分類裏面,大家都是用特徵來做的,但是分割是不一樣的。因爲分割的高維度特徵,就是你前面的特徵部分,是一個非常長的向量,比如Resnet101的最後一層,它的特徵長度2048維的,如此高維度特徵,編碼的信息當然更加複雜。但是對於語義分割,可能這些複雜信息並不是有用的。這是作者的一個觀點。

作者的另一個觀點是,語義分割的輸出的結果雖然是低維度的,即output space這個概率,實際上只有類別數的這樣的一個維度,就是假如類別數c的話,它這個概率對於每個像素點就是c*1的一個向量。雖然是低維度空間,但是一整個圖片的輸出,實際上包含了場景、佈局以及上下文這些豐富的信息。本論文作者認爲不管圖片來自於源域還是目標域,分割出來的結果在空間上,應該是具有非常強的相似性的。因爲不管是仿真數據還是模擬數據,同樣都是在做的分割任務上。如上圖,其源域和目標域都是針對於自動駕駛來做的。很明顯的一個觀點是,中間大部分可能是路,上面一般是天,然後左右可能是建築。這種場景上的分佈是有非常強的相似性的,因此作者認爲直接使用低維度的這個概率,就是softmax輸出來進行對抗就能取得一個非常好的效果。

基於以上兩個insight,作者就設計直接把概率放到判別器裏面。訓練的過程實際上和GAN是一樣的,只不過不再是把特徵傳入判別器裏面,而是把最終輸出的概率傳到判別器裏面。

回到上面那張圖,可以看到,左邊的兩個DA,它們是多尺度的。回到我們一開始講到的語義分割網絡,它分爲特徵提取器和分類器,分類器的輸入實際上就是特徵提取器提取出來的特徵。

大家都知道,Resnet實際上有好幾層。作者基於這個事實提出,可以分別在最後一層以及倒數第二層,這兩部分上來做output space的對抗。也就是把這兩部分特徵送到分類器上,然後把分類器的結果拿出來,輸入判別器(Discriminator)裏面來做對抗。

總結一下,本篇論文的算法創新點是:

1、在output space 進行對抗,利用了網絡預測結果的結構信息;

2、利用對多個層次的輸出進行對抗,進一步提高了模型。

那麼我們來看看這樣的結果是如何的吧?

上圖是從GTA5到Cityspaces這個任務的實驗結果。我們可以看到,第一條數據Baseline(Resnet)在源域上訓練一個模型,然後拿到目標域上去測試。第二條數據是在特徵維度上做出來一個結果,39.3。雖然相比於source only的模型有所提升,但是和下面兩個在output space上做的對抗是相對較低的。第一個single level,是直接在Resnet最後一層提取出了特徵,然後輸入到分類器產生得到的結果;第二個multi-level是在Resnet倒數一二層都做對抗,結果可以看到,是會更好。

第二篇論文算法模型剖析

文章標題:《ADVENT: Adversarial Entropy Minimization for Domain Adaptation in Semantic Segmentation》

接下來,我們來講第二篇:基於熵減和熵對抗的遷移分割的方法。

要理解這篇文章,我們要先理解“熵”這個概念。作者在文章中用信息熵來作爲熵,就是公式中P和logP,也就是一個概率log。

語義分割,是網絡對一張圖片的每個像素點做預測。那麼對於每個像素點來說,其最終結果是c*1的一個向量,c就是代表可能存在的這個類別數,因此,應該是每個類別的概率乘以log這個類別的概率。那麼對一個像素點來說,把這個類別的熵來加起來,就代表這個像素點的熵。因此,對於一幅圖來說的話,需要對圖片的長和寬,也就是對每個像素點的熵做一個求和。

通過觀察上圖,作者發現了一個現象:在源域的分割圖中得到熵值的分佈,可以發現在這些類別的邊緣部分,熵值是非常高的(顏色越深,代表熵值越低;顏色越淺,代表熵值越高)。那麼對於目標域的那個圖片,我們可以看到,其預測出來的結果,整張圖片的顏色淺的部分是非常多的。因此,作者認爲,因爲源域上有太多沒有用的熵值(因爲存在一定噪聲),通過減少目標率的熵值可以縮減源域和目標域之間的差距。

那麼怎麼去減少目標域的熵值呢?作者提出了兩種方法,也即本文的算法創新點:

1、利用基於熵的損失函數,防止網絡對目標域做出可信度較低的預測;

2、提出了一種基於熵的對抗學習方式,同時考慮熵減和兩個領域的結構對齊。

利用對抗學習來最小化熵值,即得到一個圖片總體的熵,直接通過梯度反向傳播來優化總體的熵。但是作者認爲如果直接做熵減的話,會忽略很多信息,就比如圖片本身的語義結構信息等。因此作者借鑑第一篇講output space對抗的方式,其提出了一種利用對抗學習來做熵減的方法。

可以看到,前面圖片中源域的熵是非常低的,因此他認爲如果能夠用一個Discriminator來區分源域和目標域,從而使源域和目標域最終的輸出的熵圖非常相似的話,就可以減少目標域的熵。具體的做法就是和上一篇類似,只不過第一篇是直接把概率做到判別器裏面,而第二篇是把熵送到判別器裏面進行判別,從而完成整個過程。

本篇論文一方面考慮了熵減的過程,另一方面運用到了結構信息,因此實驗的結果可以明顯的看到在GTA5到Cityspace上,直接最小化熵相比於FCNs和使用output space做對抗已經有一定很很大的提高,再做熵對抗的更是比原本的方法要提升了一點幾個點。

此外作者還發現,如果把直接做熵減和做熵來做對抗兩者預測出來的概率相加,再求最大值,結果會再提高一點幾個點。在語義分割任務裏面,這種提高是非常可觀的。

代碼復現

下面我們進入代碼復現的過程。

復現論文的原則是與論文中描述的具體方法、參數、數據增強等保持一致。

此次復現,首先在GitHub上查找開源代碼,在開源代碼的基礎上,基於PyTorch框架將上述兩篇論文用一個相同的框架實現。如果讀懂一篇論文的代碼,那麼另一篇的代碼是非常好理解的。

下面有兩個二維碼,分別是兩篇論文的代碼,可以掃碼前往查看。

ModelArts簡介

兩篇論文都是基於華爲雲的ModelArts。我們首先簡單介紹一下ModelArts。

ModelArts是面向開發者的一站式AI開發平臺,爲機器學習與深度學習提供海量數據預處理及半自動化標註、大規模分佈式Training、自動化模型生成,及端-邊-雲模型按需部署能力,幫助用戶快速創建和部署模型,管理全週期AI工作流。具體擁有以下核心功能:

數據管理,最多可節約80%的人工數據處理成本:涵蓋圖像、聲音、文本、視頻4大類數據格式9種標註工具,同時提供智能標註、團隊標註極大提高標註效率;支持數據清洗,數據增強,數據檢驗等常見數據處理能力;數據集多版本靈活可視化管理,支持數據集導入導出,輕鬆用於ModelArts的模型開發和訓練。

開發管理,可使用本地開發環境(IDE)對接雲上服務:ModelArts除了可以在雲上通過(管理控制檯)界面開發外,同時還提供了Python SDK功能,可通過SDK在任意本地IDE中使用Python訪問ModelArts, 包括創建、訓練模型,部署服務,更加貼近自己的開發習慣。

訓練管理,更快速訓練高精度的模型:以大模型(EI-Backbone)爲核心的普適AI建模工作流的3大優勢:

1、基於小樣本數據訓練高精度模型,大量節約數據標註成本;

2、全空間網絡架構搜索和自動超參優化技術可自動快速提升模型精度;

3、加載EI-Backbone集成的預訓練模型後,模型訓練到部署的流程可從數週縮短至幾分鐘,大幅降低訓練成本。

模型管理,支持對所有迭代和調試的模型進行統一管理:AI模型的開發和調優往往需要大量的迭代和調試,數據集、訓練代碼或參數的變化都可能會影響模型的質量,如不能統一管理開發流程元數據,可能會出現無法重現最優模型的現象。ModelArts支持4個場景的導入模型:從訓練中選擇,從模板中選擇,從容器鏡像中選擇,從OBS中選擇。

部署管理,一鍵部署至端、邊、雲:ModelArts支持在線推理、批量推理、邊緣推理多種形態。同時,高併發在線推理滿足線上大業務量訴求,高吞吐批量推理能快速解決沉積數據推理訴求,高靈活性邊緣部署使推理動作可以在本地環境完成。

鏡像管理,自定義鏡像功能支持自定義運行引擎:ModelArts底層採用容器技術,您可自行製作容器鏡像並在ModelArts上運行。自定義鏡像功能支持自由文本形式的命令行參數和環境變量,靈活性比較高,便於支持任意計算引擎的作業啓動需求。

代碼解釋

接下來,我們給代碼做一個具體的解釋。

首先是第一篇:AdaptSegNet中的multi-level output space對抗,代碼如下:

如前所述,把通過softmax得到的概率送到判別器裏面,就是上圖畫紅框部分。

爲什麼會有D1和D2呢?正如之前講過的,特徵可以採用Resnet101的倒數第一層和倒數第二層形成一個multi-level的對抗過程。那在具體loss的時候,可以使用bce_loss來處理對抗。

第二篇:ADVENT中的Minimizing entropy with adversarial learning

此論文需要來計算熵。那熵是怎麼計算的呢?

首先獲得概率。通過把網絡的輸出通過softmax求得一個概率,然後使用P*logP來求出熵值,再把熵送入Discriminator。

兩篇論文都是用對抗的方法,唯一的區別是一個把softmax的輸出放進去,另一個是把softmax的輸出概率轉化成熵再送進去。代碼也就進行了這一處更改。因此大家如果能夠看懂第一篇代碼的流程的話,很容易對第二篇代碼上手了

結語

語義分割的數據集是比較大的,因此訓練的時候需要非常強大的硬件支持。一般來說,實驗室可能只有10/11/12g的GPU,而如果使用華爲雲ModelArts的話(綜合之前對ModelArts的一個功能介紹),可以獲得更好的一個輸出結果。

如果感興趣,可以點擊>>>AI開發平臺ModelArts,前往體驗。

大家如果對《Learning to adapt structured output space for semantic segmentation》和《ADVENT: Adversarial Entropy Minimization for Domain Adaptation in Semantic Segmentation》這兩篇文章感興趣,可以通過下面的二維碼獲得論文的原文全文。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章