Pytorch 目標檢測學習 Day 2
1.網路骨架:Backbone
當前的物體檢測演算法雖然各不相同,但第一步通常是利用卷積神經網路處理輸入影像,生成深層的特徵圖,然後再利用各種演算法完成區域生成與損失計算,這部分卷積神經網路是整個檢測演算法的“骨架”,也被稱為Backbone。
常用骨架:VGGNet :走向深度,Inception:縱橫交錯,ResNet:殘差結構
DenseNet:多重殘差,FPN:特徵金字塔,DetNet:專為檢測。
2.神經網路基本組成
物體檢測演算法使用的通常是包含卷積計算且具有深度結構的前饋神經網路,如卷積層、池化層、全連線層等不同的基本層,這些層有著不同的作用。
當然啟用層對於Sigmoidbingbuc並不常用,較為常用的為ReLU()
2.1 卷積運算
一個基本二維卷積的運算過程,公式為y=ωx+b。這裡的特徵圖(x)大小為1×5×5,即輸入通道數為1,卷積核(ω)的大小為3×3,偏置(b)為1,為保證輸出維度和輸入特徵維度一致,還需要有填充(padding),這裡使用zero-padding,即用0來填充。
通過用Pytorch 進行卷積程式碼編寫
torch.nn.Conv2d()來說,傳入引數含義如下
in_channels:輸入特徵圖的通道數,如果是RGB影像,則通道數為3。卷積中的特徵圖通道數一般是2的整數次冪。
out_channels:輸出特徵圖的通道數。
stride:步長,即卷積核在特徵圖上滑動的步長,一般為1。如果大於1,則輸出特徵圖的尺寸會小於輸入特徵圖的尺寸
padding:填充,常見的有零填充、邊緣填充等,PyTorch預設為零填充。
dilation:空洞卷積,當大於1時可以增大感受野的同時保持特徵圖的尺寸(後面會細講),預設為1。
groups:可實現組卷積,即在卷積操作時不是逐點卷積,而是將輸入通道分為多個組,稀疏連線達到降低計算量的目的(後續會細講),預設為1。
bias:是否需要偏置,預設為True。
在實際使用中,特徵圖的維度通常都不是1,假設輸入特徵圖維度為m×win×hin,輸出特徵圖維度為n×wout×hout,則卷積核的維度為n×m×k×k,在此產生的乘法操作次數為n×wout×hout×m×k×k。(計算複雜度)
2.2啟用函式層
神經網路如果僅僅是由線性的卷積運算堆疊組成,則其無法形成複雜的表達空間,也就很難提取出高語義的資訊,因此還需要加入非線性的對映,又稱為啟用函式,可以逼近任意的非線性函式,以提升整個神經網路的表達能力。在物體檢測任務中,常用的啟用函式有Sigmoid、ReLU及Softmax函式。
1.ReLU函式
為了緩解梯度消失現象,修正線性單元(Rectified LinearUnit, ReLU)被引入到神經網路中。由於其優越的效能與簡單優雅的實現,ReLU已經成為目前卷積神經網路中最為常用的啟用函式之一。ReLU函式的表示式如式(3-2)所示。[插圖]ReLU函式及其梯度曲線如圖3.5所示。可以看出,在小於0的部分,值與梯度皆為0,而在大於0的部分中導數保持為1,避免了Sigmoid函式中梯度接近於0導致的梯度消失問題。
2.Softmax 函式
多物體類別較為常用的分類器是Softmax函式
在具體的分類任務中,Softmax函式的輸入往往是多個類別的得分,輸出則是每一個類別對應的概率,所有類別的概率取值都在0~1之間,且和為1。Softmax函式的表達如式(3-4)所示,其中,Vi表示第i個類別的得分,C代表分類的類別總數,輸出Si為第i個類別的概率
3.池化層
在卷積網路中,通常會在卷積層之間增加池化(Pooling)層,以降低特徵圖的引數量,提升計算速度,增加感受野,是一種降取樣操作。池化是一種較強的先驗,可以使模型更關注全域性特徵而非區域性出現的位置,這種降維的過程可以保留一些重要的特徵資訊,提升容錯能力,並且還能在一定程度上起到防止過擬合的作用。
在物體檢測中,常用的池化有最大值池化(Max Pooling)與平均值池化(Average Pooling)。池化層有兩個主要的輸入引數,即核尺寸kernel_size與步長stride。如圖3.7所示為一個核尺寸與步長都為2的最大值池化過程,以左上角為例,9、20、15與26進行最大值池化,保留26。
4.Dropout層
Dropout的基本思想如圖3.8所示,在訓練時,每個神經元以概率p保留,即以1-p的概率停止工作,每次前向傳播保留下來的神經元都不同,這樣可以使得模型不太依賴於某些區域性特徵,泛化效能更強。
在測試時,為了保證相同的輸出期望值,每個引數還要乘以p。當然還有另外一種計算方式稱為Inverted Dropout,即在訓練時將保留下的神經元乘以1/p,這樣測試時就不需要再改變權重。
為什麼Dropout可以防止過擬合,
1.多模型的平均:不同的固定神經網路會有不同的過擬合,多個取平均則有可能讓一些相反的擬合抵消掉,而Dropout每次都是不同的神經元失活,可以看做是多個模型的平均,類似於多數投票取勝的策略。
2.減少神經元間的依賴:由於兩個神經元不一定同時有效,因此減少了特徵之間的依賴,迫使網路學習有更為魯棒的特徵,因為神經網路不應該對特定的特徵敏感,而應該從眾多特徵中學習更為共同的規律,這也起到了正則化的效果。
3.生物進化:Dropout類似於性別在生物進化中的角色,物種為了適應環境變化,在繁衍時取雄性和雌性的各一半基因進行組合,這樣可以適應更復雜的新環境,避免了單一基因的過擬合,當環境發生變化時也不至於滅絕。
5.BN層
BN層首先對每一個batch的輸入特徵進行白化操作,即去均值方差過程。假設一個batch的輸入資料為x:B={x1, …,xm},首先求該batch資料的均值與方差,如式(3-5)和式(3-6)所示。
為批處理資料的方差。在求得均值方差後,利用式(3-7)進行去均值方差操作:
化操作可以使輸入的特徵分佈具有相同的均值與方差,固定了每一層的輸入分佈,從而加速網路的收斂。
但也限制了網路中資料的表達能力,淺層學到的引數資訊會被白化操作遮蔽掉,因此,BN層在白化操作後又增加了一個線性變換操作,讓資料儘可能地恢復本身的表達能力
- ·由於是在batch的維度進行歸一化,BN層要求較大的batch才能有效地工作,而物體檢測等任務由於佔用記憶體較高,限制了batch的大小,這會限制BN層有效地發揮歸一化功能。
- ·資料的batch大小在訓練與測試時往往不一樣。在訓練時一般採用滑動來計算平均值與方差,在測試時直接拿訓練集的平均值與方差來使用。這種方式會導致測試集依賴於訓練集,然而有時訓練集與測試集的資料分佈並不一致。
6.全連線層
全連線層(Fully Connected Layers)一般連線到卷積網路輸出的特徵圖後邊,特點是每一個節點都與上下層的所有節點相連,輸入與輸出都被延展成一維向量,因此從引數量來看全連線層的引數量是最多的,
在物體檢測演算法中,卷積網路的主要作用是從區域性到整體地提取影像的特徵,而全連線層則用來將卷積抽象出的特徵圖進一步對映到特定維度的標籤空間,以求取損失或者輸出預測結果。
點缺:
全連線層的缺點也逐漸暴露了出來,最致命的問題在於其引數量的龐大
解決方案:
我們可以使用全域性平均池化層(Global AveragePooling,GAP)來取代全連線層,這種思想最早見於NIN(Network in Network)網路中,總體上,使用GAP有如下3點好處:
- ·利用池化實現了降維,極大地減少了網路的引數量。
- ·將特徵提取與分類合二為一,一定程度上可以防止過擬合。
- ·由於去除了全連線層,可以實現任意影像尺度的輸入。
7.深入理解感受野(FPN)
感受野(Receptive Field)是指特徵圖上的某個點能看到的輸入影像的區域,即特徵圖上的點是由輸入影像中感受野大小區域的計算得到的。
舉個簡單的例子,如圖3.10所示為一個三層卷積網路,每一層的卷積核為3×3,步長為1,可以看到第一層對應的感受野是3×3,第二層是5×5,第三層則是7×7。
可以形象說明:為什麼後來的卷積都用3*3核代替5*5或者7*7的卷積核
卷積層和池化層都會影響感受野,而啟用函式層通常對於感受野沒有影響。對於一般的卷積神經網路,感受野。
其中,RFl+1與RFl分別代表第l+1層與第l層的感受野,k代表第l+1層卷積核的大小,Sl代表前l層的步長之積。注意,當前層的步長並不影響當前層的感受野。
通過上述公式求取出的感受野通常很大,而實際的有效感受野(Effective Receptive Field)往往小於理論感受野。從上圖也可以看出,雖然第三層的感受野是7×7,但是輸入層中邊緣點的使用次數明顯比中間點要少,因此做出的貢獻不同。經過多層的卷積堆疊之後,輸入層對於特徵圖點做出的貢獻分佈呈高斯分佈形狀。
在卷積網路中,有時還需要計算特徵圖的大小,一般可以按照下圖進行計算。
其中,nin與nout分別為輸入特徵圖與輸出特徵圖的尺寸,p代表這一層的padding大小,k代表這一層的卷積核大小,s為步長。
8.詳解空洞卷積(Dilated Convolution)
空洞卷積最初是為解決影像分割的問題而提出的。常見的影像分割演算法通常使用池化層來增大感受野,同時也縮小了特徵圖尺寸,然後再利用上取樣還原影像尺寸。特徵圖縮小再放大的過程造成了精度上的損失,因此需要有一種操作可以在增加感受野的同時保持特徵圖的尺寸不變,從而替代池化與上取樣操作,在這種需求下,空洞卷積就誕生了。
空洞卷積,顧名思義就是卷積核中間帶有一些洞,跳過一些元素進行卷積。
圖3.11a是普通的卷積過程,在卷積核緊密排列在特徵圖上滑動計算,而圖3.11b代表了空洞數為2的空洞卷積,可以看到,在特徵圖上每2行或者2列選取元素與卷積核卷積。類似地,圖3.11c代表了空洞數為3的空洞卷積。
圖3.11 普通卷積與空洞卷積的對比
在程式碼實現時,空洞卷積有一個額外的超引數dilationrate,表示空洞數,普通卷積dilation rate預設為1,圖3.11中的b與c的dilation rate分別為2與3。
在圖3.11中,同樣的一個3×3卷積,卻可以起到5×5、7×7等卷積的效果。可以看出,空洞卷積在不增加引數量的前提下,增大了感受野。假設空洞卷積的卷積核大小為k,空洞數為d,則其等效卷積核大小k’計算如式(3-12)所示。
缺點:
- ·網格效應(Gridding Effect):由於空洞卷積是一種稀疏的取樣方式,當多個空洞卷積疊加時,有些畫素根本沒有被利用到,會損失資訊的連續性與相關性,進而影響分割、檢測等要求較高的任務。
- ·遠距離的資訊沒有相關性:空洞卷積採取了稀疏的取樣方式,導致遠距離卷積得到的結果之間缺乏相關性,進而影響分類的結果。
- ·不同尺度物體的關係:大的dilation rate對於大物體分割與檢測有利,但是對於小物體則有弊無利,如何處理好多尺度問題的檢測,是空洞卷積設計的重點。
相關文章
- 深度學習之目標檢測深度學習
- 深度學習之目標檢測與目標識別深度學習
- 目標檢測演算法學習演算法
- 深度學習目標檢測(object detection)系列(六)YOLO2深度學習ObjectYOLO
- 52 個深度學習目標檢測模型深度學習模型
- 深度學習之影像目標檢測速覽深度學習
- 目標檢測
- Facebook 釋出 Detectron2:基於 PyTorch 的新一代目標檢測工具PyTorch
- 目標檢測(2):LeNet-5 的 PyTorch 復現(MNIST 手寫資料集篇)PyTorch
- 2018目標檢測
- 九、目標檢測
- 深度學習目標檢測(object detection)系列(一) R-CNN深度學習ObjectCNN
- 深度學習“吃雞外掛”——目標檢測 SSD 實驗深度學習
- 深度學習目標檢測(object detection)系列(五) R-FCN深度學習Object
- 深入學習OpenCV檢測及分割影象的目標區域OpenCV
- 深度學習與CV教程(13) | 目標檢測 (SSD,YOLO系列)深度學習YOLO
- 【深度學習】檢測CUDA、cuDNN、Pytorch是否可用深度學習DNNPyTorch
- 目標檢測之SSD
- 目標檢測之RetinaNetNaN
- 目標檢測面面觀
- 28-目標檢測
- 目標檢測綜述
- 基於OpenCV和YOLOv3深度學習的目標檢測OpenCVYOLO深度學習
- 深度學習目標檢測(object detection)系列(四) Faster R-CNN深度學習ObjectASTCNN
- 目標檢測:二維碼檢測方案
- 2D目標檢測綜述 2020 CVPR ECCV
- 目標檢測---教你利用yolov5訓練自己的目標檢測模型YOLO模型
- pytorch實現yolov3(5) 實現端到端的目標檢測PyTorchYOLO
- 從零開始PyTorch專案:YOLO v3目標檢測實現PyTorchYOLO
- 基於pytorch的目標檢測資料增強(tensor資料流版本)PyTorch
- 目標檢測之YOLO系列YOLO
- 【目標檢測】Bounding Box Regression
- 目標檢測發展方向
- SSD 目標檢測 Keras 版Keras
- 【目標檢測】R-CNNCNN
- 做目標檢測,這一篇就夠了!2019最全目標檢測指南
- 基於深度學習的計算機視覺應用之目標檢測深度學習計算機視覺
- 《基於深度學習的目標檢測綜述》論文獲發表深度學習