演算法影像崗-影像分類與影像分割

下一份守候發表於2020-11-08

1 神經網路

各種技巧第一次使用

  1. relu Alexnet
  2. dropout Alexnet
  3. 重疊的池化 Alexnet
  4. 卷積堆疊(5 * 5 = 3 * 3) VGG
  5. 第一次使用1 * 1卷積 VGG16(中使用了1 * 1卷積,通道數不變)
  6. 加深網路結構可以提升效能 VGG
  7. 1 * 1降維 inceptionV1
  8. 模型融合 inceptionV1
  9. 輔助分類節點:inceptionV1
  10. 不在存在5 * 5以上的卷積:inceptionV2
  11. 深度可分離卷積:inceptionV2
  12. BN的使用:inceptionV2
  13. 不對稱卷積:IncentionV3 7 * 1 + 1 * 7
  14. 分支後在分支結構:IncentionV3
  15. inception+resnet:inceptionV4
  16. resnet中沒有使用dropout
  17. 通道注意力:SENet
  18. 密集連線:DenseNet
  19. 全深度分離網路:MobileNet
  20. 通道混亂:ShuttleNet
  21. 跳級結構:FCN,3 4 5分別上取樣然後融合
  22. 輸入任意:FCN
  23. 空洞卷積:deeplabv1
  24. CRF的引入:deeplabV1
  25. ASPP:deeplabv2

1.1 卷積型別/塊

參考來源:https://baijiahao.baidu.com/s?id=1625255860317955368&wfr=spider&for=pc

  1. 常規多通道卷積
  2. 深度分離卷積(’減少運算量‘)
  3. 分組卷積(VGG中使用的分通道的卷積)
  4. Inception Block(特徵融合)
  5. 膨脹卷積/空洞卷積(deeplab)
  6. 空間金字塔特徵卷積(deeplabv2)
  7. 反摺積:點對應的加到對應的點上

1.2 分類神經網路

1.1.1 Lenet

  • LeNet5 –沒啥特點-不過是第一個CNN應該要知道

1.1.2 AlexNet

relu,dropout,重疊的最大池化(步長少於卷積核),LRN

  1. 使用ReLU作為CNN的啟用函式,並驗證其效果在較深的網路超過了Sigmoid,成功解決了Sigmoid在網路較深時的梯度彌散問題。但是直到AlexNet的出現才將其發揚光大。
  2. 訓練時使用Dropout隨機忽略一部分神經元,以避免模型過擬合。Dropout雖有單獨的論文論述,但是AlexNet將其實用化,通過實踐證實了它的效果。在AlexNet中主要是最後幾個全連線層使用了Dropout。
  3. 在CNN中使用重疊的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。並且AlexNet中提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋。
  4. 提出了LRN層,對區域性神經元的活動建立競爭機制,使得其中響應比較大的值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

1.1.3 VGGNet

一個主要結論(網路越深越好)

  1. 資料層堆疊,通過2至3個 3 ∗ 3 3 * 3 33卷積層堆疊來形成 5 ∗ 5 5 * 5 55 7 ∗ 7 7 * 7 77大小的感受野,比1個 7 ∗ 7 7 * 7 77的卷積層擁有更少的引數量,只有後者的 3 ∗ 3 ∗ 3 7 ∗ 7 = 55 \frac{3 * 3 * 3}{7 * 7} = 55% 77333=55的引數量,擁有更多的非線性變化,3個卷積層可以進行3次非線性變化,而1個卷積層只能1次.
  2. 訓練和預測時的技巧,訓練時先訓練級別A的簡單網路,再複用A網路的權重來初始化後面的幾個複雜模型,這樣訓練收斂的速度更快。模型分為五級
  3. 訓練時VGGNet也使用了多尺度的方法做資料增強.
    • 固定尺寸,即縮放影像最小邊S到256或者384,然後裁剪得到輸入資料是224 * 224,進行訓練。
    • 多尺度,即縮放影像最小邊到[256,512]之間,然後裁剪訓練,該方法有效的考慮了影像中目標大小的不一致,有利於訓練。並且考慮到速度原因,本文在單尺度(S=384)的基礎上,進行微調得到多尺度模型。
  4. 得出LRN層作用不大,網路結構還是越深越好
  5. 使用1 * 1來做線性變換

