天天看點

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

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

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

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

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

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

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

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

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

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

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

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

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

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

主要貢獻

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

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

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

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

第二篇《ADVENT: Adversarial EntropyMinimization 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 semanticsegmentation》

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

這篇論文和前面相關工作論文裡的第一篇工作一樣,是由分割網絡和判别器組成的。從上面的圖,或者就從題目上就可以看出,它是 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 DomainAdaptation in Semantic Segmentation》

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

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

要了解這篇文章,我們要先了解“熵”這個概念。作者在文章中用資訊熵來作為熵,就是公式中 P 和 logP,也就是一個機率 log。

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

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

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

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

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 adversariallearning

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

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

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

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

結語

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

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

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

繼續閱讀