【目標檢測系列】CNN中的目標多尺度處理方法

2021-02-26 深度學習技術前沿

關註上方深度學習技術前沿,選擇「星標公眾號」

技術乾貨,第一時間送達!

【導讀】本篇博文我們一起來討論總結一下目標檢測任務中用來處理目標多尺度的一些算法。視覺任務中處理目標多尺度主要分為兩大類:

圖像金字塔:經典的基於簡單矩形特徵(Haar)+級聯Adaboost與Hog特徵+SVM的DPM目標識別框架,均使用圖像金字塔的方式處理多尺度目標,早期的CNN目標識別框架同樣採用該方式,在image pyramid中,我們直接對圖像進行不同尺度的縮放,然後將這些圖像直接輸入到detector中去進行檢測。雖然這樣的方法十分簡單,但其效果仍然是最佳。特別地,隨著圖像金字塔尺度歸一化(SNIP)的出現,解決了小目標和大目標在小尺度和大尺度下難以識別的問題。而且SNIP在COCO數據集上,AP最高可以達到48.3%,並且贏得了COCO2017挑戰賽的「Best Student Entry」。基於SNIP後續便衍生出了一系列基於圖像金字塔的多尺度處理。

特徵金字塔:最具代表性的工作便是經典的FPN了,FPN網絡通過將不同層的優勢結合,使得每一層相比原來都有更豐富的語義特徵和解析度信息。這一類方法的思想是直接在feature層面上來近似image pyramid。

目標檢測中存在不同目標實例之間的尺度跨度非常大,在多尺度的物體中,大尺度的物體由於面積大、特徵豐富,通常來講較為容易檢測。難度較大的主要是小尺度的物體,而這部分小物體在實際工程中卻佔據了較大的比例。通常認為絕對尺寸小於32×32的物體,可以視為小物體或者物體寬高是原圖寬高的1/10以下,可以視為小物體。

 

小物體由於其尺寸較小,可利用的特徵有限,這使得其檢測較為困難。當前的檢測算法對於小物體並不友好,體現在以下4個方面:

 

多尺度的檢測能力實際上體現了尺度的不變性,當前的卷積網絡能夠檢測多種尺度的物體,很大程度上是由於其本身具有超強的擬合能力。

較為通用的提升多尺度檢測的經典方法有:

降低下採樣率與空洞卷積可以顯著提升小物體的檢測性能;

設計更好的Anchor可以有效提升Proposal的質量;

多尺度的訓練可以近似構建出圖像金字塔,增加樣本的多樣性;

特徵融合可以構建出特徵金字塔,將淺層與深層特徵的優勢互補。

接下來,我們主要將主要介紹U-shape/V-shape型多尺度處理、SNIP、TridentNet、FPN這四大多尺度解決方法。


這種方式有點類似U-Net的結構,通過採用對稱的encoder-decoder結構,將高層特徵逐漸與低層特徵融合,這樣的操作類似於將多個感受野進行混合,使得輸出的多尺度信息更為豐富;Face++團隊在2018年COCO比賽上,在backbone最後加入gpooling操作,獲得理論上最大的感受野,類似於V-shape結構,結果證明確實有效。該方法雖然比SSD的單層輸出多尺度信息相比更好,但其也存在問題:

motivation和創新點用ImageNet預訓練的模型在遷移到COCO數據集中時很可能產生一定的domain-shift偏差,什麼是domain-shift呢?簡單來說,ImageNet 是用來圖像分類的,目標一般 scale 比較大,而 object detection 數據集中的目標的 scale 跨度很大。在 ImageNet 這種大目標數據集上 預訓練的特徵,如果直接用在檢測那些小目標,這些特徵是不能很好地匹配和對齊的,效果並不會很好,這就是 domain-shift 造成的。這篇論文首先分析了小尺度與預訓練模型尺度之間的關係,作者認為要解決domian-shift問題,就要讓輸入分布接近模型預訓練的分布,基於圖像金字塔,提出了一種尺度歸一化的訓練機制,稱為SNIP(Scale-Normalization for Image Pyramids)。

該論文的主要貢獻在於:

(1)通過實驗驗證了upsampling對提高小目標檢測的效果

(2)提出了一種Scale Normalization for Image Pyramids的方法

(3)提出一個思想:即要讓輸入的分布接近預訓練模型的分布

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