1.1.4 Googlenet–inceptionV1

模型融合(3卷積一池化) ,1 * 1降維(減少運算量,新訓練了一層,新增了非線性變換,增加泛化能力),輔助分類器
原網路模型中224 * 224的輸入
inceptionV1

- 創新點

  1. 將1x1,3x3,5x5的conv和3x3的pooling,堆疊在一起,一方面增加了網路的width,另一方面增加了網路對尺度的適應性。
  2. 在Inception v1中 1 ∗ 1 1 * 1 11卷積用於降維,減少模型引數量和feature map維度, 1 ∗ 1 1*1 11卷積特有的功能,由於 1 ∗ 1 1 * 1 11卷積只有一個引數,相當於對原始feature map做了一個scale,並且這個scale還是訓練學出來的,無疑會對識別精度有提升
  3. 增加了網路的深度
  4. 增加了網路的寬度
  5. 在Google Inception V1中,採用了輔助分類節點,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分類結果中,這樣相當於做了模型的融合,同時給網路增加了反向傳播的梯度訊號,提供了額外的正則化的思想.

1.1.5 InceptionV2

BN,深度可分離卷積的第一次使用

  1. 5x5 卷積層被替換為兩個連續的 3x3 卷積層. 網路的最大深度增加 9 個權重層. 引數量增加了大約 25%,計算量增加了大約 30%,不在擁有 5 * 5大卷積核,多使用了一個啟用函式,增加了非線效能力。
  2. 28x28(35 * 35) 的 Inception 模組的數量由 2 增加到了 3,整體模組數目由2-5-2——>3-5-2
  3. 加入了BN層,減少了Internal Covariate Shift(內部協變數轉變), 上一層網路的輸出資料經過這一層網路計算後,資料的分佈會發生變化,為下一層網路的學習帶來困難(神經網路本來就是要學習資料的分佈,要是分佈一直在變,學習就很難了)
  4. 在模組內部,有時使用平均池,有時使用最大池。這在對應於表的池化層的條目中顯示
  5. inceptionV2的第一層使用了深度可分離卷積

1.1.6 IncentionV3

輸入大小變為 299 * 299

  1. 空間卷積分解為不對稱卷積 7 ∗ 7 7 * 7 77 ----- 1 ∗ 7 1 * 7 17 7 ∗ 1 7 * 1 71
  2. inceptionV3的inception模組共有三種,網路先下降八倍, 35 ∗ 35 35 * 35 3535中採用Inceptionv2中模組, 17 ∗ 17 17 * 17 1717中採用不對稱卷積模組(四個組合)
    在這裡插入圖片描述
    在這裡插入圖片描述
  3. 8 ∗ 8 8 * 8 88 中分支之後分支
  4. 網路深度進一步增加,增加了網路的非線性

1.1.7 InceptionV4

  1. 將最先進的Inception和Residual結構結合起來同時也提出了我們不含殘差結構的inception v4,以求達到效能上的進一步提升
  2. 整個結構所使用模組和V3基本一致,不同的是Stem和Reduction-B
    • stem 299 - 35大小
      在這裡插入圖片描述
      模組結構
      在這裡插入圖片描述

1.1.8 ResNet

參考來源 https://blog.csdn.net/liuxiao214/article/details/79588844

  1. 引入了跳躍連線,這可以使上一個殘差塊的資訊流入到下一個殘差塊,提高了資訊流通,並且也避免了由與網路過深所引起的梯度消失問題(解決了連乘的影響)和退化問題
  2. 沒有使用dropout,利用BN和全域性平均池化進行正則化,加快訓練速度。
  3. 層數較高時減少了3x3卷積核的個數,用1x1卷積核控制3x3卷積的輸入輸出特徵map的數量
    • 兩個 3 ∗ 3 3 * 3 33—> 1 ∗ 1 1 * 1 11 + 3 ∗ 3 3 * 3 33 + 1 ∗ 1 1 * 1 11(resnet50及以上)
  4. 如果殘差對映(F(x))的結果的維度與跳躍連線(x)的維度不同,那是沒有辦法對它們進行相加操作的,必須對x進行升維操作,維度相同時才能計算。
    升維的方法有兩種:
    • 全0填充;
    • 採用1 * 1卷積

