小目標檢測技術分析


小目標檢測技術分析

小目標檢測及跟蹤系統分為四個模塊:

· 硬件模塊

  該模塊基於標准PCI總線,並配以超大規模可編程芯片(DSP、FPGA),具有極強的運算、處理能力。

· DSP 程序模塊

  其功能主要實現復雜背景下的小目標檢測、跟蹤。考慮到系統的實時性要求,復雜背景下的小目標檢測采用紅外能量積累技術。首先對紅外圖像進行增強;然后在對小目標進行粗檢測;最后在視頻序列上分割提取小目標。同時,采用預測技術對目標的可能位置和存在區域進行估計,以實現實時、准確跟蹤(或記憶)目標。系統按照搜索、捕獲、跟蹤、記憶跟蹤四個狀態及其轉換運行,以實現小目標的實時檢測與跟蹤。

· 驅動程序模塊

  其主要功能是實現硬件模塊與上層應用程序進行數據通信與信息交互。系統采用了PCI 9054 Target 方式的單周期讀/寫;在圖像數據傳送的時候為了滿足每秒25幀圖像的實時傳送和處理的要求,采用了PCI 9054的Scatter/Gather DMA方式的數據傳輸。在整個系統的信息交互中,采用了一次握手協議,也就是請求—應答協議。

 · 上層應用程序模塊

該模塊主要功能是向硬件模塊下載DSP跟蹤程序,啟動/停止DSP,實時顯示場景視頻,對運動目標序列進行實時存儲,對運動目標序列的基本特性進行實時分析和結果顯示。

 

 

 目標檢測(object detection),就是在給定的一張圖片中精確找到物體所在的位置,並標注出物體的類別。所以,目標檢測要解決的問題就是物體在哪里以及是什么的整個流程問題。但是,在實際照片中,物體的尺寸變化范圍很大,擺放物體的角度、姿態、在圖片中的位置都不一樣,物體之間可能還有重疊現象,這使得目標檢測的難度變得很大。

目標檢測近些年取得了較大發展,主要原因就是卷積神經網絡在目標檢測任務的應用代替了原有的基於人工規則提取特征的方法。

 

 

 

 

 

  • 傳統的目標檢測算法:
    Cascade + HOG/DPM + Haar/SVM以及上述方法的諸多改進、優化。
    傳統的目標檢測中,多尺度形變部件模型DPM(Deformable Part Model)表現比較優秀,連續獲得VOC(Visual Object Class)2007到2009的檢測冠軍,。DPM把物體看成了多個組成的部件(比如人臉的鼻子、嘴巴等),用部件間的關系來描述物體,這個特性非常符合自然界很多物體的非剛體特征。DPM可以看做是HOG+SVM的擴展,很好的繼承了兩者的優點,在人臉檢測、行人檢測等任務上取得了不錯的效果,但是DPM相對復雜,檢測速度也較慢,從而也出現了很多改進的方法。
    但傳統目標檢測存在兩個主要問題:一個是基於滑動窗口的區域選擇策略沒有針對性,時間復雜度高,窗口冗余;二是手工設計的特征對於多樣性的變化並沒有很好的魯棒性。
  • 基於深度學習的目標檢測算法:

o   以候選區域/框(Region Proposal) + 深度學習分類的算法:
通過提取候選區域,並對相應區域進行以深度學習方法為主的分類的方案,比如R-CNN(Selective Search + CNN + SVM)、SPP-net(ROI Pooling)、Fast R-CNN(Selective Search + CNN + ROI)、Faster R-CNN(RPN + CNN + ROI)、Mask R-CNN(Mask Prediction Branch+RPN + CNN + ROI)等。

o   基於深度學習的回歸算法:
YOLO、SSD、YOLOv2、YOLOv3等算法

目前目標檢測領域的深度學習方法主要分為兩類:two stage 的目標檢測算法;one stage 的目標檢測算法。前者是先由算法生成一系列作為樣本的候選框,再通過卷積神經網絡進行樣本分類;后者則不用產生候選框,直接將目標邊框定位的問題轉化為回歸問題處理。正是由於兩種方法的差異,在性能上也有不同,前者在檢測准確率和定位精度上占優,后者在算法速度上占優。

小目標檢測