具體的設計和實現細節:

(1)3個尺度分別擁有各自的RPN模塊,並且各自預測指定範圍內的物體。最後不同分支的proposal進行匯總。

(2)由於圖像金字塔的應用,對於大尺度(高解析度)的feature map,對應的RPN只負責預測被放大的小目標;對於小尺度(低解析度)的feature map,對應的RPN只負責預測被縮小的大目標。這樣真實的物體尺度分布在較小的區間內,避免了極大或者極小的物體。

(3)在RPN階段,如果真實物體不在該RPN預測範圍內,會被判定為無效,並且與該無效物體的IoU大於0.3的Anchor也被判定為無效的Anchor。

(4)在訓練時,只對有效的Proposal進行反向傳播。在測試階段,對有效的預測Boxes先縮放到原圖尺度,利用Soft NMS將不同解析度的預測結果合併。

(5)實現時SNIP採用了可變形卷積的卷積方式,並且為了降低對於GPU的佔用,將原圖隨機裁剪為1000×1000大小的圖像。

總體來說,SNIP是多尺度訓練(Multi-Scale Training)的改進版本。SNIP讓模型更專注於物體本身的檢測,剝離了多尺度的學習難題。在網絡搭建時,SNIP也使用了類似於MST的多尺度訓練方法,構建了3個尺度的圖像金字塔。MST的思想是使用隨機採樣的多解析度圖像使檢測器具有尺度不變特性。然而作者通過實驗發現,在MST中,對於極大目標和過小目標的檢測效果並不好,但是MST也有一些優點,比如對一張圖片會有幾種不同解析度,每個目標在訓練時都會有幾個不同的尺寸,那麼總有一個尺寸在指定的尺寸範圍內。SNIP的做法是只對size在指定範圍內的目標回傳損失,即訓練過程實際上只是針對某些特定目標進行,這樣就能減少domain-shift帶來的影響。


motivation和創新點對於一個detector本身而言,影響backbone的主要有以下三個因素:network depth(structure),downsample rate和receptive field。對於網絡深度而言,ResNet證明了一般網絡越深(網絡的表達能力就越強),相應的結果會越好。下採用率方面,由於下採樣次數過多對於小物體有負面影響。那麼有沒有可能單獨分離出receptive field,保持其他變量不變,來驗證它對detector性能的影響。所以,該論文做了一個驗證性實驗,分別使用ResNet50和ResNet101作為backbone,改變最後一個stage中每個3*3 conv的dilation rate。通過這樣的方法,我們便可以固定同樣的網絡結構,同樣的參數量以及同樣的downsample rate,只改變網絡的receptive field。我們很驚奇地發現,不同尺度物體的檢測性能和dilation rate正相關!也就是說,更大的receptive field對於大物體性能會更好,更小的receptive field對於小物體更加友好。

總結一下,TridentNet主要在原始的backbone上做了以下三點變化:

TridentNet網絡結構

論文中還做了非常詳盡的ablation analyses,包括有幾個branch性能最好;trident block應該加在網絡的哪個stage;trident block加多少個性能會飽和。這些就不展開在這裡介紹了,有興趣的讀者可以參照原文。



FPN將深層信息上採樣,與淺層信息逐元素地相加,從而構建了尺寸不同的特徵金字塔結構,性能優越,FPN如今已成為Detecton算法的標準組件,不管是one-stage(RetinaNet、DSSD)、two-stage(Faster R-CNN、Mask R-CNN)還是four-stage(Cascade R-CNN)都可用;

如下圖所示,FPN把低解析度、高語義信息的高層特徵和高解析度、低語義信息的低層特徵進行自上而下的側邊連接,使得所有尺度下的特徵都有豐富的語義信息。

                                                   

     算法結構可以分為三個部分:自下而上的卷積神經網絡(上圖左),自上而下過程(上圖右)和特徵與特徵之間的側邊連接。

自下而上:最左側為卷積神經網絡的前向過程,這裡默認使用ResNet結構,用作提取語義信息。在前向過程中,特徵圖的大小在經過某些層後會改變,而在經過其他一些層的時候不會改變,作者將不改變特徵圖大小的層歸為一個階段,因此每次抽取的特徵都是每個階段的最後一個層的輸出,這樣就能構成特徵金字塔。具體來說,對於ResNets,作者使用了每個階段的最後一個殘差結構的特徵激活輸出。將這些殘差模塊輸出表示為{C2, C3, C4, C5},對應於conv2,conv3,conv4和conv5的輸出。

 

 