1.1.9 SENet

關注channel之間的關係,希望模型可以自動學習到不同channel特徵的重要程度
Squeeze-and-Excitation (擠壓和激勵)模組
在這裡插入圖片描述

  1. 全域性平均池化完成擠壓 C ∗ H ∗ W C * H * W CHW ~~~~ C ∗ 1 ∗ 1 C * 1 * 1 C11
    • 之後sigmoid函式對值處理,然後乘到原來的特徵圖中
  2. 可以有效的運用到resnet 和 inception中

1.1.10 DenseNet

它建立的是前面所有層與後面層的密集連線(dense connection)

  1. 每個層都會接受其前面所有層作為其額外的輸入,每個塊之間的輸入共通
    主體結構為Denseblock + transition
    • 在DenseBlock(每個塊)中,各個層的特徵圖大小一致,可以在channel維度上連線
    • 對於Transition層,它主要是連線兩個相鄰的DenseBlock,並且降低特徵圖大小。Transition層包括一個1x1的卷積和2x2的AvgPooling(步長2),結構為BN+ReLU+1x1 Conv+2x2 AvgPooling。
  2. 減輕了梯度消失,建立從早期層到後期層的短路徑
  3. 加強了feature的傳遞
  4. 一定程度上較少了引數數量,網路更窄,在dense block中每個卷積層的輸出feature map的數量都很小,而不是像其他網路一樣動不動就幾百上千的厚度,每一層都直接得到了損失函式和原始輸入訊號的梯度,這樣更深網路不是問題,即只學習非常少的特徵圖(最極端情況就是每一層只學習一個特徵圖),DenseNet 的每一層只需學習很少的特徵,使得引數量和計算量顯著減少
  5. DenseNet泛化效能更強。神經網路每一層提取的特徵都相當於對輸入資料的一個非線性變換,而隨著深度的增加,變換的複雜度也逐漸增加(更多非線性函式的複合)

1.2 輕量化網路

1.2.0 MobileNet

MobileNets不是模型壓縮技術!! 只是一種網路設計思想,利用這種方法設計出來的網路存在1)引數少 2) 運算速度快。

  1. 採用深度可分離卷積
    • 逐通道卷積----Depthwise Convolution的一個卷積核負責一個通道,一個通道只被一個卷積核卷積(常規卷積中是一個卷積核卷積所有通道)
    • 逐點卷積----(1 * 1 卷積)Pointwise Convolution的運算與常規卷積運算非常相似,它的卷積核的尺寸為 1×1×M,M為上一層的通道數。所以這裡的卷積運算會將上一步(逐通道卷積)的map在深度方向上進行加權組合,生成新的Feature map。有幾個卷積核就有幾個輸出Feature map
  2. MobileNetV1 中引入的兩個超引數
    • Width Multiplier( α \alpha α): 更薄的模型,所有層的 通道數(channel)乘以 α \alpha α 引數(四捨五入),模型大小近似下降到原來的 α 2 \alpha^2 α2倍,計算量下降到原來的 α 2 \alpha^2 α2
    • Resolution Multiplier( ρ \rho ρ): 解析度下降,輸入層的 解析度(resolution) 乘以 ρ \rho ρ引數 (四捨五入),等價於所有層的解析度乘 ρ \rho ρ,模型大小不變,計算量下降到原來的 ρ 2 \rho^2 ρ2.

1.2.1 ShuttleNet

  1. Channel Shuffle for Group Convolutions
    • 分組卷積的改進版本
      在這裡插入圖片描述

1.3 分割神經網路

主流分割網路
https://blog.csdn.net/helloworld_fly/article/details/80306117
總體來說,分割的邏輯如下:

  • 必須經歷從大到小,再從小到大的兩個過程
  • 在升取樣過程中,分階段增大比一步到位效果更好
  • 在升取樣的每個階段,使用降取樣對應層的特徵進行輔助

1.3.1 FCN------所有的層都是卷積層,故稱為全卷積網路

用於語義分割的全卷積網路

  1. FCN與CNN的區別在於FCN把CNN最後的全連線層換成卷積層,輸出一張已經label好的圖
  2. 增大資料尺寸的反摺積(deconv)層。能夠輸出精細的結果。
  3. 結合不同深度層結果的跳級(skip)結構。同時確保魯棒性和精確性
    • 跳級(strip)結構:對第5層的輸出執行32倍的反摺積得到原圖,得到的結果不是很精確,論文中同時執行了第4層和第3層輸出的反摺積操作(分別需要16倍和8倍的上取樣),再把這3個反摺積的結果影像融合,提升了結果的精確度:
  4. 是可以接受任意大小的輸入影像,而不用要求所有的訓練影像和測試影像具有同樣的尺寸。
  5. 使用了反摺積.

1.3.2 UNet

  1. 特徵提取部分,每經過一個池化層就一個尺度,包括原圖尺度一共有5個尺度。
  2. 上取樣部分,每上取樣一次,就和特徵提取部分對應的通道數相同尺度融合,但是融合之前要將其crop。這裡的融合也是拼接。
    個人認為改進FCN之處有:
    • 多尺度;
    • 適合超大影像分割,適合醫學影像分割,醫學影像結構比較單一(所以理論上不需要太多的引數)。比如說細胞,腫瘤這些,都是比較固定的結構,所以很好區分;
  3. concat有助於還原降取樣所帶來的資訊損失。

CRF

https://blog.csdn.net/qq_43258953/article/details/103190412

全連線條件隨機場使用二元勢函式解釋了一個畫素與另一個畫素之間的關係,給畫素關係緊密的兩個畫素賦予相同的類別標籤,而關係相差很大的兩個畫素會賦予不同的類別標籤,這個“關係”的判斷與畫素的顏色值、畫素間的相對距離都有關係。一元勢能為概率分佈圖,即由模型輸出的特徵圖經過softmax函式運算得到的結果;二元勢能中的位置資訊和顏色資訊由原始影像提供。當能量E(x)越小時,預測的類別標籤X就越準確,我們通過迭代最小化能量函式,得到最終的後處理結果。

1.3.3 DeepLabv1

參考來源https://www.jianshu.com/p/295dcc4008b4
CRF參考來源https://blog.csdn.net/cicibabe/article/details/71173965
Semantic image segmentation with deep convolutional nets and fully connected CRFs

  1. 空洞卷積-----膨脹卷積,用於稠密特徵提取和視野增大
  2. 加入了CRF,CNN是一個逐步提取特徵的部分,原始位置資訊會隨著網路深度的增加而減少或消失。CRF在傳統影像處理上的應用是做一個平滑。CRF簡單說,是在決定一個位置的畫素值時(paper裡是label),會考慮周圍畫素點的值(label),有利於將相同標記分配給空間上接近的畫素。定性的說,這些短程條件隨機場主函式會清除構建在區域性手動特徵上層弱分類器的錯誤預測。但是通過CNN得到的概率圖在一定程度上已經足夠平滑,所以短程的CRF沒有太大的意義。於是考慮使用Fully connected CRF,綜合考慮全域性資訊,恢復詳細的區域性結構,如精確圖形的輪廓。CRF幾乎可以用於所有的分割任務中影像精度的提高。
    CRF是後處理,是不參與訓練的,在測試時對特徵提取後得到的得分圖進行雙線性插值,恢復到原圖尺寸,然後再進行CRF處理,因為縮小8倍的,所以直接放大到原圖是可以接受的。如果是32倍,則需要上取樣(反摺積)
  3. 結構為VGG + 微調

問題
全連線條件隨機場-----將每一個畫素點,對其他所有畫素點都構成一個邊緣,達到稠密的全連線模型,此時面臨的一個問題就是影像畫素數目非常大,會有上萬個點和數十億的邊,其計算複雜度導致模型幾乎無法實施。

1.3.4 DeepLabv2

參考來源 https://blog.csdn.net/XZZPPP/article/details/51377731

