深度學習之檢測、分類及分割(二)

十一. ResNet

在VGG中,卷積網絡達到了19層,在GoogLeNet中,網絡史無前例的達到了22層。那麼,網絡的精度會隨着網絡的層數增多而增多嗎?在深度學習中,網絡層數增多一般會伴着下面幾個問題

  1. 計算資源的消耗
  2. 模型容易過擬合
  3. 梯度消失/梯度爆炸問題的產生

殘差網絡

1.1 殘差塊

殘差網絡是由一系列殘差塊組成的(圖1)。一個殘差塊可以用表示爲:

 

殘差塊分成兩部分直接映射部分和殘差部分。 [公式] 是直接映射,反應在圖1中是左邊的曲線; [公式] 是殘差部分,一般由兩個或者三個卷積操作構成,即圖1中右側包含卷積的部分。

圖1:殘差塊

圖1中的Weight在卷積網絡中是指卷積操作,addition是指單位加操作。

在卷積網絡中, [公式] 可能和 [公式] 的Feature Map的數量不一樣,這時候就需要使用 [公式] 卷積進行升維或者降維(圖2)。這時,殘差塊表示爲:

其中 [公式] 。其中 [公式] 是 [公式] 卷積操作,但是實驗結果 [公式] 卷積對模型性能提升有限,所以一般是在升維或者降維時纔會使用。

圖2:1*1殘差塊

一般,這種版本的殘差塊叫做resnet_v1,keras代碼實現如下:

def res_block_v1(x, input_filter, output_filter):
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
    res_x = BatchNormalization()(res_x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    res_x = BatchNormalization()(res_x)
    if input_filter == output_filter:
        identity = x
    else: #需要升維或者降維
        identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
    x = keras.layers.add([identity, res_x])
    output = Activation('relu')(x)
    return output

 

十二. SSD

在SSD之前,目標檢測的主流方法主要分爲兩大類:

  • two-stage:以R-CNN系列爲代表,這類方法通常包括兩個部分,第一部分先使用selective search、卷積神經網絡等篩選出一些proposal boxes,然後第二部分再對這些proposal boxes進行分類和迴歸。這就相當於進行了兩次分類和迴歸,因此檢測的準確率較高,但是可想而知檢測的速度也就比較慢了。
  • one-stage:以YOLO爲代表,這類方法的主要思路就是在圖片的不同位置進行密集採樣,然後使用CNN網絡提取特徵並直接進行分類和迴歸,整個過程只要一步就可完成。這種方法的優勢是檢測速度快,但是檢測的準確率卻不是很高。

於是爲了讓檢測過程又快又準確,SSD就被提出來了。SSD借鑑了YOLO的one-stage的思想,直接對bbox進行迴歸和分類,同時也參考了Faster R-CNN中的anchor機制來提升準確率。通過將兩種方法的優點結合,並加以改進,SSD保持了很快的檢測速度,同時還提高了檢測的準確率。

和YOLO類似,SSD也是one-stage的檢測方法,即使用一個神經網絡直接進行分類和迴歸,但是爲了提高準確率,SSD做了以下改進:

  • Multi-scale feature map:使用多尺度的feature map來進行檢測。在base network之後加了幾層卷積,這些卷積層會逐漸減小feature map的size,然後在不同size的feature map上進行檢測,進而實現了一個多尺度的檢測。因爲不同size的feature map的感受野不同,因此可以檢測不同大小的物體,比較大的特徵圖,感受野較小,適合檢測相對較小的物體,而較小的特徵圖,感受野較大,適合檢測相對較大的物體。如下圖中, [公式] 的feature map中藍色框更適合來檢測貓,而 [公式] 的feature map中紅色的框更適合來檢測狗。

 

首先對基礎網絡VGG16進行了修改,其中Conv5_3之前的卷積層保持不變,而原來的FC6和FC7分別變成 [公式] 和 [公式] 的卷積層Conv6和Conv7,去掉了原來的dropout和FC8層。此外,還將池化層pool5由原來的 [公式] 的 [公式] 變成 [公式] 的 [公式] ,爲了配合這種變化,Conv6的卷積採用的是 [公式] 的空洞卷積(空洞卷積可參考:Jacqueline:【目標檢測】R-FCN)。在基礎網絡之上SSD又添加了新的卷積層,例如圖中的Conv8_2,Conv9_2,Conv10_2,Conv11_2。其中,Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2和Conv11_2層輸出的特徵圖用於檢測。因爲Conv4_3比較靠前,norm會比較大,因此會對Conv4_3輸出的特徵圖先進行了一個L2 normalization,減少其和後邊檢測層的差異。最終一共有6個特徵圖,大小分別爲(38,38),(19,19),(10,10),(5,5),(3,3),(1,1)。然後在不同size的特徵圖上設置不同大小和個數的default boxes(anchors),Conv4_3特徵圖上有4個anchor,Conv7有6個,Conv8_2有6個,Conv9_2有6個,Conv10_2有4個,Conv11_2有4個,所以最終anchor的數量爲:

得到檢測結果之後,再進行非極大值抑制(NMS)來刪除掉多餘的boxes,便得到最終的檢測結果。NMS的具體過程可以參考我這篇文章:Jacqueline:【目標檢測】基礎知識:IoU、NMS、Bounding box regression

十三. YOLO

YOLO將物體檢測作爲迴歸問題求解。基於一個單獨的end-to-end網絡,完成從原始圖像的輸入到物體位置和類別的輸出。從網絡設計上,YOLO與rcnn、fast rcnn及faster rcnn的區別如下:

[1] YOLO訓練和檢測均是在一個單獨網絡中進行。YOLO沒有顯示地求取region proposal的過程。而rcnn/fast rcnn 採用分離的模塊(獨立於網絡之外的selective search方法)求取候選框(可能會包含物體的矩形區域),訓練過程因此也是分成多個模塊進行。Faster rcnn使用RPN(region proposal network)卷積網絡替代rcnn/fast rcnn的selective
search模塊,將RPN集成到fast rcnn檢測網絡中,得到一個統一的檢測網絡。儘管RPN與fast rcnn共享卷積層,但是在模型訓練過程中,需要反覆訓練RPN網絡和fast rcnn網絡(注意這兩個網絡核心卷積層是參數共享的)。

YOLO將物體檢測作爲一個迴歸問題進行求解,輸入圖像經過一次inference,便能得到圖像中所有物體的位置和其所屬類別及相應的置信概率。而rcnn/fast rcnn/faster rcnn將檢測結果分爲兩部分求解:物體類別(分類問題),物體位置即bounding box(迴歸問題)。

YOLO檢測網絡包括24個卷積層和2個全連接層,如下圖所示。

 

其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。

YOLO網絡借鑑了GoogLeNet分類網絡結構。不同的是,YOLO未使用inception
module,而是使用1x1卷積層(此處1x1卷積層的存在是爲了跨通道信息整合)+3x3卷積層簡單替代。

每個格子輸出B個bounding box(包含物體的矩形區域)信息,以及C個物體屬於某種類別的概率信息。

Bounding box信息包含5個數據值,分別是x,y,w,h,和confidence。其中x,y是指當前格子預測得到的物體的bounding box的中心位置的座標。w,h是bounding box的寬度和高度。注意:實際訓練過程中,w和h的值使用圖像的寬度和高度進行歸一化到[0,1]區間內;x,y是bounding box中心位置相對於當前格子位置的偏移值,並且被歸一化到[0,1]。

confidence反映當前bounding box是否包含物體以及物體位置的準確性,計算方式如下:

因此,YOLO網絡最終的全連接層的輸出維度是 S*S*(B*5 + C)。YOLO論文中,作者訓練採用的輸入圖像分辨率是448x448,S=7,B=2;採用VOC 20類標註物體作爲訓練數據,C=20。因此輸出向量爲7*7*(20 + 2*5)=1470維。作者開源出的YOLO代碼中,全連接層輸出特徵向量各維度對應內容如下:

 

YOLO模型訓練分爲兩步:

1)預訓練。使用ImageNet
1000類數據訓練YOLO網絡的前20個卷積層+1個average池化層+1個全連接層。訓練圖像分辨率resize到224x224。

2)用步驟1)得到的前20個卷積層網絡參數來初始化YOLO模型前20個卷積層的網絡參數,然後用VOC 20類標註數據進行YOLO模型訓練。爲提高圖像精度,在訓練檢測模型時,將輸入圖像分辨率resize到448x448。

爲提高物體定位精準性和召回率,YOLO作者提出了YOLO9000,提高訓練圖像的分辨率,引入了faster rcnn中anchor box的思想,對各網絡結構及各層的設計進行了改進,輸出層使用卷積層替代YOLO的全連接層,聯合使用coco物體檢測標註數據和imagenet物體分類標註數據訓練物體檢測模型。相比YOLO,YOLO9000在識別種類、精度、速度、和定位準確性等方面都有大大提升。(yolo9000詳解有空給出)

 

YOLO 對相互靠的很近的物體,還有很小的羣體檢測效果不好,這是因爲一個網格中只預測了兩個框,並且只屬於一類。

 

同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。

 

由於損失函數的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。

YOLO 一代有很多缺點,作者希望改進的方向是改善 recall,提升定位的準確度,同時保持分類的準確度。 


目前計算機視覺的趨勢是更大更深的網絡,更好的性能表現通常依賴於訓練更大的網絡或者把多種模型綜合到一起。但是 YOLO v2 則着力於簡化網絡。具體的改進見下表:

YOLOV3改進之處:

1.多尺度預測 (類FPN)

2.更好的基礎分類網絡(類ResNet)和分類器 darknet-53,見下圖

3.分類器-類別預測:

 

YOLOv3 不使用 Softmax 對每個框進行分類,主要考慮因素有:

 