FPN對於不同大小的RoI,使用不同的特徵圖,大尺度的RoI在深層的特徵圖上進行提取,小尺度的RoI在淺層的特徵圖上進行提取。FPN的代碼實現如下:


# Build the shared convolutional layers.
# Bottom-up Layers
# Returns a list of the last layers of each stage, 5 in total.
# 扔掉了C1
_, C2, C3, C4, C5 = resnet_graph(input_image, "resnet101", stage5=True)
# Top-down Layers
# TODO: add assert to varify feature map sizes match what's in config
P5 = KL.Conv2D(256, (1, 1), name='fpn_c5p5')(C5) # C5卷積一下就當做P5
P4 = KL.Add(name="fpn_p4add")([ # P4 開始有了對應元素add操作
    KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),
    KL.Conv2D(256, (1, 1), name='fpn_c4p4')(C4)])
P3 = KL.Add(name="fpn_p3add")([
    KL.UpSampling2D(size=(2, 2), name="fpn_p4upsampled")(P4),
    KL.Conv2D(256, (1, 1), name='fpn_c3p3')(C3)])
P2 = KL.Add(name="fpn_p2add")([
    KL.UpSampling2D(size=(2, 2), name="fpn_p3upsampled")(P3),
    KL.Conv2D(256, (1, 1), name='fpn_c2p2')(C2)])

# Attach 3x3 conv to all P layers to get the final feature maps.
P2 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p2")(P2)
P3 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p3")(P3)
P4 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p4")(P4)
P5 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p5")(P5)
# P6 is used for the 5th anchor scale in RPN. Generated by
# subsampling from P5 with stride of 2.
# P6是P5的極大值池化
P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2, name="fpn_p6")(P5)
# Note that P6 is used in RPN, but not in the classifier heads.
rpn_feature_maps = [P2, P3, P4, P5, P6]
mrcnn_feature_maps = [P2, P3, P4, P5]

優缺點分析:

底層feature map位置信息多但語義信息少,FPN為其增強了語義信息,提升了對小物體的檢測效果;

提升檢測精度,包括加強對小物體的檢測效果和對大物體的檢測效果。一般來說,頂層feature map是檢測大物體的關鍵,因為容易框出大物體;底層feature map是檢測小物體的關鍵,因為容易框出小物體;

FPN只是給底層featue map提供了福利,所以僅僅提升了對小物體的檢測效果;

頂層feature map語義信息多但位置信息少,還是對檢測大物體不利。後來者PAN在FPN的基礎上再加了一個bottom-up方向的增強,使得頂層feature map也可以享受到底層帶來的豐富的位置信息,從而把大物體的檢測效果也提上去了。

參考連結:

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

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

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

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

https://blog.csdn.net/weixin_40683960/article/details/79055537

重磅!DLer-目標檢測交流群已成立!

為了能給大家提供一個更好的交流學習平臺!針對特定研究方向,我建立了目標檢測微信交流群,目前群裡已有百餘人!本群旨在交流目標檢測、密集人群檢測、關鍵點檢測、人臉檢測、人體姿態估計等內容。

