1. 程式人生 > 其它 >基於遷移學習的語義分割演算法分享與程式碼復現

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

摘要:語義分割的資料集是比較大的,因此訓練的時候需要非常強大的硬體支援。

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

此篇文章是分享兩篇基於遷移學習的語義分割演算法論文。第一篇:《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》這兩篇文章感興趣,可以通過下面的二維碼獲得論文的原文全文。

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