日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习简明教程系列 —— 经典模型(合集)

發布時間:2023/12/9 pytorch 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习简明教程系列 —— 经典模型(合集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本教程是深度學習簡明教程系列的第二部分,旨在提取最精煉且必備的深度學習知識點,供讀者快速學習及本人查閱復習所用,大多內容是本人結合個人理解補充細節整合而成,參考鏈接放在文章最后。

目錄

第一章??AlexNet

1.1? 結構與參數

1.2? 網絡細節

第二章? VGGNet

2.1? VGG簡介

2.2? 網絡結構與參數

2.3? 網絡細節

2.4? 總結

第三章? GoogleNet

3.1? Naive Inception

3.2? GoogleNet Inception V1

3.3??GoogleNet Inception V2

3.4??GoogleNet Inception V3

3.5??GoogleNet Inception V4

3.6? Xception

第四章? ResNet

4.1??意義

4.2? 網絡結構

4.3??ResNet50和ResNet101

4.4??基于ResNet101的Faster RCNN

第五章??DenseNet

5.1? 意義

5.2? 網絡結構

第六章? DetNet

6.1? 背景

6.2? 網絡結構

第七章? 目標檢測系列

7.1??目標檢測常見算法

7.2? R-CNN

7.3??Fast R-CNN

7.4??Faster R-CNN

7.5? YOLO v1

7.6? YOLO v2

7.7? YOLO v3

7.8? YOLO v4

7.9? YOLO v5

7.10??SSD

第八章? 語義分割系列

8.1??語義分割背景

8.2??語義分割常見方法

8.3??Patch classification

8.4??全卷積網絡

8.5??Encoder-Decoder架構

8.6??基于金字塔網絡的模型

8.7??DeepLab家族

8.8??注意力機制模型


第一章??AlexNet

1.1? 結構與參數

AlexNet的網絡結構如下圖所示:

RAlexNet網絡結構圖

網絡參數如下:

  • 卷積層:5層
  • 全連接層:3層
  • 深度:8層
  • 參數個數:60M
  • 神經元個數:650k
  • 分類數目:1000類

1.2? 網絡細節

1.2.1? 分組卷積

由于當時的顯卡容量問題,AlexNet 的60M個參數無法全部放在一張顯卡上操作,所以采用了兩張顯卡分開操作的形式,其中在C3,R1,R2,R3層上出現交互,所謂的交互就是通道的合并,是一種串接操作。

1.2.2? 全連接層

全連接層負責邏輯推斷,所有的參數都需要學習得到。AlexNet中第一層全連接層用于鏈接卷積層的輸出,并去除空間信息(通道數),是一種將三維矩陣變成向量的過程(一種全卷積操作),其操作如下:

輸入特征圖是W×H×C,那么卷積核的尺寸為W×H×C,這樣的話整個輸入特征圖就變成了一個數,一共有k個數(第一層全連接層的神經元個數),就有K個W×H×C的卷積核,所以全連接層(尤其是第一層)的參數量是非常可怕的。

1.2.3? Softmax層

Softmax層不屬于CNN中單獨的層,一般要用CNN做分類的話,要將神經元的輸出變成概率的形式,Softmax就是做這個的:

通過Softmax輸出的就是概率,最后我們按照這個概率的大小確定到底屬于哪一類(AlexNet最后的分類數目為1000)。

1.2.4??AlexNet中的參數量

在R1中卷積核尺寸是6×6×256而不是13×13×256,是因為在C1,C2,C5的卷積操作后,圖像做了最大池化。可以看到,全連接層(尤其是第一層)參數數量占了絕大部分。

?

第二章? VGGNet

2.1? VGG簡介

VGG 是 Visual Geometry Group 的縮寫,它相對于 AlexNet 的改進手段在于兩方面:

  • 在第一層卷積層上采用更小的的卷積核,和更小的 stride;

  • 在 AlexNet 的基礎上加深它的卷積層數量。

  • 2.2? 網絡結構與參數

    AlexNet 有 5 層卷積層,而 VGG 就是針對這 5 層卷積層進行改造,共進行了 6 種配置,得到了 6 種網絡結構,下面是配置圖。

    VGG的6種網絡結構

    ?

    VGG網絡結構圖

    ?

    VGG參數量

    2.3? 網絡細節

    2.3.1??3x3 卷積核

    VGG 和 AlexNet 最大的不同就是 VGG 用大量的 3x3 卷積核替換了 AlexNet 的卷積核,3x3 卷積核是能夠感受到上下、左右、重點的最小的感受野尺寸,?使用3x3 卷積核的好處在于:相同感受野下,參數更少,層數加深。對于C個通道的卷積核,7x7含有參數7x7xCxN, 3個3x3的參數個數為3x(3x3xCxN),參數大大減少。

    2.3.2??1x1 卷積核

    引入1x1卷積核的緣由:有的時候,我們想在不增加感受野的情況下,讓網絡加深,為的就是引入更多的非線性;

    1x1卷積核的用處:不改變感受野的情況下,對特征圖進行升維和降維,同時也加深了網絡的深度(參數比3x3少)。

    例如:如果輸入圖片通道是 3,卷積核的數量是 6 ,那么生成的 feature map 通道就是 6,這就是升維,如果卷積核的數量是 1,那么生成的 feature map 只有 1 個通道,這就是降維度。

    2.3.3? 其他細節

  • 所有的 VGG 網絡中,卷積核的 stride 是 1,padding 是 1

  • max-pooling 的滑動窗口大小是 2x2 ,stride 也是 2

  • 2.4? 總結

    VGG論文給出了一個非常振奮人心的結論:卷積神經網絡的深度增加和小卷積核的使用對網絡的最終分類識別效果有很大的作用。

    ?

    第三章? GoogleNet

    獲得高質量模型最保險的做法就是增加模型的深度(層數)或者是其寬度(層核大小或者神經元數),但是這種設計思路的容易出現如下的缺陷:

  • 參數太多,若訓練數據集有限,容易過擬合;
  • 網絡越大計算復雜度越大,難以應用;
  • 網絡越深,梯度越往后傳越容易消失,難以優化模型。
  • 解決上述缺點的根本方法是將全連接甚至一般的卷積都轉化為稀疏連接(參數最好大部分為0,但是,計算機軟硬件對非均勻稀疏數據的計算效率很差,現在的問題是有沒有一種方法,既能保持網絡結構的稀疏性,又能利用密集矩陣的高計算性能。

    3.1? Naive Inception

    Inception架構的主要思想是找出如何用密集成分來近似最優的局部稀疏解。

    Naive Inception 模塊的作用:

  • Naive Inception 模塊一層內采用了不同大小的卷積核,并將輸出拼接起來融合了不同尺度的特征;
  • 使用這種結構可以讓網絡自行學習是否需要該層卷積或池化操作,以及使用什么類型的卷積核(部分卷積、池化模塊參數為0,于是具有了稀疏性)。
  • 3.2? GoogleNet Inception V1

    Naive Inception模塊中使用到了5x5的卷積核,計算量極大,為了降低參數量,Inception V1中使用了1x1的卷積核來進行降維,在3x3和5x5的過濾器前面,max pooling后面分別加上了1x1的卷積核,最后將它們全部Concatnate起來,卷積的參數數量比原來減少了4倍,得到的Inception V1模塊如下圖所示:

    GoogleNet Inception V1主要是圍繞如下兩個思路設計的:

  • 深度文章采用了22層,為了避免梯度消失問題,GoogleNet巧妙的在不同深度處增加了兩個loss來減弱梯度回傳消失的現象;
  • 寬度增加了多種核 1x1,3x3,5x5,還有直接max pooling的獲得特征圖,為減少參數采用了Inception V1 模塊,最終GoogleNet采用了9個Inception模塊化結構。
  • 網絡的參數信息如下:

    3.3??GoogleNet Inception V2

    大尺寸的卷積核可以帶來更大的感受野,也意味著更多的參數,為此,作者提出可以用2個連續的3x3卷積層(stride=1)組成的小網絡來代替單個的5x5卷積層,這便是Inception V2結構:

    同時,在GoogleNet Inception V2中還提出了著名的Batch Normalization。

    3.4??GoogleNet Inception V3

    任意 nxn 的卷積都可以通過 1xn 卷積后接 nx1 卷積來替代(節約大量參數,同時增加了深度,非線性表達能力增強),Inception V3模塊考慮了使用 nx1 卷積核來取代原本3x3卷積:

    注意:作者發現在網絡的前期使用這種分解效果并不好,在中度大小的feature map上使用效果才會更好(建議feature map尺寸在12到20之間,用nx1卷積來代替大卷積核,文章中設定n=7來應對17x17大小的feature map)。

    根據上述研究結果,Inception V3優化了Inception模塊的結構,處理35x35、17x17和8x8三種不同輸入,這些Inception模塊只在網絡后部出現,前面還是普通卷積層。

    3.5??GoogleNet Inception V4

    Inception V4結構結合了殘差神經網絡ResNet。

    3.6? Xception

    當時提出Inception的初衷可以認為是:特征的提取和傳遞可以通過1*1卷積,3*3卷積,5*5卷積,pooling等,到底哪種才是最好的提取特征方式呢?Inception結構將這個疑問留給網絡自己訓練,也就是將一個輸入同時輸給這幾種提取特征方式,然后做concat。Inception v3和Inception v1對比主要是將5*5卷積換成兩個3*3卷積層的疊加。

    于是從Inception v3聯想到了一個簡化的Inception結構,就是Figure 2。

    再將Figure2延伸,就有了Figure3,表示對于一個輸入,先用一個統一的1*1卷積核卷積,然后連接3個3*3的卷積層嗎,每個卷積層的卷積核數量為1/3 channel。再從Figure3延伸就得到Figure4,也就是3*3卷積的個數和1*1卷積的輸出channel個數一樣,每個3*3卷積核都是和1個輸入channel做卷積。

    這就是我們常說的深度可分離卷積,其實就是把標準卷積分解成深度卷積(depthwise convolution)和逐點卷積(pointwise convolution),這么做的好處就是可以再損失精度不多的情況下大幅度降低參數量和計算量。

    下圖是Xception的結構圖。這里的sparsableConv就是depthwise separable convolution。

    Xception作為Inception v3的改進,主要是在Inception v3的基礎上引入了depthwise separable convolution,在基本不增加網絡復雜度的前提下提高了模型的效果。

    ?

    第四章? ResNet

    4.1??意義

    隨著網絡的加深,模型參數更難學習,會出現準確率下降的現象。作者針對這個問題提出了一種全新的網絡,叫深度殘差網絡,它允許網絡盡可能的加深。ResNet提出了兩種mapping:

  • 一種是identity mapping,指的就是下圖中”彎彎的曲線”;
  • 另一種是residual mapping,指的就是除了”彎彎的曲線“那部分;
  • 所以最后的輸出是 y=F(x)+x ,identity mapping是指“恒等映射”,也就是公式中的x,而residual mapping是指“殘差映射”,也就是y?x,所以殘差指的就是F(x)部分。

    Q:為什么ResNet可以解決“隨著網絡加深,準確率下降”的問題?

    A:

  • 相比于直接學習信號,學習殘差在許多研究中被證明更為有效,可以簡化學習的過程;
  • 使用殘差結構,由于它包含了恒等映射,網絡加深后仍能夠有效的進行梯度反向傳播,有利于參數學習;
  • ResNet打破了網絡的對稱性,可以減緩網絡退化的問題;
  • 深層的殘差網絡可以看做是不同深度的淺層神經網絡的ensemble,這么做可以增強網絡的泛化能力。
  • 4.2? 網絡結構

    ResNet使用了shortcut connection,即跳遠連接,論文分別針對ResNet34(左圖)和ResNet50/101/152(右圖)設計了兩種結構:

    一般稱整個結構為一個”building block“。其中右圖又稱為“bottleneck design”,目的一目了然,就是為了降低參數的數目。

    Q:如果F(x)和x的channel個數不同怎么辦,channel不同怎么相加呢?

    A:?如圖所示,我們可以清楚的“實線”和“虛線”兩種連接方式

  • 實線的的Connection部分(“第一個粉色矩形和第三個粉色矩形”)都是執行3x3x64的卷積,他們的channel個數一致,所以采用計算方式:y=F(x)+x;
  • 虛線的的Connection部分(“第一個綠色矩形和第三個綠色矩形”)分別是3x3x64和3x3x128的卷積操作,他們的channel個數不同(64和128),所以采用計算方式:y=F(x)+Wx,其中W是卷積操作,用來調整x的channel維度。
  • 4.3??ResNet50和ResNet101

    論文把所有的ResNet網絡都分成5部分,分別是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他論文也會專門用這個稱呼指代ResNet50或者101的每部分。網絡結構如下:

    4.4??基于ResNet101的Faster RCNN

    文章中把ResNet101應用在Faster RCNN上取得了更好的結果,基于ResNet101的Faster RCNN的結構圖如下:

    上圖展示了整個Faster RCNN的架構,其中藍色的部分為ResNet101,可以發現conv4_x的最后的輸出為RPN和RoI Pooling共享的部分,而conv5_x(共9層網絡)都作用于RoI Pooling之后的一堆特征圖(14 x 14 x 1024),特征圖的大小維度也剛好符合原本的ResNet101中conv5_x的輸入;一定要記得最后要接一個average pooling,得到2048維特征,分別用于分類和框回歸。

    ?

    第五章??DenseNet

    5.1? 意義

    在深度學習網絡中,隨著網絡深度的加深,梯度消失問題會愈加明顯,目前很多論文都針對這個問題提出了解決方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,盡管這些算法的網絡結構有差別,但是核心都在于:create short paths from early layers to later layers(在前層和后層之間建立捷徑)。延續這個思路,DenseNet就是在保證網絡中層與層之間最大程度的信息傳輸的前提下,直接將所有層連接起來,通過對feature的極致利用達到更好的效果和更少的參數。

    5.2? 網絡結構

    5.2.1? Dense Block

    在傳統的卷積神經網絡中,如果你有L層,那么就會有L個連接,但是在DenseNet中,會有L(L+1)/2個連接。簡單講,就是每一層的輸入來自前面所有層的輸出。如下圖:x0是input,H1的輸入是x0(input),H2的輸入是x0和x1(x1是H1的輸出)……

    這種Dense Connection相當于每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣就可以使用更深的網絡。另外作者還觀察到這種Dense Connection有正則化的效果,因此對于過擬合有一定的抑制作用。

    注意:與ResNet不同的是,DenseNet對輸出的特征圖做的是通道合并操作(Concatnate),而ResNet是將輸出特征圖做值的相加,通道數是不變的。

    5.2.2??DenseNet

    DenseNet的結構圖如下,在這個結構圖中包含了3個dense block。作者將DenseNet分成多個dense block,原因是希望各個dense block內的feature map的size統一,這樣在做concatenation就不會有大小不統一的問題。

    網絡結構

    ?

    具體結構參數

    這個表中的k=32,k=48中的k是growth rate,表示每個dense block中每層輸出的feature map個數。為了避免網絡變得很寬,作者都是采用較小的k,比如32這樣,作者的實驗也表明小的k可以有更好的效果。根據dense block的設計,后面幾層可以得到前面所有層的輸入,因此concat后的輸入channel還是比較大的。

    另外這里每個dense block的3*3卷積前面都包含了一個1*1的卷積操作,就是所謂的bottleneck layer,目的是減少輸入的feature map數量,既能降維減少計算量,又能融合各個通道的特征,何樂而不為。另外作者為了進一步壓縮參數,在每兩個dense block之間又增加了1*1的卷積操作。因此在后面的實驗對比中,如果你看到DenseNet-C這個網絡,表示增加了這個Translation layer,該層的1*1卷積的輸出channel默認是輸入channel的一半。如果你看到DenseNet-BC這個網絡,表示既有bottleneck layer,又有Translation layer。

    綜上,DenseNet有如下幾個優點:

  • 通過密集連接,減輕了梯度消失;

  • 加強了feature的傳遞,可以更有效地利用feature;

  • 一定程度上較少了參數數量。

  • ?

    第六章? DetNet

    6.1? 背景

    隨著時間推移,基于 CNN 的物體檢測器也開始暴漏出一些弊端,其 backbone 往往針對 ImageNet 分類任務而設計,并不適用于檢測任務。分類 backbone 用于物體檢測主要存在兩個問題:

  • 相較于 ImageNet backbone,FPN 、 RetinaNet?等檢測器遷移到檢測問題上時通常會添加一個額外的 stage 來處理大尺度目標,這一層是沒辦法在ImageNet上預訓練的;
  • 傳統的 backbone 感受野通常較大,這有利于圖像分類,卻會折中空間分辨率,導致無法精確定位大物體和識別小物體。
  • 不管是 one-stage(比如 YOLO,SSD,RetinaNet)還是 two-stage(比如 Faster R-CNN,RFCN,FPN)的模型,針對檢測任務而設計的 backbone 仍是一項空白,所以才有了 DetNet,一個針對物體檢測的更優的 backbone。

    6.2? 網絡結構

    DetNet 針對不同大小的物體像 FPN 一樣使用了更多的 stage。即便如此,它優于 ImageNet 預訓練模型的地方在于成功保留了特征的空間分辨率,但同時也會增加神經網絡的計算和內存成本。為保證 DetNet 的效率,本文引入了低復雜度的 dilated bottleneck。由此,DetNet 做到了較高分辨率和較大感受野的兼得。

    DetNet的主要特點如下:

  • 在 stage 4 之后把空間分辨率固定為 16x 下采樣,增加了網絡高層輸出特征的分辨率;

  • 由于空間尺寸在 stage 4 之后是固定的,為引入一個新 stage,本文在?stage5,6 開始處使用一個帶有 1x1 卷積投影(上圖 B)的 dilated bottleneck;

  • 引入 dilated bottleneck 增加網絡的感受野,以緩解第一個改進點引起的感受野減小;

  • 在stage 5,6中保持通道數為256,減小網絡高層的寬度,以減少整體計算量。

  • 相較于把傳統分類網絡用于物體檢測而言,DetNet 有以下優勢:

  • DetNet 在 ImageNet 上預訓練和訓練物體檢測時的stage數目一致;
  • 受益于最后 stage 中的高分辨率特征圖,DetNet 在定位大物體邊界框和發現小物體方面更為強大。
  • ?

    第七章? 目標檢測系列

    7.1??目標檢測常見算法

    目標檢測常見的算法大致可以分為傳統方案和深度方案,具體如下:

    傳統方案

    候選區域+手工特征+分類器

    深度方案

    1)兩階段法

    候選區域+深度學習分類器,如:R-CNN(Selective Search + CNN + SVM)、Fast R-CNN(Selective Search + CNN + ROI Pooling)、Faster R-CNN(RPN + CNN + ROI Pooling)

    2)回歸法

    將目標檢測視為回歸問題,直接回歸出檢測框位置和類別,如:YOLO/SSD/DenseBox 等方法,以及最近出現的結合RNN算法的RRC detection,結合DPM的Deformable CNN等。

    傳統目標檢測面臨的主要問題是:

  • 基于滑動窗口的區域選擇策略沒有針對性,時間復雜度高,窗口冗余;
  • 手工設計的特征對于多樣性的變化沒有很好的魯棒性。
  • 7.2? R-CNN

    為了解決傳統目標檢測方案的缺陷,學者們做了很多的嘗試,終于,在2014年學界出現了大幅提高目標檢測性能的開山之作R-CNN。

    R-CNN算法總體步驟如下:

  • 利用選擇性搜索(Selective Search)算法,提取出大約2000個候選區域;
  • 對每個候選區域的圖像進行拉伸形變,使之成為固定大小的正方形圖像,并將該圖像輸入到AlexNet卷積神經網絡中,由?FC7 層輸出特征向量;
  • 再采用支持向量機對FC7層的特征向量進行分類;
  • 最后對候選框以及標定框完成邊框回歸,修正候選框的位置。
  • 7.2.1??選擇性搜索(Selective Search)

    思路:選擇性搜索算法首先通過基于圖的圖像分割算法將圖像分割成很多小塊,使用貪心策略,計算每兩個相鄰區域的相似度,然后每次合并最相似的兩塊,直至最終只剩下一塊完整的圖片。這其中每次產生的圖像塊(區域外框)包括合并的圖像塊我們都保存下來,這樣就得到圖像的所有候選框。

    相似度:選擇性搜索算法主要是通過顏色、紋理、大小和形狀交疊來計算兩個區域的像素度,最終的相似度是這四個值的加權和。

    7.2.2? 卷積神經網絡

    R-CNN中使用的是AlexNet,首先將該模型在ImageNet上進行預訓練,然后在Pascal voc 2007上進行fine-tuning,將最后分類數改成21(20個目標類別+背景),將候選區域調整為227x227輸入CNN提取特征,將第七層FC7的輸出特征向量存儲下來。

    7.2.3? 支持向量機(SVM)

    每個類別對應一個SVM分類器,將2000×4096維候選特征與20個SVM組成的權值矩陣4096×20相乘【20種分類,SVM是二分類器,則有20個SVM】,獲得2000×20維矩陣表示每個建議框是某個物體類別的得分;分別對上述2000×20維矩陣中每一列即每一類進行非極大值抑制得到該類中得分最高的一些建議框。

    7.2.4??邊框回歸

    每次分類完之后,都要對邊界框的進行調整,對于窗口一般使用四維向量??來表示,分別表示窗口的中心點坐標和寬高。對于下圖,紅色的框 P 代表原始的Proposal, 綠色的框 G 代表目標的 Ground Truth, 我們的目標是尋找一種關系使得輸入原始的窗口 P 經過映射得到一個跟真實窗口 G 更接近的回歸窗口? 。

    邊框回歸的目標即:給定一個(𝑃𝑥,𝑃𝑦,𝑃𝑤,𝑃h),尋找一種映射,使得𝑓(𝑃𝑥,𝑃𝑦,𝑃𝑤,𝑃h)=(𝐺𝑥,𝐺𝑦,𝐺𝑤,𝐺h),并且(𝐺𝑥,𝐺𝑦,𝐺𝑤,𝐺h) ≈ (𝐺𝑥,𝐺𝑦,𝐺𝑤,𝐺h)

    1、邊框回歸模型的輸入

    模型的輸入是候選區域對應的CNN特征( R-CNN 中的 Pool5 feature),訓練階段還應包括Ground Truth, 即:

    2、邊框回歸模型的輸出

    模型的輸出是候選框需要進行的平移變換和尺度縮放因子??,目標函數為??,其中??為輸入的卷積層特征向量,?是要學習的參數,我們通過不斷優化損失函數?,即可得到最佳參數,從而求解到因子?,修正目標框。

    7.2.5? 小結

    雖然R-CNN算法相較于傳統目標檢測算法取得了50%的性能提升,但其仍存在很多缺點:

  • 重復計算。2000個候選框都需要單獨提取卷積特征,計算量依然很大,候選框之間會有重疊,因此有不少其實是重復計算。
  • 訓練測試不簡潔。候選區域提取、特征提取、分類、回歸都是分開操作,中間數據還需要單獨保存。
  • 速度慢。前面的缺點最終導致R-CNN出奇的慢,處理一張圖片需要幾十秒。
  • 輸入的圖片Patch必須強制縮放成固定大小,會造成物體形變,導致檢測性能下降。
  • 7.3??Fast R-CNN

    RCNN由于存在上述多個缺點,速度實在太慢,于是學者借鑒SPP-Net算法結構,提出了Fast R-CNN算法,其主要改進如下:

  • 不再單獨對每個候選區域提取卷積特征,而是先對整張圖提取卷積特征,再將Selective Search得到的候選區域映射成CNN網絡最后卷積層輸出特征圖中的感興趣區域(ROI),以此節省大量計算;
  • 借鑒SPP-Net,設計了一種RoI Pooling的池化層結構,有效解決R-CNN算法必須將圖像區域剪裁、縮放到相同尺寸大小的問題;
  • 提出了多任務損失函數(Multi-task Loss),將邊框回歸任務直接加入到CNN網絡中訓練,同時完成候選區域分類和邊框回歸。
  • 7.3.1??RoI Pooling

    RoI Pooling實際上是單層的SPP Layer,它可以將候選區域映射成固定大小的特征圖(如7x7),下面我們通過一個例子來直觀的進行了解:

  • 假設卷積網絡用的VGG16,最后的卷積層輸出大小為原圖1/32、共512層的特征圖(圖800x800,最后一層特征圖feature map大小:25x25);
  • 假定原圖中有一候選區域,大小為665*665,映射到特征圖中的大小為:665/32=20.78,即20.78*20.78(Roi Pooling的源碼中在計算的時會進行取整操作),即映射的特征圖大小為20x20;
  • 假定要固定成7x7的特征圖,則將上面20x20的特征圖劃分成49個同等大小的區域,每個小區域的大小為20/7=2.86,取整后區域大小變成2x2;
  • 在每個2x2的小區域里,作Max Pooling,49個小區域就輸出49個像素值,組成7*7大小的特征圖。
  • 經過兩次取整量化,原本在特征圖上映射的20x20大小的region proposal,最終大小變為14x14,這樣的像素偏差勢必會對后層的回歸定位產生影響,因此后面還提出了替代方案——RoI Align。

    7.3.2??RoI Align

    在計算特征圖時保留浮點數,利用雙線性插值法計算最終每個小區域的像素值(例如,上述方案中保留浮點數后,最終每個小區域大小為2.97x2.97,假定采樣點數為4個,就會在小區域中計算出4個像素值,再進行Max Pooling)。

    7.3.3??多任務損失函數(Multi-task Loss)

    Fast R-CNN統一了分類任務和邊框回歸任務,RoI Pooling后的特征圖經過全連接層后進入兩個并列的輸出層,對應兩個損失函數:分類損失(SoftMax Loss)和回歸損失(Smooth L1 Loss),兩個任務共享卷積特征,因此可對兩個任務進行聯合訓練,實現除候選框提取外的端到端。其中,分類采用softmax代替SVM進行分類,共輸出N(類別)+1(背景)類;回歸損失輸出的是4*N(類別),4表示的是(x,y,w,h)。

    7.4??Faster R-CNN

    Fast R-CNN在速度上雖然得到了極大提升,但因使用選擇性搜索尋找候選區域,所以仍存在較大速度瓶頸。為此,Faster R-CNN引入Region Proposal Network(RPN)替代Selective Search,其中還引入了anchor box應對目標形狀的變化問題,同時,共享CNN主干網絡,實現了真正意義上的端到端檢測。由于原論文寫得挺亂,網上的解析都copy來copy去,關鍵點講不清楚,我參考了很多資料按個人理解作了梳理,僅供參考。

    算法流程

  • 輸入待測圖像,通過Backbone提取特征圖;
  • 通過RPN在最后一層特征圖上提取候選區域;
  • 通過RoI Pooling將每個候選區域生成固定大小的特征圖;
  • 繼續經過兩個全連接層得到特征向量,特征向量再經由各自的FC層,得到兩個輸出向量。一個用于分類(softmax),一個用于每一類的bounding box回歸。
  • Faster-RCNN網絡結構圖

    上面是具體的網絡結構圖,下面附上一個很形象的網絡圖,https://zhuanlan.zhihu.com/p/37998710

    Faster-RCNN流程示意圖

    7.4.1? Anchor機制

    Anchors是一堆固定的邊界框,是利用不同尺度和比例在原圖上得到的一堆候選區域(雖然 Anchors 是基于卷積特征圖定義的,但最終的 Anchos 是相對于原始圖片的)。我們知道,特征圖上的一點可以映射成原圖上的一個區域,在Fast R-CNN中,通過設置這個區域的尺度和比例,就可以得到若干個Anchor,論文中將原圖尺寸調整為800x600,用到三種尺度分別是小(藍128)中(紅256)大(綠512),三個比例分別是1:1、1:2、2:1,組合起來總共9種Anchor。

    7.4.2? RPN詳解

    下圖就是RPN的網絡結構圖,它是一個全卷積神經網絡,輸入是卷積特征圖,輸出是原圖上的候選區域。那么,要理解這個網絡,重點就在于理解:輸入CNN得到的卷積特征圖,通過RPN怎么就可以得到原圖上對應的候選區域。

    RPN網絡結構圖

    要解決這個問題,我們首先得理解Anchor概念。了解了Anchor后,我們再來看RPN,通常來說RPN其實可以分為如下幾步:

  • 假設我們通過主干網絡提取到的卷積特征圖維度為(HxWxC),以每個像素點為中心在原圖上生成HxWx9個Anchor(論文中有20000個左右);
  • 通過3x3x256的卷積核先對輸入特征圖進行一次same卷積,得到HxWx256的一個特征圖(個人覺得是擴大感受野,將Anchor周圍區域的信息融合來提高檢測效果);
  • 分成兩路,均采用1x1的卷積核來改變每個特征向量的通道數,分類支路的通道數為2K,邊框回歸支路的通道數為4K(特征圖上每個像素點有K=9個Anchor,每個Anchor要分foreground和background這2個類別,且都有[x, y, w, h]對應4個偏移量),也就是說,對于特征圖上的每個點,最后都會得到一個18維的分類特征向量和一個36維的邊框回歸特征向量,分別表示每個Anchor的類別概率和偏移量;
  • 根據提取Anchor的分類結果,應用NMS,選出2000個正樣本候選框進行RoI Pooling,將RoI Pooling后的每個特征圖都通過FC層,進行分類和定位。
  • 注意:

    1)在訓練時,我們并不使用全部Anchor,而是通過將與某個ground truth的IoU超過0.7的Anchor作為正樣本,將IoU低于0.3的Anchor作為負樣本,然后隨機在里面選取128個正樣本+128個負樣本用于訓練;同時,在推理時則是采用NMS來得到若干個候選區域。

    2)RPN分類支路的softmax前后都接一個reshape layer是為了便于softmax分類。在caffe基本數據結構blob中以如下形式保存數據:blob=[batch_size, channel, height, width],對應上面保存bg/fg anchors的特征圖,其在caffe blob中的存儲形式為[1, 18, H, W]。而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9*H, W]大小,即單獨“騰空”出來一個值為2的維度以便softmax分類,之后再reshape恢復原狀。

    3)在RPN的訓練中,對于分類,我們在所有Anchor中選取了128個正樣本+128個負樣本計算交叉熵損失;同時,僅對128個正樣本進行計算邊框回歸損失。

    其中,i表示min-batch中的第i個Anchor,p表示屬于前景的概率,t表示偏移量。

    7.5? YOLO v1

    Faster R-CNN是主流的目標檢測方法,但速度上并不能滿足實時的要求,同時,采用proposal訓練方式容易把背景區域誤檢為特定目標。因此,基于回歸思想的目標檢測方法顯現出其重要性,它們將整張圖作為網絡的輸入,直接在圖上回歸出目標的邊界框及所屬類別。YOLO便是一種基于回歸思想的CNN網絡,可一次性預測多個邊框位置及其類別,實現了端到端的目標檢測和識別,其最大的優勢就是速度快,并且,由于直接選用整圖訓練模型(充分利用全局信息),可以更好的區分目標和背景區域。

    算法流程

    1)將輸入圖像Resize成448x448大小,然后將其劃分成SxS大小的柵格(YOLO里面取S=7);

    2)對于每個柵格我們都預測B個邊框(YOLO中B=2,每個邊框包括x, y, w, h, confidence這5個值):

    • 坐標x,y代表了預測的bounding box的中心與柵格邊界的相對值;
    • 坐標w,h代表了預測的bounding box的width、height相對于整幅圖像width,height的比例;
    • confidence就是預測的bounding box和ground truth box的IoU值(訓練時是IoU,測試時是直接輸出的一個置信度);

    3)同時,每個柵格還要預測C個條件類別概率Prob(class i|obj)(YOLO中C=20),即在一個柵格包含目標的前提下,它屬于某個類的概率;

    4)將confidence和Prob(class i|obj)相乘得到候選框的confidence score,對其應用NMS,排除可能性較低的框,最后輸出剩余的所有目標框。

    注意:

    1)測試階段,模型置信度是直接輸出的,然后用置信度乘上分類的prob,得到score;訓練階段,置信度就是與真實框IOU最大的那個框,如果格子內有物體prob設為1,否則設為0。

    2)Prob(class i|obj)是針對每個柵格的,confidence score是針對每個候選框的。

    7.5.1? 網絡結構

    YOLO主要采用GoogleNet作為基礎網絡,但它沒有采用Inception模塊,而是直接使用1x1的卷積層+3x3的卷積層簡單替代,我們從圖中也可以看到,其總共包含24個卷積層和2個全連接層,最終輸出的特征向量為7x7x30(SxSx(Bx5+C))。

    7.5.2? 損失函數

    1、邊框損失

    YOLO論文中提到,在訓練時,我們對每一個目標只希望有一個邊框預測器,因此我們將與Ground Truth有最高IoU的預測框設置?,其余置零。隨后,計算負責該目標的預測框中心坐標的偏差;然后,由于在大小不同的邊框預測中,大邊框定位偏差對總體損失造成的影響要弱于小邊框定位偏差造成的影響,因此,論文中對寬高進行了開根號,來提高對小目標的預測效果。

    2、置信度損失

    在置信度損失中,對于不包含目標的邊框我們設置?,?是預測的置信度,?是預測邊框與Ground Truth的IoU。

    3、類別損失

    YOLO論文中提到,只要一個目標中心落在柵格中,這個柵格就負責預測這個目標,因此,損失函數中將第i個柵格設置?,其余置零。隨后,對這些有目標的柵格是否屬于某一類做一個正常的分類損失。

    注意:由于將邊框回歸與分類賦予相同權重是不合理的,同時,對不包含目標柵格的置信度損失賦予較大權重也是不合理的。因此,作者在損失函數里面加了兩個Loss Weight,通常𝜆𝑐𝑜𝑜𝑟𝑑=5,𝜆𝑛𝑜𝑜𝑏𝑗=0.5

    7.5.3? YOLO v1的缺點

  • 精度低于SOTA;
  • 每個柵格只能預測一類物體,兩個目標,因此對于小目標的效果不好;
  • YOLO中邊框回歸的寬高是相對整張圖像的,難以適應不同形狀的目標,直接造成了定位不準確的問題。
  • 7.6? YOLO v2

    YOLO v2的論文全名為YOLO9000: Better, Faster, Stronger,YOLO v2相比YOLO v1做了很多方面的改進,這也使得YOLO v2的mAP有顯著的提升,并且速度依然很快,保持著自己作為one-stage方法的優勢,YOLO v2和Faster R-CNN, SSD等模型的效果對比如下圖所示。

    下面我們直接來介紹YOLOv2的改進策略:

    1)YOLO v2采用了新的Backbone,稱為Darknet-19,主要是通過Bottleneck結構減少了參數;

    2)YOLO v2中,每個卷積層后面都添加了BN層,mAP提高了2%;

    3)為了提高對小目標的檢測效果,YOLOv2提出了一種passthrough層來利用模型前面更精細的特征圖,具體來說,它會將最后一個maxpooling層前26x26x512的特征圖上每個2x2的局部區域轉化到Channel維度上,變成一個13x13x2048的新特征圖,再與后面13x13x1024的特征圖進行Concate形成13x13x3072的特征圖,在此基礎上再通過1x1的卷積改變通道數去做預測;

    4)YOLO v2借鑒RPN的思想(其實整個網絡就是RPN的變形),引入Anchor? Box的機制來進行目標預測,YOLO v1中一個柵格只能預測兩個BBox,且它們共享一個類別,而在YOLO v2中每個Anchor? Box都要預測位置偏移和歸屬類別。具體來說,YOLO v2取消了全連接層,直接將passthrough層的輸出特征圖通過1x1的卷積改變成13x13x(Bx(5+C)),其中B就是Anchor? Box的個數,5是位置偏移和置信度,C是預測類別數;

    5)使用K-Means聚類來求取方框先驗,即確定Anchor? Box的寬高,作者在這里選取了5種Anchor;

    6)先用448x448的輸入分辨率在ImageNet上微調10個epochs后,再去檢測數據集上進行微調,mAP提高了4%;

    7)多尺度訓練,每10個batch隨機選擇一個新的image size。

    YOLO v2網絡結構表

    ?

    YOLO v2網絡結構示意圖

    7.7? YOLO v3

    YOLO-v3在YOLO-v2的基礎上進行了一些改進:

    1)采用了新的Backbone,稱為Darknet-53,大量使用了跳遠連接和Bottleneck結構,且摒棄了Pooling層,直接用步長為2的Conv層來進行下采樣;

    Darknet53網絡結構表

    2)為了提高對小目標的檢測效果,YOLO v3采用了類似FPN上采樣和融合的方式,引出了3條預測支路,尺度分別為13x13、26×26和52×52,每個尺度上都有三個Anchor,每個Anchor預測C個類別、4個坐標、1個目標置信度,所以每個尺度的輸出特征圖通道數為3x(C+5)。

    YOLO v3網絡結構圖

    3)YOLO v3采用logistic regression對方框置信度進行回歸(即預測該位置是目標的可能性有多大)。如果候選框不是置信度最高的,即使它超過我們設定的IoU閾值,我們還是不會對它進行預測,因此可以去掉不必要anchor,減少計算量。

    4)對每個類別獨立地使用logistic regression,用二分類交叉熵損失作為類別損失,可以很好地處理多標簽任務;

    YOLO v3損失函數

    7.8? YOLO v4

    YOLO-v4算法是在原有YOLO目標檢測架構的基礎上,采用了近些年CNN領域中最優秀的優化策略,從數據處理、主干網絡、網絡訓練、激活函數、損失函數等各個方面都有著不同程度的優化,通過應用一系列的Tricks,實現了目前最優的實驗結果:43.5%的AP,在Tesla V100上,MS COCO數據集的實時速度約為65FPS。

    7.8.1? 網絡調優技巧概述

    如上圖所示,目前檢測器不管是two-stage還是one-stage都通常可以分為以下幾個部分,只不過各類目標檢測算法設計改進側重在不同位置:

  • Input部分:Image,Patches,Images Pyramid(圖像金字塔)
  • Backbone部分:VGG16,ResNet-50,SpineNet,EfficientNet-B0 / B7,CSPResNeXt50,CSPDarknet53
  • Neck部分:
    • Additional blocks:SPP,ASPP,RFB,SAM
    • Path-aggregation blocks:FPN,PAN,NAS-FPN,Fully-connected FPN,BiFPN,ASFF,SFAM
  • Heads部分:
    • Dense Predictions(one-stage):
      • RPN,SSD,YOLO,RetinaNet (基于anchor)
      • CornerNet,CenterNet,MatrixNet,FCOS(無anchor)
    • Sparse Predictions(two-stages):
      • Faster R-CNN,R-FCN,Mask R-CNN(基于anchor)
      • RepPoints(無anchor)
  • 同時,作者還把所有的調優手段分為了兩大類:

  • Bag of freebies(免費禮包):是指在離線訓練階段為了提升精度而廣泛使用的調優手段,而這種技巧并不在推斷中使用,不會增加推斷時間。
  • 數據類:

    數據增強(random erase/CutOut/hide-and-seek/grid mask/MixUp/CutMix/GAN)

    數據分布:two-stage的有難例挖掘,one-stage的有focal loss。

  • 正則化類:

    DropOut/DropConnect/DropBlock

  • 損失函數類:

    MSE/ IoU loss/L1、L2 loss/GIoU loss/DIoU loss/CIoU loss

  • Bag of specials(特價包):是指在推斷過程中增加的些許成本但能換來較大精度提升的技巧。
  • 增大感受野類:

    SPP/ASPP/RFB
  • 注意力類:

    Squeeze-and-Excitation (SE)/Spa-tial Attention Module (SAM)
  • 特征集成類:

    SFAM/ASFF/BiFPN
  • 激活函數類:

    ReLu/LReLU/PReLU/ReLU6/Scaled ExponentialLinear Unit (SELU)/Swish/hard-Swish/Mish?
  • 后處理類:

    Soft NMS/DIoU NMS
  • 7.8.2? YOLO v4 架構選擇

    作者選擇架構主要考慮幾方面的平衡:輸入網絡分辨率/卷積層數量/參數數量/輸出維度。最終YOLO v4整體架構如下:

    • Backbone:CSPDarknet53
    • Additional Block:SPP-block
    • Path-aggregation Neck:PANet
    • Heads:YOLOv3的heads
    YOLO v4網絡結構圖

    1、CSPNet

    Cross Stage Partial(CSP)從網絡結構設計的角度來解決以往工作在推理過程中需要很大計算量的問題,能夠在降低20%計算量的情況下保持甚至提高CNN的能力。作者認為推理計算過高的問題是由于網絡優化中的梯度信息重復導致的。CSPNet通過將梯度的變化從頭到尾地集成到特征圖中,在減少了計算量的同時可以保證準確率。CSPNet是一種處理的思想,可以和ResNet、ResNeXt和DenseNet結合。下圖是將CSP模型應用到ResNeXt或者ResNet中:

    也就是說,CSPNet會將淺層特征映射為兩個部分,一部分經過Res Block,另一部分直接與Res Block輸出進行concate,獲得最終的特征圖。從實驗結果來看,分類問題中,使用CSPNet可以降低計算量,但是準確率提升很小;在目標檢測問題中,使用CSPNet作為Backbone帶來的提升比較大,可以有效增強CNN的學習能力,同時也降低了計算量。在YOLO v4中,作者將Darknet53加入了CSP思想,具體結構參見:https://blog.csdn.net/weixin_41560402/article/details/106119774

    2、SPP思想

    YOLO v4中還應用了空間金字塔池化(SPP),目的是為了增加感受野,實現是對layer107進行?5×5 、9×9 、13×13 的最大池化,分別得到layer 108,layer 110和layer 112,完成池化后,將layer 107,layer 108,layer 110和layer 112進行concatenete,連接成一個特征圖layer 114并通過?1×1 卷積降維到512個通道。

    3、PANet

    PANet主要做了三點貢獻:

    1)自底向上路徑增強

    在FPN中每個proposal只負責金字塔特定的一層,預測只基于單一尺度視角,因此,與FPN相比,PANet 在DownSample之后又加了UpSample的操作,也就是在FPN的后面添加一個自底向上的金字塔,將低層的強定位特征傳遞上去,再進行預測。

    2)動態特征池化

    FPN中的每個proposal根據其大小分配給不同的特征層,但這樣可能不夠好,PANet中通過特征池化層,將同一個proposal在不同尺度特征圖上的RoI進行了融合,更有利于定位和分類。

    金字塔上四個灰色區域對應的是同一個proposal,根據特征圖相應縮放,分別進行RoIAlign取到四個特征圖后,分別全連接,然后采取max,或者sum,或者相乘進行特征融合。

    3)全連接融合

    主要是在原來的mask支路(Figure4上面那條支路,也就是傳統的FCN結構)上增加了Figure4下面那條支路做融合。增加的這條支路包含2個3*3的卷積層(其中第二個為了降低計算量還將通道縮減為原來的一半),然后接一個全連接層,再經過reshape操作得到維度和上面支路相同的前背景mask,也就是說下面這條支路做的是前景和背景的二分類,因此輸出維度類似文中說到的28*28*1。上面這條支路,也就是傳統的FCN結構將輸出針對每個類別的分類mask,因此輸出的通道就是類別的數量,輸出維度類似28*28*K,K表示類別數。最終,這兩條支路的輸出mask做融合得到最終的結果。因此可以看出這里增加了關于每個像素點的前背景分類支路,通過融合這部分特征得到更加精確的分割結果。

    4、YOLO v4 Heads

    YOLO v4采用了和YOLO v3一樣的Heads,只是尺度不一樣罷了。

    7.8.3??YOLO v4 調優選擇

    目標檢測訓練中,通常對CNN的優化改進方法如下(YOLO v4采用了黑色加粗部分):

    • 激活函數:ReLU,leaky-ReLU,parameter-ReLU,ReLU6,SELU,Swish 或?Mish
    • 回歸loss函數:MSE,IoU,GIoU,CIoU,DIoU
    • 數據增強:CutOut,MixUp,CutMix
    • 正則化方法:DropOut,DropPath,Spatial DropOut 或?DropBlock
    • 通過均值和方差對網絡激活進行歸一化:Batch Normalization (BN), Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN), or?Cross-Iteration Batch Normalization (CBN)
    • 跨連接:Residual connections, Weightedresidual connections, Multi-input weighted residualconnections, or Cross stage partial connections (CSP)

    1、Mish

    Mish激活函數的表達式為

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    Mish激活函數的特點:

  • Mish激活函數保證了每一點的平滑,從而更好訓練;
  • 在輸入x是正值時,Mish函數的梯度可以很好的傳播;
  • 當輸入x是負值時,輸入不會完全死掉,而僅是有一定概率被dropout掉,在激活中引入了隨機正則的思想。
  • 2、CIoU

    CIoU考慮了目標與anchor之間的距離、重疊率、尺度以及長寬比,具體損失函數如下:

    其中,其中,??,?分別代表了預測框和真實框的中心點,且??代表的是計算兩個中心點間的歐式距離。??代表的是能夠同時包含預測框和真實框的最小閉包區域的對角線距離,?是權重函數,?用來度量長寬比的相似性,定義為:

    最后,CIoU loss的梯度類似于DIoU loss,但還要考慮??的梯度。在長寬在??的情況下,??的值通常很小,會導致梯度爆炸,因此在??實現時將替換成1。

    參數示意圖

    3、CutMix

    • Mixup:將隨機的兩張樣本按比例混合,分類的結果按比例分配;
    • Cutout:隨機的將樣本中的部分區域cut掉,并且填充0像素值,分類的結果不變;
    • CutMix:就是將一部分區域cut掉但不填充0像素而是隨機填充訓練集中的其他數據的區域像素值,分類結果按一定的比例分配。

    7.8.4? 其他改進

    為了使設計的檢測器更適合于單GPU上的訓練,作者做了如下的附加設計和改進:

    • 介紹了一種新的數據增強Mosaic法和 Self-Adversarial Training?自對抗訓練法。

    • 應用遺傳算法選擇最優超參數。

    • 改進SAM,改進PAN,和交叉小批量標準化(CmBN),使我們的設計適合于有效的訓練和檢測。

    1、Mosaic

    是一種將4張訓練圖片混合成一張的新數據增強方法,這樣可以豐富圖像的上下文信息。如下圖所示:

    這種做法的好處是允許檢測上下文之外的目標,增強模型的魯棒性。此外,在每一層從4個不同的圖像批處理標準化計算激活統計,這大大減少了對大mini-batch處理size的需求。

    2、Self-Adversarial Training?

    這是一種新的數據擴充技術,該技術分前后兩個階段進行。

  • 第一階段是在一張圖上,讓神經網絡反向更新圖像,對圖像做改變擾動。通過這種方式,神經網絡對自身執行一種對抗性攻擊,改變原始圖像,從而造成圖像上沒有目標的假象。
  • 在第二階段,訓練神經網絡對修改后的圖像進行正常的目標檢測來訓練模型。
  • 3、CmBN

    BN是對當前mini-batch進行歸一化,CBN是對當前以及當前往前數3個mini-batch的結果進行積累并歸一化,本文提出的CmBN則是僅僅在這個Batch中進行累積。

    4、SAM和PAN的改進

    將SAM從空間上的attention修改為點上的attention,并將PAN的short-cut連接改為拼接,分別如下圖所示:

    7.9? YOLO v5

    YOLO V5 在性能上稍弱于YOLO V4,但是在靈活性與速度上遠強于YOLO V4,在模型的快速部署上具有極強優勢。下面便來講講YOLO v5的幾個不同點。

    7.9.1??自適應錨框計算

    YOLO V3中,采用 k 均值和遺傳學習算法對自定義數據集進行分析,獲得適合自定義數據集中對象邊界框預測的預設錨定框。在YOLO V5 中錨定框是基于訓練數據自動學習的。

    7.9.2??自適應圖片縮放

    以往圖片前處理的方式,是將原始圖片統一縮放到一個標準尺寸,再送入檢測網絡中。比如Yolo算法中常用416*416,608*608等尺寸,比如對下面800*600的圖像進行縮放。

    作者認為,在項目實際使用時,很多圖片的長寬比不同,因此縮放填充后,兩端的黑邊大小都不同,而如果填充的比較多,則存在信息冗余,影響推理速度。因此動態的自適應的對圖片填充最少的黑邊:

    7.9.3??四種網絡結構控制

    YOLO V5的網絡結構非常簡潔,而且YOLO V5 s,m,l,x四種模型的網絡結構是一樣的。原因在于作者通過depth_multiple,width_multiple兩個參數分別控制模型的深度以及卷積核的個數。

    7.10??SSD

    針對YOLO類算法定位精度不足的問題,學者將YOLO的回歸思想和Faster R-CNN的anchor box機制結合,提出了SSD(Single Shot MultiBox Detector)算法,兼顧了檢測速度和檢測準確度。

    7.10.1? 網絡結構

    SSD采用VGG16作為基礎網絡,并對網絡進行了一定修改:

  • 分別將VGG16的全連接層FC6和FC7轉換成 3x3 的卷積層 Conv6和 1x1 的卷積層Conv7;

  • 將原來池化層Pool5中stride=2的2x2卷積核替換成stride=1的3x3卷積核;

  • 去掉了所有的Dropout層和最后的FC8層;

  • 增加空洞卷積,減小計算量,提高感受野;

  • 在VGG的Conv7后面又增加了卷積層來獲得更多的特征圖做檢測用。

  • 算法流程

    1)輸入原始圖像,將其裁剪為300x300,或者512x512大小,通過改進VGGNet提取卷積特征圖;

    2)按上圖中所示,在6個位置的卷積特征圖上對每個像素點都預設K個Default Box(論文取K=4 or 6),每個Default Box都有C個類別Score和4個Offset,所以每個像素點需要預測(C+4)x K個值,因此,用維度為3 x 3 x (C+4) x K的卷積核對6個特征圖進行一次same卷積,得到6個H x W x (C+4) x K的新特征圖;

    ?

    ?

    3)上面6個新的特征圖就匯集了所有Default Box屬于某類的概率值及坐標偏移值,將所有Default Box采用Fast NMS進行篩選,輸出篩選得到的Default Box作為結果。

    7.10.2? 算法細節

    1、多尺度

    算法在6個不同尺度的特征圖上選取 Default Box,由于每個特征圖的感受野不同,這步操作就自然獲得了多種尺度的候選框(淺層保留了更多位置信息,深層提取了更多語義信息);

    2、Default Box生成規則

    論文中以各個Feature Map上每個像素點的中點為中心,生成一系列同心的Default Box,實際與Faster RCNN中的Anchor一個意思。Default Box的大小主要由scale和aspect ratio控制,scale最小為0.2,最大0.9,假如總共選取了m個scale,則各個scale的scale值按下式計算:

    這些scale都是通過計算得到的,其中每層有各自的min?_𝑠𝑖𝑧𝑒和max?_𝑠𝑖𝑧𝑒,如下:

    同時,aspect ratio選取為[1, 2, 3, 1/2, 1/3],在論文中,正方形Default Box的最小邊長為?,最大邊長為?,根據aspect ratio,還會生成2或4個長方形,長寬為? 和?

    3、數據增強

    每一張訓練圖像,隨機的進行如下幾種選擇:

    • 使用原始的圖像;
    • 隨機裁剪出一個 patch,與物體之間最小的 jaccard overlap (IoU)為:0.1,0.3,0.5,0.7與0.9;
    • 隨機的采樣一個 patch,采樣的 patch 是原始圖像大小比例是 [0.1,1],aspect ratio 在 1/2 與 2 之間。當 GT Box 的中心在采樣的 patch 中時,保留重疊部分。在這些采樣步驟之后,每一個采樣的 patch 被 resize 到固定的大小,并且以 0.5的概率隨機的水平翻轉。

    綜上,SSD算法使用了多種數據增強的方法,包括水平翻轉(horizontal flip),隨機裁剪(random crop)、顏色扭曲(color distortion 或者對比度調整),隨機采集塊域(Randomly sample a patch)以獲取更多訓練樣本。

    7.10.3? SSD損失函數

    SSD算法的損失函數分為兩部分:Default Box與目標類別的confidence loss及定位損失location loss。其中,對于正樣本計算兩種損失,對于負樣本只計算分類損失。我們可以用一張圖進行總結:

    在上述損失函數中,N是匹配到GT的Prior Box數量,如果N=0,則將損失設為0;而 α 參數用于調整Confidence Loss和Location Loss之間的比例,默認 α=1。具體來說:

    1)SSD中的Confidence Loss是在多類別置信度上的Softmax Loss,公式如下:

    ?

    上式中,前半部分為正樣本的損失,后半部分為負樣本的損失。其中,i表示Default Box的序號,j表示GT的序號,p表示類別序號,p=0表示背景。𝑥𝑖𝑗𝑝=0,1,取1時表示第i個Default Box匹配上了第j個類別為p的GT Box。𝑐𝑖𝑝表示第i個Default Box預測為類別p的概率。

    2)Location Loss(位置回歸)是典型的Smooth L1 Loss:

    ?

    其中,l為預測框,g為真實框,cx和cy為偏移后Default Box的中心坐標,w和h為Default Box的寬高。

    7.10.4? 總結

    SSD由于采用了Anchor的機制,并通過數據增廣提高了檢測的精度;同時,由于SSD是一個One-Stage的算法,且把全連接層改成了卷積層,并采用Atrous卷積等Trick減少了計算量,保證了檢測的速度。但是,其仍存在一定缺點:

  • 需要人工設置prior box的min_size,max_size和aspect_ratio值;

  • 雖然采用了pyramdial feature hierarchy的思路,但是對小目標的recall依然一般。

  • ?

    第八章? 語義分割系列

    8.1??語義分割背景

    語義分割(semantic segmentation)就是按照“語義”給圖像上的每個像素點分一類標簽,使得不同種類的目標在圖像上被區分開來,可以理解成像素級別的分類任務。

    • 輸入:(H x W x 3)原始圖像
    • 輸出:( H x W x Class )每一個pixel位置,都有Class數目個channel,每一個channel對應一個class,channel的值對應那個像素屬于該class的預測概率(可以視為圖片上每個點的one-hot表示)

    評價標準

    • 像素精度(pixel accuracy):每一類像素正確分類的個數/ 每一類像素的實際個數;
    • 均像素精度(mean pixel accuracy ):每一類像素的精度的平均值;
    • 平均交并比(Mean Intersection over Union):求出每一類的IOU取平均值;
    • 權頻交并比(Frequency Weight Intersection over Union):每一類出現的頻率作為權重,計算交并比的加權平均值。

    8.2??語義分割常見方法

    傳統方案

    在深度學習方法流行之前,TextonForest和基于隨機森林分類器等語義分割方法是用得比較多的方法。不過在深度卷積網絡流行之后,深度學習方法比傳統方法提升了很多,所以這里就不詳細講傳統方法了。

    深度學習方案

    深度學習方法在語義分割上得到了巨大成功,部分深度學習方法解決語義分割問題可以概括為幾種思路:Patch classification、全卷積網絡、Encoder-Decoder架構、基于金字塔網絡的模型、DeepLab家族、注意力機制模型,下面我們一一進行介紹。

    8.3??Patch classification

    最初的深度學習方法應用于圖像分割就是Patch classification,顧名思義,該方法就是將圖像切成塊喂給深度模型的,然后對像素進行分類。使用圖像塊的主要原因是因為全連接層需要固定大小的輸入圖像。

    8.4??全卷積網絡

    FCN是語義分割的開山之作,主要特色有兩點:

    • 使用卷積層替換全連接層換
    • 使用跳級連接融合不同尺度的信息

    8.5??Encoder-Decoder架構

    8.5.1??U-net

    U-net遵循與FCN一樣的基本原理,用于解決小樣本的簡單問題分割(比如醫療影片的分割),其主要有兩個特色:

    • Encoder-Decoder結構:前半部分為多層卷積池化,不斷擴大感受野,用于提取特征;后半部分上采樣恢復圖片尺寸。
    • 更豐富的信息融合:在上采樣過程中,Decoder采用逐步恢復的形式,將Encoder中不同尺度的特征圖與逐層上采樣得到的特征圖進行Concat,融合了更多的前后層之間的信息(這里采用Concat,區別于FCN的逐元素加和)。注意的是,在串聯之前,需要把前層的特征圖crop到和后層一樣的大小。
    UNet網絡結構

    8.5.2??SegNet

    從結構上看,SegNet和U-net其實大同小異,都是編碼-解碼結構。其特色在于:SegNet沒有直接融合不同尺度的層的信息,為了解決為止信息丟失的問題,SegNet使用了帶有坐標(index)的池化。

    在Max pooling時,選擇最大像素的同時,記錄下該像素在Feature map的位置(左圖);在反池化的時候,根據記錄的坐標,把最大值復原到原來對應的位置,其他的位置補零(右圖)。上采樣后的卷積層可以把0的元素給填上,這樣一來,就解決了由于Encoder多次池化造成的位置信息的丟失。

    8.6??基于金字塔網絡的模型

    8.6.1??PSPNet

    PSPNet全稱Pyramid Scene Parsing Network,其主要有三個特色:

    • 采用添加了空洞卷積的ResNet網絡作為Backbone提取特征
    • 引入了金字塔池化模塊,以更好的整合全局與局部信息
    • 引入了輔助loss
    PSPNet網絡結構

    具體來說,首先,輸入圖像會經過一個帶空洞卷積的ResNet101,得到一個縮小了8倍的特征圖;在Pyramid Pooling Module中構建了深度為4的特征金字塔,將該特征圖分別劃分成1x1、2x2、3x3、6x6塊,然后通過區域平均池化得到1x1、2x2、3x3、6x6的金字塔特征圖;隨后,通過1x1的卷積核,將每個特征圖的通道數減少為原來的1/4;最后,將這些金字塔特征圖進行雙線性插值,保持與ResNet的輸入特征圖相同尺度,并將這5個特征圖進行Concate;最后通過卷積和雙線性插值將Concate后的特征圖恢復到原圖大小,通道數為類別數,取概率最大的值作為像素的類別。

    8.6.2??Mask RCNN

    Mask RCNN沿用了Faster RCNN的思想,特征提取采用ResNet-FPN的架構,另外多加了一個Mask預測分支。總結就是Mask RCNN=ResNet-FPN+Fast RCNN+Mask。

    Mask RCNN網絡結構

    1、ResNet-FPN

    FPN是一種通用架構,可以結合各種骨架網絡使用,比如VGG,ResNet等。Mask RCNN文章中使用了ResNNet-FPN網絡結構。如下圖:

    從上圖中我們可以看到,ResNet-FPN首先將ResNet作為Backbone,根據feature map的大小分為5個stage,其中,stage2、3、4、5各自最后一層輸出定義為conv2、3、4、5。隨后,采用線性插值的方式進行上采樣,同時采用1 x 1的卷積對conv2、3、4、5進行通道降維(全降為256),然后將兩者進行add操作。最后,還會用3 x 3的卷積對融合后的特征圖進行處理,目的是消除上采樣的混疊效應(Aliasing Effect)。

    注:實際上,上圖少繪制了一個分支:M5還會經過步長為2的max pooling下采樣得到 P6。作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在RPN中用來得到region proposal的,并不會作為后續Fast RCNN的輸入。總之,ResNet-FPN作為RPN輸入的feature map是 [P2P3P4P5P6] ,而作為后續Fast RCNN的輸入則是[P2P3P4P5]

    2、ResNet-FPN+Fast RCNN

    與Faster RCNN不同的是,FPN產生了特征金字塔[P2,P3,P4,P5,P6],而非單獨一個特征圖。特征金字塔里的每張特征圖都會通過RPN產生一部分Region Proposal(Mask RCNN采用了scale為[32, 64, 128, 256, 512],ratio為[0.5, 1, 2],共15種Anchor)。主干網絡Fast RCNN會根據Region Proposal在[P2,P3,P4,P5]中選擇一張特征圖于其上切出這些ROI,選擇哪張特征圖由如下公式決定:

    上式中,224表示用于預訓練的ImageNet圖片的大小;𝑘0表示面積𝑤×h=224×224的ROI所在的層級。作者將𝑘0設置為4,意指𝑤×h=224×224的ROI是從P4中切出來的,假設ROI的尺度為112×112,那么𝑘=4?1=3,此時會從分辨率更高的P3中切出ROI,可以看出這種方法還是比較合理的,因為大尺度的ROI要從低分辨率的feature map上切,有利于檢測大目標,小尺度的ROI要從高分辨率的feature map上切,有利于檢測小目標。

    3、ResNet-FPN+Fast RCNN+Mask

    Mask RCNN與Faster RCNN的區別之一就在于,它加入了一個Mask分支,該分支通過在ROI Align層后獲得的ROI特征上接上一個FCN,最終得到一個與ROI區域相對應的mask map出來。這個mask map有K個channels(K在這里表示目標可能的類別數目),每個channel的mask map上面都是二元信息,分別表示ROI區域上面的某位置點是前景還是背景。

    mask分支(下面)

    注意:在training時將目標的gt mask resize到和mask 分支的output一致;在inference時則是反過來。

    4、模型訓練

    Mask RCNN生成的每個ROI如果最終與某個Ground truth box的IOU為0.5以上,那么就可視為一個positive box,若小于0.5則為negative box。最終每個image經RPN網絡生成出4*N個候選ROI,正負樣本的比例保持為1:3(以naive Resnet為主干網絡時,N為64;以FPN為主干網絡時,N為256)。

    Mask RCNN定義多任務損失:,前兩個損失與Faster RCNN一樣,而??需要特別說明。假設mask分割分支的輸出維度是𝐾×𝑀×𝑀,對于𝑀×𝑀個像素點,都會生成𝐾個二值輸出,計算loss的時候,該像素屬于哪個類,哪個類的sigmoid輸出才要計算損失(使用平均二值交叉熵損失):

    注意:在inference的時候,我們是通過分類分支預測的類別來選擇相應通道的mask預測,實現了分類和分割的解耦。

    8.7??DeepLab家族

    8.7.1??DeepLab V1

    DeepLab V1采用VGG16作為骨架,是在FCN的基礎上進行改進的,其主要有三個特色:

  • 在conv5處采用空洞卷積增加感受野;
  • 采用全連接CRF作為后處理,以改善分割邊界;
  • 通過兩種方式來進行多尺度的處理:
    • 將原始圖像的多種尺度喂給網絡進行訓練;
    • ?通過平行的不同空洞率的空洞卷積層來獲得。
  • Fully Connected CRF

    在最終的分割圖上,每個像素𝑖都有一個類別標簽𝑥𝑖和一個對應的觀測值𝑦𝑖,這樣在無向圖中每個像素點都成為某一個節點,若使用像素與像素之間的關系作為邊連接,這樣就組成了條件隨機場。最終目的就是使用觀測值𝑦𝑖來推測這個像素𝑖本來擁有的類別標簽𝑥𝑖,如下圖所示:

    全連接條件隨機場使用二元勢函數解釋了一個像素與另一個像素之間的關系,給像素關系緊密的兩個像素賦予相同的類別標簽,而關系相差很大的兩個像素會賦予不同的類別標簽,這個“關系”的判斷與像素的顏色值、像素間的相對距離都有關系。

    8.7.2??DeepLab V2

    DeepLab V2相較于V1作出了如下改進:

  • 將基礎網絡改成了ResNet;
  • 提出了atrous spatial pyramid pooling (ASPP),整合多尺度信息。
  • ASPP層就是為了融合不同級別的語義信息,其選擇了不同擴張率的帶孔卷積去處理輸入特征圖,由于感受野不同,得到的信息的級別也就不同,ASPP層把這些不同層級的特征圖concat到一起(rate越大padding越大,保持特征圖尺度一致),進行信息融合。

    8.7.3??DeepLab V3

    DeepLab V3在V2的基礎上作出了如下改動:

    1、改進了ASPP模塊(縱向結構)

    ASPP的改進主要包括兩點:

  • 在ASPP后面加入BN層;
  • ASPP中引入了1x1的卷積,以及一個全局平均池化:
  • 關鍵一:論文中解釋,當擴張率等于特征圖大小時,空洞卷積就退化成了1x1的卷積;

    關鍵二:在舊的ASPP中,我們以為在擴張率足夠大的時候,感受野足夠大,所以獲得的特征傾向于全局特征。但實際上,擴張率過大的情況下,Atrous conv出現了“權值退化”的問題,感受野過大,都已近擴展到了圖像外面,大多數的權重都和圖像外圍的zero padding進行了點乘,這樣并沒有獲取圖像中的信息。有效的權值個數很少,往往就是1。于是我們加了全局平均池化,再進行雙線性插值上采樣,強行利用全局信息。

    最后,將ASPP中的5個特征圖進行Concat,輸出Stride=16的特征圖。

    2、借鑒HDC思想,復用ResNet后面的Block(橫向結構)

    如下圖所示,復制conv4的結構3次,后面的每個block都有一個基準dilation Rat

    3、舍棄了全連接CRF

    8.7.4??DeepLab V3+

  • DeepLab V3+改進了網絡結構,可以看成是把Deeplab v3作為編碼器(上半部分),后面再進行解碼,并且在解碼的過程中在此運用了不同層級特征的融合。
  • 此外,在encoder部分加入了Xception的結構(深度可分離卷積)減少了參數量,提高運行速遞。
  • 8.8??注意力機制模型

    為了有效地完成場景分割的任務,我們需要更好的去區分一些容易被混淆的類別,例如草原與牧場有時候是很難區分的,公路上的車也存在尺度、視角、遮擋與亮度等的變化使之難以區分。

    現有解決方案

  • 利用多尺度上下文信息融合,結合不同的空洞卷積和池化操作;
  • 使用分解結構增大卷積核尺寸或在網絡頂部引入有效的編碼層,來捕獲更豐富的全局信息;
  • 編碼器-解碼器結構來融合中級和高級語義特征。
  • 使用RNN捕捉長程依賴關系,從而提高分割精度
  • 以上方法可以捕獲不同尺度的目標,但是它沒有利用到目標之間的關系。而如果是使用RNN,其有效性在很大程度上依賴于長期記憶的學習結果。

    8.8.1??Dual Attention Network

    為解決以上問題,提出了雙重注意力網絡(DANet),基于注意力機制來分別捕獲空間維度和通道維度中的特征依賴關系。具體而言,本文在dilated ResNet后附加了2種注意力模塊,分別對空間維度和通道維度上的語義依賴關系進行建模。

    • 采用 Dilated ResNet (DeepLab V2的主干網絡)作為主干,刪除了下采樣操作并在最后兩個ResNet塊中使用了空洞卷積,最終特征映射的大小是輸入圖像的1/8;
    • Dilated ResNet 產生的特征圖進行卷積降維再送入兩個平行的注意力模塊中;
    • 最后融合兩個注意力模塊的輸出特征,以獲得更好的特征表示。

    1、Position Attention Module

    PAM使用注意力機制捕獲特征圖在任意兩個位置之間的空間依賴關系,通過加權求和對所有位置的特征進行聚合更新,權重是由對應兩個位置的特征相似性決定的。因此,任何兩個現有相似特征的位置可以相互貢獻提升,而不管它們之間的距離。

  • 特征圖A(C×H×W)先分別通過3個卷積層得到3個特征圖B、C、D,然后將B、C、D reshape為C×N,其中N=H×W;
  • 隨后,將reshape后的B的轉置(NxC)與reshape后的C(CxN)相乘,再通過softmax得到Spatial Attention Map S(N×N);
  • 最后,將reshape后的D(CxN)與S(NxN)執行矩陣乘法,再乘以尺度系數α(α初始化為0,并逐漸的學習得到更大的權重),再reshape為原來形狀(C×H×W),最后與A逐像素相加得到最后的輸出E。
  • 以上操作如下式所示:

    從上式中可以看出,Spatial Attention Map S中聚合了各個像素之間的關系,特征圖E將所有位置與原始位置進行了加權聚合,因此它具有全局上下文視圖,并能根據空間注意力圖有選擇地聚合上下文。

    2、Channel Attention Module

    每個高層次特征的通道圖都可以看作是一個特定于類的響應,CAM通過挖掘通道圖之間的相互依賴關系,可以突出相互依賴的特征圖,提高特定語義的特征表示。

  • 分別對A做reshape(CxN)和reshape與transpose(NxC);
  • 將得到的兩個特征圖相乘,再通過softmax得到Channel Attention Map X(C×C);
  • 接著把X(CxC)與reshape的A(CxN)做矩陣乘法,再乘以尺度系數β(β初始化為0,并逐漸的學習得到更大的權重),再reshape為原來形狀,最后與A相加得到最后的輸出E。
  • 以上操作如下式所示:

    從上式中可以看出,Channel Attention Map X中,特征圖E將所有通道特征與原始特征進行了加權聚合,實現了對不同通道特征圖之間的長程語義依賴關系建模,有助于提高特征的辨別性。

    最后,將兩個注意力模塊的輸出先進行元素求和,再進行一次卷積生成最終預測圖。該注意力模塊很簡單,可以直接插入到現在的FCN中,而且它們不會增加太多參數,還能有效地增強特征表示。


    參考:

  • https://blog.csdn.net/chaipp0607/article/details/72847422

  • https://blog.csdn.net/briblue/article/details/83792394

  • https://blog.csdn.net/whz1861/article/details/78111606

  • https://blog.csdn.net/loveliuzz/article/details/79135583

  • https://blog.csdn.net/lanran2/article/details/79057994

  • https://blog.csdn.net/u014380165/article/details/75142710

  • https://blog.csdn.net/u014380165/article/details/75142664/

  • https://zhuanlan.zhihu.com/p/39702482

  • https://zhuanlan.zhihu.com/p/46710723

  • https://blog.csdn.net/qq_35451572/article/details/80273088

  • https://blog.csdn.net/zijin0802034/article/details/77685438

  • https://blog.csdn.net/lty_sky/article/details/90767956

  • https://blog.csdn.net/kk123k/article/details/86563425?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2

  • https://baijiahao.baidu.com/s?id=1619537209443232394&wfr=spider&for=pc

  • https://blog.csdn.net/liuxiaoheng1992/article/details/81983280

  • https://blog.csdn.net/shengyan5515/article/details/84036734

  • https://blog.csdn.net/ytusdc/article/details/86577939

  • https://blog.csdn.net/qq_35451572/article/details/80320708

  • https://zhuanlan.zhihu.com/p/137393450

  • https://blog.csdn.net/weixin_41560402/article/details/106119774

  • https://www.zhihu.com/question/399884529

  • https://zhuanlan.zhihu.com/p/37801090

  • https://zhuanlan.zhihu.com/p/37618829

  • https://blog.csdn.net/JianqiuChen/article/details/105332206?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

  • https://blog.csdn.net/py184473894/article/details/84205779

  • https://zhuanlan.zhihu.com/p/54510782

  • https://blog.csdn.net/wumenglu1018/article/details/95949039

  • https://zhuanlan.zhihu.com/p/59055363

  • https://zhuanlan.zhihu.com/p/37998710

  • ?

    總結

    以上是生活随笔為你收集整理的深度学习简明教程系列 —— 经典模型(合集)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。