十四. FCN(https://blog.csdn.net/qq_36269513/article/details/80420363)

全卷積網絡(FCN)是從抽象的特徵中恢復出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。
FCN將傳統CNN中的全連接層轉化成一個個的卷積層。如下圖所示,在傳統的CNN結構中,前5層是卷積層,第6層和第7層分別是一個長度爲4096的一維向量,第8層是長度爲1000的一維向量,分別對應1000個類別的概率。FCN將這3層表示爲卷積層,卷積核的大小(通道數,寬,高)分別爲(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的層都是卷積層,故稱爲全卷積網絡。 

注:

虛線上半部分爲全卷積網絡。(藍:卷積,綠:max pooling)。對於不同尺寸的輸入圖像,各層數據的尺寸(height,width)相應變化,深度(channel)不變。 
這部分由深度學習分類問題中經典網絡AlexNet1修改而來。只不過,把最後兩個全連接層(fc)改成了卷積層。

論文中,達到最高精度的分類網絡是VGG16,但提供的模型基於AlexNet。此處使用AlexNet便於繪圖。
最後的輸出是21張heatmap經過upsampling變爲原圖大小的圖片,爲了對每個像素進行分類預測label成最後已經進行語義分割的圖像,這裏有一個小trick,就是最後通過逐個像素地求其在21張圖像該像素位置的最大數值描述(概率)作爲該像素的分類。因此產生了一張已經分類好的圖片,如下圖右側有狗狗和貓貓的圖。

整個FCN網絡基本原理如圖5(只是原理示意圖)

  1. image經過多個conv和+一個max pooling變爲pool1 feature,寬高變爲1/2
  2. pool1 feature再經過多個conv+一個max pooling變爲pool2 feature,寬高變爲1/4
  3. pool2 feature再經過多個conv+一個max pooling變爲pool3 feature,寬高變爲1/8
  4. ......
  5. 直到pool5 feature,寬高變爲1/32。

                                                                           圖5 FCN網絡結構示意圖

那麼:

  1. 對於FCN-32s,直接對pool5 feature進行32倍上採樣獲得32x upsampled feature,再對32x upsampled feature每個點做softmax prediction獲得32x upsampled feature prediction(即分割圖)。
  2. 對於FCN-16s,首先對pool5 feature進行2倍上採樣獲得2x upsampled feature,再把pool4 feature和2x upsampled feature逐點相加,然後對相加的feature進行16倍上採樣,並softmax prediction,獲得16x upsampled feature prediction。
  3. 對於FCN-8s,首先進行pool4+2x upsampled feature逐點相加,然後又進行pool3+2x upsampled逐點相加,即進行更多次特徵融合。具體過程與16s類似,不再贅述。

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

什麼是上採樣?

說了半天,到底什麼是上採樣?

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

  1. Resize,如雙線性插值直接縮放,類似於圖像縮放(這種方法在原文中提到)
  2. Deconvolution,也叫Transposed Convolution

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

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

圖6 Convolution forward示意圖

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

圖7 Deconvolution forward示意圖

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

圖8 Subsampling vs Upsampling

上採樣在FCN網絡中的作用如圖8,明顯可以看到經過上採樣後恢復了較大的pixelwise feature map(其中最後一個層21-dim是因爲PACSAL數據集有20個類別+Background)。這其實相當於一個Encode-Decode的過程。

 

 

在這裏我們要注意的是FCN的缺點:

  1. 是得到的結果還是不夠精細。進行8倍上採樣雖然比32倍的效果好了很多,但是上採樣的結果還是比較模糊和平滑,對圖像中的細節不敏感。

  2. 是對各個像素進行分類,沒有充分考慮像素與像素之間的關係。忽略了在通常的基於像素分類的分割方法中使用的空間規整(spatial regularization)步驟,缺乏空間一致性。

 

十五. U-NET(https://zhuanlan.zhihu.com/p/31428783)

 

語義分割網絡在特徵融合時也有2種辦法:

  1. FCN式的逐點相加,對應caffe的EltwiseLayer層,對應tensorflow的tf.add()
  2. U-Net式的channel維度拼接融合,對應caffe的ConcatLayer層,對應tensorflow的tf.concat()

記得劃重點哦。

 

十六、Segnet(https://blog.csdn.net/Freeverc/article/details/83309714)

2015年,Segnet模型由Vijay Badrinarayanan, Alex Kendall, Roberto Cipolla發表, 在FCN的語義分割任務基礎上,搭建編碼器-解碼器對稱結構,實現端到端的像素級別圖像分割。

Segnet作爲我接觸的第一個網絡,其模型框架和思路都比較簡單,應用當年很火的VGG16框架,去掉全連接層,搭建對稱模型,但是這在各種框架還沒有大肆興起的2014年,基於Caffe實現端到端的像素級別網絡模型也是很不容易的。之後在MATLAB2016中,Segnet成爲內置的用於語義分割的深度學習算法。2016年,Segnet研究組在原有網絡框架基礎加入了跳躍連接,算是有了進一步發展。不過之後興起的各種規模更大層次更深的深度網絡(以Resnet爲主要框架)已經基本把Segnet碾壓。

 Decoder解碼器

使用最大池化的索引進行上採樣

 

  • 在解碼器處,執行上採樣和卷積。最後,每個像素送到softmax分類器。

     

    在上採樣期間,如上所示,調用相應編碼器層處的最大池化索引以進行上採樣。

    最後,使用K類softmax分類器來預測每個像素的類別

參考博客:https://tech.ifeng.com/c/7kx5uizAx5u

2. DeconvNet 和U-Net的不同

DeconvNet和U-Net具有與SegNet類似的結構。

2.1. DeconvNet 與 SegNet不同之處

 

  • Similar upsampling approach called unpooling is used.使用了類似的上採樣方法,稱爲unpooling 反池化。

     

    不同,有完全連接的層,這使模型規模更大。

2.2. U-Net 與 SegNet不同之處

 

  • 用於生物醫學圖像分割。

     

    整個特徵映射不是使用池化索引,而是從編碼器傳輸到解碼器,然後使用concatenation串聯來執行卷積。

    這使模型更大,需要更多內存

https://zhuanlan.zhihu.com/p/36525939

 

 

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