相關SPP簡介:空間金字塔池化,在一般的CNN結構中,在卷積層後面通常連線著全連線。而全連線層的特徵數是固定的,所以在網路輸入的時候,會固定輸入的大小(fixed-size)。但在現實中,我們的輸入的影像尺寸總是不能滿足輸入時要求的大小。然而通常的手法就是裁剪(crop)和拉伸(warp)。不管輸入尺寸是怎樣,SPP 可以產生相同大小長度的表示特徵的輸出,多尺度特徵提取出固定大小的特徵向量,影像特徵提取為向量特徵,使用多個視窗,當我們輸入一張圖片的時候,我們利用不同大小的刻度,對一張圖片進行了劃分。上面示意圖中,利用了三種不同大小的刻度( 4 ∗ 4 4 * 4 44 2 ∗ 2 2 * 2 22 1 ∗ 1 1 * 1 11),對一張輸入的圖片進行了劃分,最後總共可以得到16+4+1=21個塊,我們即將從這21個塊中,每個塊提取出一個特徵,這樣剛好就是我們要提取的21維特徵向量。第一張圖片, 我們把一張完整的圖片,分成了16個塊,也就是每個塊的大小就是(w/4,h/4); 第二張圖片,劃分了4個塊,每個塊的大小就是(w/2,h/2);第三張圖片,把一整張圖片作為了一個塊,也就是塊的大小為(w,h)。空間金字塔最大池化的過程,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出神經元 ( 21 ∗ 1 21 * 1 211)。最後把一張任意大小的圖片轉換成了一個固定大小的21維特徵(當然你可以設計其它維數的輸出,增加金字塔的層數,或者改變劃分網格的大小)。上面的三種不同刻度的劃分,每一種刻度我們稱之為:金字塔的一層,每一個圖片塊大小我們稱之為:視窗大小了。如果你希望,金字塔的某一層輸出n * n個特徵,那麼你就要用windows size大小為:(w/n,h/n)進行池化了。
- SPP 可以使用同一影像不同尺寸(scale)作為輸入, 得到同樣長度的池化特徵。

DeeplabV2的特點
在這裡插入圖片描述

  1. 實際使用的是帶孔空間金字塔池化 ,並行的採用多個取樣率的空洞卷積提取特徵,再將特徵融合,類似於空間金字塔結構
  2. 空洞卷積
  3. DeepLabV2使用ResNet和VGGNet進行實驗
  4. CRF來進行精細化處理

1.3.5 DeeplabV3在這裡插入圖片描述

在這裡插入圖片描述

  • 設計了序列和並行的帶孔卷積模組
  1. ASPP的改進:在最後多了個1 ∗ 1卷積和全域性平均池化,concat後1 * 1卷積到輸出
  2. 網路變得更深,對原來的resnet進行改進,又堆疊了三個block在block4後面,分別為block5,6,7,同時調整取樣率,原始的有五次下采樣,修改後只進行四次下采樣,block4後就不會進行下采樣了。
  3. 1是序列的空洞卷積,2是並行的空洞卷積,1和2兩種方法的結構合併並不會帶來提升,相比較來說,ASPP的縱式結構要好一點。所以deeplab v3一般也是指aspp的結構,也就是2這種結構

1.3.6 deeplabv3+

在這裡插入圖片描述

原DeepLabv3當作encoder,新增decoder得到新的模型(DeepLabv3+)

  1. 金字塔池化(SPP)能編碼多尺度上下文資訊,編碼解碼結構能夠通過逐漸恢復空間資訊來捕獲清晰的邊緣細節資訊。作者提出一種模型,能夠結合這兩種結構的優勢。作者提出的DeepLabV3+模型,通過在DeepLabV3基礎上擴充套件一個解碼模組來優化目標邊緣細節資訊。即原DeepLabv3當作encoder,新增decoder得到新的模型(DeepLabv3+)。
  2. 引入深度可分離網路,因為它能夠保持效能的同時大大減少計算量,所有的max pooling結構被stride = 2的深度可分離卷積代替。
  3. Encoder就是原來的DeepLabv3,注意點有2點:
    • 輸入尺寸與輸出尺寸比,最後一個stage的膨脹率rate為2
    • ASPP有四個不同的rate,額外一個全域性平均池化
  4. Decoder
    • 明顯看到先把encoder的結果上取樣4倍,然後與resnet中下采樣前的Conv2特徵concat一起,再進行3x3的卷積,最後上取樣4倍得到最終結果
    • 需要注意點:融合低層次資訊前,先進行1x1的卷積,目的是降通道(例如有512個通道,而encoder結果只有256個通道)
  5. 每個3x3的depthwise convolution都跟BN和Relu

如有錯誤歡迎聯絡,文中內容均在參考原文以及他人分享後所作

相關文章