小目標有兩種定義方式,一種是相對尺寸大小,如目標尺寸的長寬是原圖像尺寸的0.1,即可認為是小目標,另外一種是絕對尺寸的定義,即尺寸小於32*32像素的目標即可認為是小目標。

小目標檢測在深度學習卷積神經網絡模型中一直是一個難題。早期的目標檢測框架大多數是針對通用的目標來進行檢測,如經典的單階段方法yolo和ssd,兩階段方法faster-rcnn等,這些方法主要是針對通用目標數據集來設計的解決方案,因此對於圖像中的小目標來說,檢測效果不是很理想。

 

 

 為了解決小目標問題提出的方法有:

  • 圖像的縮放。也是最瑣碎的一個方向——是在檢測前對圖像進行縮放。但是,由於大圖像變得太大,無法裝入GPU進行訓練,因此單純的升級並不有效。ao等[2017]首先下采樣圖像,然后利用強化學習訓練基於注意力的模型,動態搜索圖像中感興趣的區域。然后對選定的區域進行高分辨率的研究,並可用於預測較小的目標。這避免了對圖像中每個像素進行同等關注分析的需要,節省了一些計算成本。一些論文[Dai等,2016b,2017年,Singh和Davis, 2018年]在目標檢測上下文中訓練時使用圖像金字塔,而[Ren et al., 2017]在測試時使用。
  • 淺網絡。小物體更容易被接受場較小的探測器預測。較深的網絡具有較大的接受域,容易丟失關於較粗層中較小對象的一些信息。Sommer等[2017b]提出了一種非常淺的網絡,只有四個卷積層和三個完全連接的層,用於檢測航空圖像中的目標。當期望的實例類型很小時,這種類型的檢測器非常有用。但是,如果預期的實例具有不同的大小,則效果更好上下文信息。利用圍繞小對象實例的上下文。Gidaris和Komodakis [2015], Zhu等[2015b]使用上下文來提高性能,Chen等[2016a]則專門使用上下文來提高小對象的性能。他們使用上下文補丁對R-CNN進行了擴展,與區域建議網絡生成的建議補丁並行。Zagoruyko等人[2016]將他們的方法與深度掩模對象建議相結合,使信息通過多條路徑流動。
  • 超分辨率。還有針對小目標的圖像增強等。最典型的是利用生成對抗性網絡選擇性地提高小目標的分辨率。
  • 它的生成器學會了將小對象的不佳表示增強為超分辨對象,這些超分辨對象與真實的大對象非常相似,足以欺騙競爭的鑒別器。

近兩年提出了利用多層特征圖的方法(特征金字塔、RNN思想、逐層預測),對小目標檢測的效果產生了顯著的提升。

現階段主流算法有:
圖像金字塔:較早提出對訓練圖片上采樣出多尺度的圖像金字塔。通過上采樣能夠加強小目標的細粒度特征,在理論上能夠優化小目標檢測的定位和識別效果。但基於圖像金字塔訓練卷積神經網絡模型對計算機算力和內存都有非常高的要求。計算機硬件發展至今也難有勝任。故該方法在實際應用中極少。

逐層預測:該方法對於卷積神經網絡的每層特征圖輸出進行一次預測,最后綜合考量得出結果。同樣,該方法也需要極高的硬件性能。

特征金字塔:參考多尺度特征圖的特征信息,同時兼顧了較強的語義特征和位置特征。該方法的優勢在於,多尺度特征圖是卷積神經網絡中固有的過渡模塊,堆疊多尺度特征圖對於算法復雜度的增加微乎其微。

RNN思想:參考了RNN算法中的門限機制、長短期記憶等,同時記錄多層次的特征信息(注:和特征金字塔有本質區別)。但RNN固有的缺陷是訓練速度較慢(部分操作無法矩陣化)。

所謂的小目標,要看是絕對小目標(像素),和相對小目標(相對原圖的長寬來看的)。大目標小目標只跟receptive field(感受野)有關,cnn本身可以檢測任何尺度的物體。ssd對小目標檢測不太適用,但R-FCN速度和魯棒存在問題。

小目標分為很多種,背景單一還是比較好做的。有一篇小人臉檢測用的是 fullyconvolutionalnetwork(FCN) + ResNet ,此篇論文檢測小目標用了其周邊的信息,如頭發,肩膀。

