<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          圖像語義分割入門:FCN/U-Net網(wǎng)絡(luò)解析

          共 5401字,需瀏覽 11分鐘

           ·

          2022-02-26 05:56

          點擊下方卡片,關(guān)注“新機器視覺”公眾號

          重磅干貨,第一時間送達

          圖像語義分割(Semantic Segmentation)是圖像處理和是機器視覺技術(shù)中關(guān)于圖像理解的重要一環(huán),也是 AI 領(lǐng)域中一個重要的分支。語義分割即是對圖像中每一個像素點進行分類,確定每個點的類別(如屬于背景、人或車等),從而進行區(qū)域劃分。目前,語義分割已經(jīng)被廣泛應用于自動駕駛、無人機落點判定等場景中。


          圖1 自動駕駛中的圖像語義分割

          而截止目前,CNN已經(jīng)在圖像分類分方面取得了巨大的成就,涌現(xiàn)出如VGG和Resnet等網(wǎng)絡(luò)結(jié)構(gòu),并在ImageNet中取得了好成績。CNN的強大之處在于它的多層結(jié)構(gòu)能自動學習特征,并且可以學習到多個層次的特征:

          1. 1.較淺的卷積層感知域較小,學習到一些局部區(qū)域的特征;

          2. 2.較深的卷積層具有較大的感知域,能夠?qū)W習到更加抽象一些的特征。

          這些抽象特征對物體的大小、位置和方向等敏感性更低,從而有助于分類性能的提高。這些抽象的特征對分類很有幫助,可以很好地判斷出一幅圖像中包含什么類別的物體。圖像分類是圖像級別的!


          圖2 圖像分類

          與分類不同的是,語義分割需要判斷圖像每個像素點的類別,進行精確分割。圖像語義分割是像素級別的!但是由于CNN在進行convolution和pooling過程中丟失了圖像細節(jié),即feature map size逐漸變小,所以不能很好地指出物體的具體輪廓、指出每個像素具體屬于哪個物體,無法做到精確的分割。

          針對這個問題,Jonathan Long等人提出了Fully Convolutional Networks(FCN)用于圖像語義分割。自從提出后,F(xiàn)CN已經(jīng)成為語義分割的基本框架,后續(xù)算法其實都是在這個框架中改進而來。

          FCN論文地址:FCN paper

          https://arxiv.org/abs/1411.4038

          FCN原作代碼:FCN github

          https://github.com/shelhamer/fcn.berkeleyvision.org

          1 FCN改變了什么?

          對于一般的分類CNN網(wǎng)絡(luò),如VGG和Resnet,都會在網(wǎng)絡(luò)的最后加入一些全連接層,經(jīng)過softmax后就可以獲得類別概率信息。但是這個概率信息是1維的,即只能標識整個圖片的類別,不能標識每個像素點的類別,所以這種全連接方法不適用于圖像分割。

          圖3 全連接層

          而FCN提出可以把后面幾個全連接都換成卷積,這樣就可以獲得一張2維的feature map,后接softmax獲得每個像素點的分類信息,從而解決了分割問題,如圖4。

          圖4


          2 FCN結(jié)構(gòu)

          整個FCN網(wǎng)絡(luò)基本原理如圖5(只是原理示意圖)

          1. 1.image經(jīng)過多個conv和+一個max pooling變?yōu)閜ool1 feature,寬高變?yōu)?/2

          2. 2.pool1 feature再經(jīng)過多個conv+一個max pooling變?yōu)閜ool2 feature,寬高變?yōu)?/4

          3. 3.pool2 feature再經(jīng)過多個conv+一個max pooling變?yōu)閜ool3 feature,寬高變?yōu)?/8

          4. 4.?......

          5. 5.直到pool5 feature,寬高變?yōu)?/32。

          圖5 FCN網(wǎng)絡(luò)結(jié)構(gòu)示意圖

          那么:

          1. 1. 對于FCN-32s,直接對pool5 feature進行32倍上采樣獲得32x upsampled feature,再對32x upsampled feature每個點做softmax prediction獲得32x upsampled feature prediction(即分割圖)。

          2. 2. 對于FCN-16s,首先對pool5 feature進行2倍上采樣獲得2x upsampled feature,再把pool4 feature和2x upsampled feature逐點相加,然后對相加的feature進行16倍上采樣,并softmax prediction,獲得16x upsampled feature prediction。

          3. 3. 對于FCN-8s,首先進行pool4+2x upsampled feature逐點相加,然后又進行pool3+2x upsampled逐點相加,即進行更多次特征融合。具體過程與16s類似,不再贅述。

          作者在原文種給出3種網(wǎng)絡(luò)結(jié)果對比,明顯可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多層feature融合有利于提高分割準確性

          圖6

          3 什么是上采樣?

          說了半天,到底什么是上采樣?

          實際上,上采樣(upsampling)一般包括2種方式:

          1. 1. Resize,如雙線性插值直接縮放,類似于圖像縮放(這種方法在原文中提到)

          2. 2. Deconvolution,也叫Transposed Convolution

          什么是Resize就不多說了,這里解釋一下Deconvolution。

          對于一般卷積,輸入藍色4x4矩陣,卷積核大小3x3。當設(shè)置卷積參數(shù)pad=0,stride=1時,卷積輸出綠色2x2矩陣,如圖6。


          圖6 Convolution forward示意圖


          而對于反卷積,相當于把普通卷積反過來,輸入藍色2x2矩陣,卷積核大小還是3x3。當設(shè)置反卷積參數(shù)pad=0,stride=1時輸出綠色4x4矩陣,如圖7,這相當于完全將圖4倒過來(其他更多卷積示意圖點這里)。

          https://github.com/vdumoulin/conv_arithmetic

          圖7 Deconvolution forward示意圖


          傳統(tǒng)的網(wǎng)絡(luò)是subsampling的,對應的輸出尺寸會降低;upsampling的意義在于將小尺寸的高維度feature map恢復回去,以便做pixelwise prediction,獲得每個點的分類信息。


          圖8 Subsampling vs Upsampling

          上采樣在FCN網(wǎng)絡(luò)中的作用如圖8,明顯可以看到經(jīng)過上采樣后恢復了較大的pixelwise feature map(其中最后一個層21-dim是因為PACSAL數(shù)據(jù)集有20個類別+Background)。這其實相當于一個Encode-Decode的過程。

          具體的FCN網(wǎng)絡(luò)結(jié)構(gòu),可以在fcn caffe prototext (https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/pascalcontext-fcn8s/train.prototxt )中查到,建議使用Netscope查看網(wǎng)絡(luò)結(jié)構(gòu)。這里解釋里面的難點:

          • 為了解決圖像過小后 1/32 下采樣后輸出feature map太小情況,F(xiàn)CN原作者在第一個卷積層conv1_1加入pad=100。

          layer {
          name: "conv1_1"
          type: "Convolution"
          bottom: "data"
          top: "conv1_1"
          param {
          lr_mult: 1
          decay_mult: 1
          }
          param {
          lr_mult: 2
          decay_mult: 0
          }
          convolution_param {
          num_output: 64
          pad: 100 # pad=100
          kernel_size: 3
          stride: 1
          }
          }

          考慮如果不在conv1_1加入pad=100,會發(fā)生什么?

          假設(shè)輸入圖像高度為h。由于VGG中縮小輸出feature map只在pooling層,經(jīng)過每個pooling后輸出高度變?yōu)椋?/p>

          很明顯,feature map的尺寸縮小了32倍,接下來是fc6卷積層:

          layer {
          name: "fc6"
          type: "Convolution"
          bottom: "pool5"
          top: "fc6"
          param {
          lr_mult: 1
          decay_mult: 1
          }
          param {
          lr_mult: 2
          decay_mult: 0
          }
          convolution_param {
          num_output: 4096
          pad: 0
          kernel_size: 7
          stride: 1
          }
          }

          如果不在conv1_1加入pad=100,那么對于小于192x192的輸入圖像,在反卷積恢復尺寸前已經(jīng)feature map size = 0!所以在conv1_1添加pad=100的方法,解決輸入圖像大小的問題(但是實際也引入很大的噪聲)。

          • 由于FCN在conv1_1加入pad=100,同時fc6卷積層也會改變feature map尺寸,那么真實的網(wǎng)絡(luò)就不可能像原理圖3那樣“完美1/2”。

          那么在特征融合的時候,如何保證逐點相加的feature map是一樣大的呢?這就要引入crop層了。以fcn-8s score_pool4c為例:

          layer {
          name: "score_pool4c"
          type: "Crop"
          bottom: "score_pool4" # 需要裁切的blob
          bottom: "upscore2" # 用于指示裁切尺寸的blob,和輸出blob一樣大
          top: "score_pool4c" # 輸出blob
          crop_param {
          axis: 2
          offset: 5
          }
          }

          在caffe中,存儲數(shù)據(jù)的方式為?blob = [num, channel, height, width],與pytorch一樣

          1. 1. 而score_pool4c設(shè)置了axis=2,相當于從第2維(index start from 0!)往后開始裁剪,即裁剪height和width兩個維度,同時不改變num和channel緯度

          2. 2. 同時設(shè)置crop在height和width緯度的開始點為offset=5

          不妨定義:

          crop_w = upscore2 blob width
          crop_h = upscore2 blob height

          用Python語法表示,相當于score_pool4c層的輸出為:

          score_pool4c = score_pool4[:, :, 5:5+crop_h, 5:5+crop_w]

          剛好相當于從score_pool4中切出upscore2大小!這樣就可以進行逐點相加的特征融合了。

          4 U-Net

          U-Net原作者官網(wǎng)

          https://link.zhihu.com/?target=https%3A//lmb.informatik.uni-freiburg.de/Publications/2015/RFB15a/

          U-Net是原作者參加ISBI Challenge提出的一種分割網(wǎng)絡(luò),能夠適應很小的訓練集(大約30張圖)。U-Net與FCN都是很小的分割網(wǎng)絡(luò),既沒有使用空洞卷積,也沒有后接CRF,結(jié)構(gòu)簡單。

          圖9 U-Net網(wǎng)絡(luò)結(jié)構(gòu)圖


          整個U-Net網(wǎng)絡(luò)結(jié)構(gòu)如圖9,類似于一個大大的U字母:首先進行Conv+Pooling下采樣;然后Deconv反卷積進行上采樣,crop之前的低層feature map,進行融合;然后再次上采樣。重復這個過程,直到獲得輸出388x388x2的feature map,最后經(jīng)過softmax獲得output segment map。總體來說與FCN思路非常類似。

          為何要提起U-Net?是因為U-Net采用了與FCN完全不同的特征融合方式:拼接!


          圖10 U-Net concat特征融合方式

          與FCN逐點相加不同,U-Net采用將特征在channel維度拼接在一起,形成更“厚”的特征。所以:

          語義分割網(wǎng)絡(luò)在特征融合時也有2種辦法:

          1. FCN式的逐點相加,對應caffe的EltwiseLayer層,對應tensorflow的tf.add()

          2. U-Net式的channel維度拼接融合,對應caffe的ConcatLayer層,對應tensorflow的tf.concat()

          記得劃重點哦。


          相比其他大型網(wǎng)絡(luò),F(xiàn)CN/U-Net還是蠻簡單的,就不多廢話了。

          總結(jié)一下,CNN圖像語義分割也就基本上是這個套路:

          1. 下采樣+上采樣:Convlution + Deconvlution/Resize

          2. 多尺度特征融合:特征逐點相加/特征channel維度拼接

          3. 獲得像素級別的segement map:對每一個像素點進行判斷類別

          看,即使是更復雜的DeepLab v3+依然也是這個基本套路(至于DeepLab以后再說)。

          圖13 DeepLab v3+


          所以作為一篇入門文章,讀完后如果可以理解這3個方面,也就可以了;當然CNN圖像語義分割也算入門了。


          參考鏈接?https://zhuanlan.zhihu.com/p/22976342


          來源:機器學習AI算法工程


          本文僅做學術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

          —THE END—
          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99香蕉精品99久久久久久 | 色天天综合网 | 日韩视频――中文字幕 | 大香蕉在线观看免费全集高清 | 成人吧欧美色图 |