進群請備註:研究方向+地點+學校/公司+暱稱(如目標檢測+上海+上交+小明


👆 長按識別添加,邀請您進群!

原創不易,在看鼓勵!比心喲!

相關焦點

  • [Pytorch]教程-使用 PyTorch 進行 Faster R-CNN 目標檢測
    在目標檢測中,我們不僅對輸入的圖像中存在的目標對象感興趣,而且也對目標在輸入圖像中的位置感興趣。故而,從某種意義上,目標檢測的範疇超越了圖像分類。如上圖所示,分別展示了圖像分類與目標檢測的區別。1.1. 圖像分類與目標檢測:選哪個?
  • 經典神經網絡 | fast rcnn目標檢測算法詳解
    針對上述這些問題,本篇論文作者提出了fast rcnn網絡,可以解決R-CNN和SPPnet的缺點,同時提高其速度和準確性。fast rcnn具有以下優點:1、高精度檢測,訓練是單步訓練,而loss是multi-task loss。
  • YOLO 系列目標檢測算法介紹
    借鑑了 Faster R-CNN 中的 anchor 機制,即在卷積特徵圖上採用滑動窗口法採樣,並且採用 K-means 聚類方法尋找最具代表性的 anchor,大大提高了模型的召回率。在每個卷積層都添加了 BN(Batch Normalization)層,這樣網絡每一層的輸入都做了歸一化處理,規範了網絡模型,提高了收斂速度。
  • 科研成果 |【AAAI-20】FAS-Net:面向多尺度目標檢測的自適應特徵選擇模塊
    隨著亞米級解析度遙感圖像的廣泛應用以及高清顯示技術的快速發展,圖像質量不斷被提高,場景中原本不可辨識的小物體也可以被檢測到。因此,多尺度目標檢測問題需要得到進一步的分析與研究。現階段,通常使用FPN結構來解決多尺度目標檢測問題,如上圖所示。
  • 詳細解讀TPH-YOLOv5 | 讓目標檢測任務中的小目標無處遁形
    本文的貢獻如下:· 增加了一個預測頭來處理目標的大尺度方差;· 將Transformer Prediction Heads (TPH)集成到YOLOv5中,可以在高密度場景中準確定位目標;· 將CBAM集成到YOLOv5中,幫助網絡在區域覆蓋範圍大的圖像中找到感興趣的區域;· 提供有用的Tricks,並過濾一些無用的
  • DETR目標檢測新範式帶來的思考
    其次,在目標檢測中每個object query可以看作是一種可學習的動態anchor,可以發現,不同於Faster RCNN, RetinaNet等方法在特徵的每個像素上構建稠密的anchor不同,detr只用少量稀疏的anchor(object queries)做預測,這也啟發了後續的一系列工作[4]。
  • 目標檢測:Anchor-Free時代
    採訪中說道,當年DenseBox其實早在2015年初就已經開發出來了,這比同期的Faster-RCNN系列提前數月,但是論文直到9月才在arxiv上發布。如果DenseBox能在2015年初就發表,那麼最近幾年目標檢測的發展會不會是另外一番景象呢~~https://zhuanlan.zhihu.com/p/24350950兩點貢獻:1.證明單個FCN可以檢測出遮擋嚴重、不同尺度的目標。2.通過多任務引入landmark localization,能進一步提升性能。
  • 一種輕量級在線多目標車輛跟蹤方法
    卷積神經網絡( CNN )在運行時間和檢測精度方面的性能增強創造了「檢測跟蹤」範例[ 3 ]–[ 5 ]。提供更高精度和更低數量的假陰性的網絡需要嵌入更多的複雜性,需要調整大量的參數和更多的處理要求[ 6 ]。鑑於自動駕駛[7],[8]中使用的定位,目標檢測、傳感器融合、佔用網格更新、軌跡規劃、動態建模和控制等任務,廣泛使用都需要計算效率高且準確的解決方案。
  • 基於深度學習的目標檢測算法研究進展
    Mask R-­CNN是一個靈活的模型,可應用於檢測、分割以及識別等多種任務。之後大量的二階段方法在網絡結構的改進方面都圍繞著R-­CNN框架,而MR­CNN、HyperNe、CRAFT等方法都是在圍繞R­CNN的特徵層和分類器做調整。A-­Fast ­R-CNN加入對抗學習,增加識別的泛化能力。Light ­Head R-­CNN針對檢測速度慢設計了一種全新的結構。
  • 小目標檢測:數據增強
    小目標檢測是目標檢測中必不可少且具有挑戰性的問題,在人臉檢測、交通標記、缺陷檢測等領域都是其重要挑戰。緩解小目標檢測問題的方法有很多,例如:多尺度特徵學習,數據增強,訓練策略,基於上下文的檢測和基於GAN的檢測等,今天我們介紹一篇通過改進數據擴增方式提升小目標檢測的準確率。
  • 基於卷積神經網絡的遙感圖像目標檢測與識別
    ,它們是遙感圖像處理領域長期以來關注的問題。卷積神經網絡CNN(Convolutional Neural Network)憑藉其包含的深層語義特徵在計算機視覺領域取得了巨大的成功,近年來也越來越多的被應用到遙感圖像目標檢測與識別任務中。
  • NeurIPS2021-《YOLOS》-ViT現在可以做目標檢測任務啦!華科提出目標檢測新方法YOLOS
    (NLP) 中,目前主流的方法是先在大型通用語料庫上進行預訓練Transformer以進行通用語言表示學習,然後在特定目標任務上對模型進行優化。由於預訓練的Transformer可以在NLP中的句子級任務以及token級任務上進行微調,因此,作者提出了一個問題:ViT能否也遷移到計算機視覺中更複雜的任務中,例如目標檢測?ViT對遠程依賴關係和全局上下文信息進行建模,而不是對局部和區域級別的關係進行建模。此外,ViT缺乏像CNN那樣的分層結構來處理視覺實體規模的變化。
  • 目標檢測經典工作:RetinaNet和它背後的Focal Loss
    類別不平衡(class imbalance)是目標檢測模型訓練的一大難點(推薦這篇綜述文章Imbalance Problems in Object Detection: A Review),其中最嚴重的是正負樣本不平衡,因為一張圖像的物體一般較少,而目前大部分的目標檢測模型在FCN
  • 目標檢測|YOLOv2原理與實現(附YOLOv3)
    所以,YOLOv2棄用了這種預測方式,而是沿用YOLOv1的方法,就是預測邊界框中心點相對於對應cell左上角位置的相對偏移值,為了將邊界框中心點約束在當前cell中,使用sigmoid函數處理偏移值,這樣預測的偏移值在(0,1)範圍內(每個cell的尺度看做1)。總結來看,根據邊界框預測的4個offsets
  • 教程 | 如何使用Docker、TensorFlow目標檢測API和OpenCV實現實時目標檢測和視頻處理
    TensorFlow 目標檢測 API,通過網絡攝像頭執行實時目標檢測,同時進行視頻後處理。為了進一步加強項目的可移植性,我試著將自己的項目整合到 Docker 容器中。這一過程的主要困難在於處理流入和流出容器的視頻流。此外,我還在項目中添加了視頻後處理功能,這一功能也使用了多進程,以減少視頻處理的時間(如果使用原始的 TensorFlow 目標檢測 API 處理視頻,會需要非常非常長的時間)。
  • NAS在目標檢測中的應用:6篇相關論文對比解讀
    對於detector,不管是anchor和anchor free的檢測方法,主要有以下4個components:Backbone:常見的backbone網絡有ResNet,ResNeXt等,輕量級的有mobilenet、shufflenet、efficientnet等等,通常需要在ImageNet上進行預訓練,但近來一些paper指出
  • ECCV2020 | DDBNet:目標檢測中的Box優化
    在目標檢測領域,儘管anchor-free方法取得了成功,但應注意的是,這些方法在準確性方面仍存在局限性,其局限性在於其以atomic fashion方式學習邊界框的方式。因此,anchor-free方法的存在兩個問題:首先,中心關鍵點的定義與其語義不一致。
  • 1.8M超輕量目標檢測模型NanoDet,比YOLO跑得快,上線兩天Star量超200
    這個項目對單階段檢測模型三大模塊(Head、Neck、Backbone)進行輕量化,得到模型大小僅 1.8m、速度超快的輕量級模型 NanoDet-m。目標檢測一直是計算機視覺領域的一大難題,其目標是找出圖像中的所有感興趣區域,並確定這些區域的位置和類別。目標檢測中的深度學習方法已經發展了很多年,並出現了不同類型的檢測方法。
  • 【目標檢測】Focal Loss 論文詳解
    論文:Focal Loss for Dense Object DetectionIntroduction  目前 state-of-the-art 的目標檢測算法大都是 two-stage、proposal-driven 的網絡,如 R-CNN 架構。
  • 1.8M 超輕量目標檢測模型 NanoDet,比 YOLO 跑得快,上線兩天 Star 量超 200
    目標檢測一直是計算機視覺領域的一大難題,其目標是找出圖像中的所有感興趣區域,並確定這些區域的位置和類別。目標檢測中的深度學習方法已經發展了很多年,並出現了不同類型的檢測方法。目前,深度學習目標檢測方法主要分為兩大類,分別是兩階段式和單階段式目標檢測算法。兩階段式目標檢測框架首先生成候選區域,然後將其分類成不同的目標類別,代表模型有 R-CNN、Fast R-CNN 等;單階段式目標檢測框架將目標檢測任務視為一個統一的端到端回歸問題,代表模型有 MultiBox、YOLO、SSD 等。這類框架通常結構更簡單,檢測速度也更快。