首先,小目標像素少特征不明顯,因此和大目標相比,小目標的檢測率低,這個用任何算法上都是無法避免的。那不同算法之間的小目標檢測的區別呢?SSD,YOLO等單階段多尺度算法,小目標檢測需要較高的分辨率,SSD對於高分辨率的底層特征沒有再利用,而這些層對於檢測小目標很重要,因此主要在底部的特征層進行檢測,比如SSD中的conv4_3,但底部特征層的語義信息不夠豐富,這是一個矛盾,但卷積層加足夠深的話影響其實沒這么大。我覺得最重要的因素還是因為scale設置的不好導致的,SSD中默認最低一層的anchor為 0.1~0.2,對於720p的圖像最小檢測尺寸就有72個像素,還是太大了。事實上SSD的源碼允許一個特征層做多個尺度的滑窗,將參數min_sizes里的每個元素初始化為一個列表,就可以在相應特征層中生成不同尺度的anchor,如果你設計的足夠仔細,基本就可以覆蓋足夠小的目標了,不過此時anchor的數量估計會漲不少,速度也會降下來。

faster rcnn,yolo,ssd對小目標檢測結果都不好,原因在於卷積網絡結構的最后一層feature map太小,例如32*32的目標經過vgg后變成2*2,導致之后的檢測和回歸無法滿足要求。卷積網絡越深語義信息越強,而越低層則是描述的局部外觀信息越多,而且我想VGG16卷積層設計成這么多肯定是有意義的,如果靠前的效果好,VGG的研究者應該想到減少層數了,我覺得可以考慮提取多層的特征這樣表達能力強些。比如樣本貓狗圖像,較小的貓的ground truth只是出現在底層,高層沒有貓的ground truth,而較大物體狗匹配到的ground truth在高層feature map上),其他層的信息只是簡單拼接(所以小物體檢測的語義信息,contex信息差一些)。

SSD是多尺度的特征圖進行paopasal提取,ssd相對於yolo來說對小目標更穩定。yolo則是通過全局特征去直接得到預測結果,完全要靠數據堆積起來,對待小目標我覺得要考慮減少pooling

SSD里負責檢測小目標的層為conv4_3(38*38)對應的尺度為0.2(可人為設置)。這就對應了SSD所能檢測的尺度大概為0.2上下。在這種情況下,如果物體過於小的話,甚至在訓練階段,GT都沒法找到相應的的default box與它匹配,效果怎么可能會好。如果不介意整體檢測效果的話,可以把尺度調低,看看對於小目標的檢測效果是否有提升。另外,利用多尺度進行檢測也能提高小物體的檢測效果。

SSD使用的VGG16作為特征抽取,在conv4_3 feature map 的分辨率已經縮小了8倍,在conv5_3縮小了16倍,比如一個32*32大小的物體,在vgg16 的 conv5_3的feature map 對應僅為2*2,位置信息有較大的損失。有兩種方法可決絕這個問題:1.使用不同層的特征,比如hyperNet,MultiPath。2.保證感受也不縮小的情況下feature map的分辨率不至於縮小太多,如采用DeepLab中采用的Hole algorithm,在保證感受野的同時分辨變化較小。

他們對小目標檢測不好的原因主要是,SSD/YOLO 對原圖做了縮放,因為感受野的原因,導致“相對尺寸小”目標檢測困難。如果說RCNN系列,並沒有對原圖進行縮放,但是如果”絕對尺寸小“的話,也沒有辦法,因為到了一定深度的Feature map,小目標可能已經丟失response了。1.小目標往往更依賴淺層特征,因為淺層特征有更高的分辨率,然而對語義區分較差。2.SSD檢測和分類一起做,會把一些檢測到但是分類模糊,分數不高的結果過濾掉。而rpn不會,前200個候選繼續分類,都會有個結果。3.為了速度,本來是全卷積網絡,卻也固定了輸入尺寸,對大圖的小目標影響很大。

一些比較好的觀點

