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

摘要:語義分割的數據集是比較大的,所以訓練的時候須要很是強大的硬件支持。

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

此篇文章是分享兩篇基於遷移學習的語義分割算法論文。第一篇:《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》:高併發

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

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

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

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

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

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

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

相關工做

在講解兩篇論文以前,咱們先簡單介紹另外一篇文章:《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)裏面來作對抗。

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

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

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

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

上圖是從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這個類別的機率。那麼對一個像素點來講,把這個類別的熵來加起來,就表明這個像素點的熵。所以,對於一幅圖來講的話,須要對圖片的長和寬,也就是對每一個像素點的熵作一個求和。

經過觀察上圖,做者發現了一個現象:在源域的分割圖中獲得熵值的分佈,能夠發如今這些類別的邊緣部分,熵值是很是高的(顏色越深,表明熵值越低;顏色越淺,表明熵值越高)。那麼對於目標域的那個圖片,咱們能夠看到,其預測出來的結果,整張圖片的顏色淺的部分是很是多的。所以,做者認爲,由於源域上有太多沒有用的熵值(由於存在必定噪聲),經過減小目標率的熵值能夠縮減源域和目標域之間的差距。

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

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

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

利用對抗學習來最小化熵值,即獲得一個圖片整體的熵,直接經過梯度反向傳播來優化整體的熵。可是做者認爲若是直接作熵減的話,會忽略不少信息,就好比圖片自己的語義結構信息等。所以做者借鑑第一篇講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大優點:

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

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

三、加載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》這兩篇文章感興趣,能夠經過下面的二維碼得到論文的原文全文。

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

相關文章
相關標籤/搜索