CNN特征的分辨率較差,這點不比其它low-level(淺層)的特征,證據就是在pedestrian detection(行人檢測)上, 一些hand-crafted features(手工制作特征)的效果還是不錯的;Faster-rcnn和SSD本身的問題,原始的Faster-rnn在RPN中將input的最短邊固定resize到600>SSD512>SSD300,SSD使用300和512的原因是為了提高detection speed,所以SSD才這樣快;同時為保證精度,SSD才加上了multi-scale和data augmentation(尤其值得注意這個augmentation,數據增強)。

yolo和ssd確實對小物體很無力,而有些普通的圖像算法對小物體檢測反而好的多,只是不太魯棒。可以嘗試下R-FCN,我測試了幾張,好像對小物體還可以,但是速度慢些。在970下0.18s一張的樣子。我之前在VGG16上做過R-FCN的實驗,使用相同的res101-proposal(只關注detection的效果所以使用的一樣),效果不如fast rcnn。同理,在google-v1上(也是全卷積)也是不如,我估計是淺網絡的overfitting問題(因為用VGG的proposal去做效果很不好)。

SSD是一種基於全卷積的網絡的檢測器,用不同層檢測不同大小的物體。這中間有個矛盾,前面的 feature map大,但semantic(語義)不夠,后面的sematic夠了,但經過太多的pooling,feature map太小了。要檢測小物體,既需要一張足夠大的feature map來提供更加精細的特征和做更加密集的采樣,同時也需要足夠的semantic meaning來與背景區分開。參會時問過SSD的作者,如果將最后的feature map放大接上前面的話,是不是能夠改善性能,作者說值得一試。

SSD is a class aware RPN with a lot of bells and whistles。每一個feature map上面的pixel對應幾個anchor,這個網絡對anchor進行訓練,以此驅動對feature進行訓練。這是前言。作為小物體,其所對應的anchor比較少 (gt overlap > 0.5 的 anchor),也就是說對應feature map上的pixel難以得到充分訓練。讀者可以腦補每一個大的ROI可能覆蓋很多 anchor,那么這些 anchor 均有機會得到訓練。然而一個小物體並不能覆蓋很多 anchor。沒有得到充分訓練有什么問題?在test的時候這個pixel的預測結果可能就是亂的,會極大干擾正常結果。為什么SSD的data augmentation能漲這么多點,就是因為通過randomly crop,讓每一個anchor都得到充分訓練(也就是說,crop出一個小物體,在新圖里面就變成大物體了)只能說這種without region propisal的結果 naturally 不擅長小物體。通過往上堆 hack 才能慢慢比上吧。

我試過SSD最前面的卷積為深度殘差網絡,檢測小物體效果還不錯,比YOLO要好得多。另外SSD原論文中,多級別的物體基本尺寸從0.1到0.8,實際上0.1的比例還是很大的,如1024*1024的輸入,0.1都到102了,其實不小。可以根據需求調整級別,我使用的為1/64~1,即不同級別格子本身大小。當然,級別從線性分割變成指數分割后,在基本大小之上的各個變形也需要調整一下(主要是變大),不然有可能覆蓋不到有些位於兩個格子中間的某些大小的物體。YOLO比較坑的地方在於倒數第二層為全連接,后面的7*7格子不能擴張太大,不然前面的全連接要爆。格子大了,同一個格子可能會包括多個小物體,檢測就不好搞了。而YOLO全連接的作用又是整合全局信息,要去掉全連接,就需要增加最后點的感受野,所以深度殘差就非常適合。提到深度殘差,再說另外一點。在深度殘差的作者kaiming大神另一篇文章R-FCN: Object Detection via Region-based Fully Convolutional Networks,中有使用空間pooling,發現深度殘差就是天然的自帶空間pooling效果的結構啊。補充一點,SSD前面的CNN結構,一定要是全對稱的,特別是pooling的時候,這樣最后輸出點的感受野中心才與每個格子的中心是重合的。如果是非對稱的,CNN前面特征提取的時候,它會糾結,造成大量的小物體不好學習。而YOLO最后有全連接都還好,問題不大。最后一句,深度殘差就是自帶空間pooling結構,這個怎么理解呢。深度殘差中的最小單元,一邊為兩個卷積壘在一起,假設作用只是把圖像平移,另一個為直連,那最后接合在一起,就是一個空間相關的組合了嘛。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM