检测到目标服务器启用了trace方法_综述:目标检测中的多尺度检测方法
生活随笔
收集整理的這篇文章主要介紹了
检测到目标服务器启用了trace方法_综述:目标检测中的多尺度检测方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
↑ 點擊藍字?關注極市平臺作者丨SFXiang來源丨AI算法修煉營編輯丨極市平臺
極市導讀
?本文從降低下采樣率與空洞卷積、多尺度訓練、優化Anchor尺寸設計、深層和淺層特征融合等多個方面入手,對目標檢測中的多尺度檢測方法進行了全面概述,并介紹了多尺度檢測相關方法。
前面的話
傳統卷積網絡通常采用從上到下的單行結構。對于大物體而言,其語義信息將出現在較深的特征圖中;而對于小物體,其語義信息出現在較淺的特征圖中,隨著網絡的加深,其細節信息可能會完全消失。多尺度檢測也是當今物體檢測領域最為活躍的研究主題之一,本文主要介紹:多尺度檢測。多尺度是目標檢測與圖像分類兩個任務的一大區別。分類問題通常針對同一種尺度,如ImageNet中的224大小;而目標檢測中,模型需要對不同尺度的物體都能檢測出來,這要求模型對于尺度要具有魯棒性。在多尺度的物體中,大尺度的物體由于面積大、特征豐富,通常來講較為容易檢測。難度較大的主要是小尺度的物體,而這部分小物體在實際工程中卻占據了較大的比例。通常認為絕對尺寸小于32×32的物體,可以視為小物體或者物體寬高是原圖寬高的1/10以下,可以視為小物體。小物體由于其尺寸較小,可利用的特征有限,這使得其檢測較為困難。當前的檢測算法對于小物體并不友好,體現在以下4個方面:
1、過大的下采樣率:假設當前小物體尺寸為15×15,一般的物體檢測中卷積下采樣率為16,這樣在特征圖上,過大的下采樣率使得小物體連一個像素點都占據不到。2、過大的感受野:在卷積網絡中,特征圖上特征點的感受野比下采樣率大很多,導致在特征圖上的一個點中,小物體占據的特征更少,會包含大量周圍區域的特征,從而影響其檢測結果。?3、語義與空間的矛盾:當前檢測算法,如Faster RCNN,其Backbone大都是自上到下的方式,深層與淺層特征圖在語義性與空間性上沒有做到更好的均衡。?4、SSD一階算法缺乏特征融合:SSD雖然使用了多層特征圖,但淺層的特征圖語義信息不足,沒有進行特征的融合,致使小物體檢測的結果較差。多尺度的檢測能力實際上體現了尺度的不變性,當前的卷積網絡能夠檢測多種尺度的物體,很大程度上是由于其本身具有超強的擬合能力。較為通用的提升多尺度檢測的經典方法有:降低下采樣率與空洞卷積可以顯著提升小物體的檢測性能;設計更好的Anchor可以有效提升Proposal的質量;多尺度的訓練可以近似構建出圖像金字塔,增加樣本的多樣性;特征融合可以構建出特征金字塔,將淺層與深層特征的優勢互補。下面將詳細介紹:1?降低下采樣率與空洞卷積
對于小物體檢測而言,降低網絡的下采樣率通常的做法是直接去除掉Pooling層。例如,將原始的VGGNet-16作為物體檢測的Backbone時,通常是將第5個Pooling層之前的特征圖作為輸出的特征圖,一共擁有4個Pooling層,這時下采樣率為16。為了降低下采樣率,我們可以將第4個Pooling層去掉,使得下采樣率變為8,減少了小物體在特征圖上的信息損失。但是,如果僅僅去除掉Pooling層,則會減小后續層的感受野。如果使用預訓練模型進行微調(Fine-tune),則僅去除掉Pooling層會使得后續層感受野與預訓練模型對應層的感受野不同,從而導致不能很好地收斂。因此,需要在去除Pooling的前提下增加后續層的感受野,使用空洞卷積可以在保證不改變網絡分辨率的前提下增加網絡的感受野。需要注意的是,采用空洞卷積也不能保證修改后與修改前的感受野完全相同,但能夠最大限度地使感受野在可接受的誤差內。2 多尺度訓練?
多尺度類似于數字圖像處理中的圖像金字塔,即將輸入圖片縮放到多個尺度下,每一個尺度單獨地計算特征圖,并進行后續的檢測。這種方式雖然一定程度上可以提升檢測精度,但由于多個尺度完全并行,耗時巨大。多尺度訓練(Multi Scale Training, MST)通常是指設置幾種不同的圖片輸入尺度,訓練時從多個尺度中隨機選取一種尺度,將輸入圖片縮放到該尺度并送入網絡中,是一種簡單又有效的提升多尺度物體檢測的方法。雖然一次迭代時都是單一尺度的,但每次都各不相同,增加了網絡的魯棒性,又不至于增加過多的計算量。而在測試時,為了得到更為精準的檢測結果,也可以將測試圖片的尺度放大,例如放大4倍,這樣可以避免過多的小物體。多尺度訓練是一種十分有效的trick方法,放大了小物體的尺度,同時增加了多尺度物體的多樣性,在多個檢測算法中都可以直接嵌入,在不要求速度的場合或者各大物體檢測競賽中尤為常見。3?優化Anchor尺寸設計
現今較為成熟的檢測算法大都采用Anchor作為先驗框,如Faster RCNN和SSD等。模型在Anchor的基礎上只需要去預測其與真實物體邊框的偏移即可,可以說是物體檢測算法發展中的一個相當經典的設計。Anchor通常是多個不同大小與寬高的邊框,這個大小與寬高是一組超參數,需要我們手動配置。在不同的數據集與任務中,由于物體的尺度、大小會有差距,例如行人檢測的數據集中,行人標簽寬高比通常為0.41,與通用物體的標簽會有所區別,這時就需要相應地調整Anchor的大小與寬高。如果Anchor設計的不合理,與數據集中的物體分布存在差距,則會給模型收斂帶來較大的困難,影響模型的精度,甚至不會收斂。另外,Anchor的設計對于小物體的檢測也尤為重要,如果Anchor過大,即使小物體全部在Anchor內,也會因為其自身面積小導致IoU低,從而造成漏檢。通常來講,可以從以下兩個角度考慮如何設計一組好的Anchor。1.?? 統計實驗,手工設計在Faster RCNN的RPN階段,所有Anchor會與真實標簽進行匹配,根據匹配的IoU值得到正樣本與負樣本,正樣本的IoU閾值為0.7。在這個過程中,Anchor與真實標簽越接近,正樣本的IoU會更高,RPN階段對于真實標簽的召回率會越高,正樣本也會更豐富,模型效果會更好。因此,可以僅僅利用訓練集的標簽與設計的Anchor進行匹配試驗,試驗的指標是所有訓練標簽的召回率,以及正樣本的平均IoU值。當然,也可以增加每個標簽的正樣本數、標簽的最大IoU等作為輔助指標。為了方便地匹配,在此不考慮Anchor與標簽的位置偏移,而是把兩者的中心點放在一起,僅僅利用其寬高信息進行匹配。這種統計實驗實際是通過手工設計的方式,尋找與標簽寬高分布最為一致的一組Anchor。2.邊框聚類相比起手工尋找標簽的寬高分布,也可以利用聚類的思想,在訓練集的標簽上直接聚類出一組合適的Anchor。由于一組Anchor會出現在特征圖的每一個位置上,因此沒有位置區別,可以只關注標簽里的物體寬高,而沒必要關心物體出現的位置。邊框聚類時通常使用K-Means算法,這也是YOLO采用的Anchor聚類方法。K-Means算法輸入超參數K,即最終想要獲得的邊框數量,首先隨機選取K個中心點,然后遍歷所有的數據,并將所有的邊框劃分到最近的中心點中。在每個邊框都落到不同的聚類后,計算每一個聚類的平均值,并將此平均值作為新的中心點。重復上述過程,直到算法收斂。在聚類過程中,Anchor的數量K是一個較為重要的超參,數量越多,精度越高,但與此同時會帶來計算量的增加。對于使用Anchor的物體檢測算法而言,設計一組好的Anchor是基礎,這對于多尺度、擁擠等問題都有較大的幫助。4 深層和淺層特征融合
傳統的卷積網絡通常是自上而下的模式,隨著網絡層數的增加,感受野會增大,語義信息也更為豐富。這種自上而下的結構本身對于多尺度的物體檢測就存在弊端,尤其是小物體,其特征可能會隨著深度的增加而漸漸丟失,從而導致檢測性能的降低。可以將深層的語義信息添加到淺層的特征圖中,融合兩者的特征,優勢互補,從而提升對于小物體的檢測性能。特征融合有多種方式,增大特征圖尺寸可以使用上采樣、反卷積等,融合方法有逐元素相加、相乘和通道拼接等,具體哪種效果更好,還要看實際的檢測任務及使用的檢測算法。特征融合的普遍缺點是通常會帶來一定計算量的增加。特征融合方法示例:1. FPN(Feature Pyramid Network)將深層信息上采樣,與淺層信息逐元素地相加,從而構建了尺寸不同的特征金字塔結構,性能優越,現已成為目標檢測算法的一個標準組件。FPN的結構如下所示。自下而上:最左側為普通的卷積網絡,默認使用ResNet結構,用作提取語義信息。C1代表了ResNet的前幾個卷積與池化層,而C2至C5分別為不同的ResNet卷積組,這些卷積組包含了多個Bottleneck結構,組內的特征圖大小相同,組間大小遞減。自上而下:首先對C5進行1×1卷積降低通道數得到P5,然后依次進行上采樣得到P4、P3和P2,目的是得到與C4、C3與C2長寬相同的特征,以方便下一步進行逐元素相加。這里采用2倍最鄰近上采樣,即直接對臨近元素進行復制,而非線性插值。橫向連接(Lateral Connection):目的是為了將上采樣后的高語義特征與淺層的定位細節特征進行融合。高語義特征經過上采樣后,其長寬與對應的淺層特征相同,而通道數固定為256,因此需要對底層特征C2至C4進行11卷積使得其通道數變為256,然后兩者進行逐元素相加得到P4、P3與P2。由于C1的特征圖尺寸較大且語義信息不足,因此沒有把C1放到橫向連接中。卷積融合:在得到相加后的特征后,利用3×3卷積對生成的P2至P4再進行融合,目的是消除上采樣過程帶來的重疊效應,以生成最終的特征圖。FPN對于不同大小的RoI,使用不同的特征圖,大尺度的RoI在深層的特征圖上進行提取,如P5,小尺度的RoI在淺層的特征圖上進行提取,如P2。FPN的代碼實現如下:import torch.nn as nnimport torch.nn.functional as Fimport mathclass Bottleneck(nn.Module): expansion = 4 def __init__(self, in_planes, planes, stride=1, downsample=None): super(Bottleneck, self).__init__() self.bottleneck = nn.Sequential( nn.Conv2d(in_planes, planes, 1, bias=False), nn.BatchNorm2d(planes), nn.ReLU(inplace=True), nn.Conv2d(planes, planes, 3, stride, 1, bias=False), nn.BatchNorm2d(planes), nn.ReLU(inplace=True), nn.Conv2d(planes, self.expansion * planes, 1, bias=False), nn.BatchNorm2d(self.expansion * planes), ) self.relu = nn.ReLU(inplace=True) self.downsample = downsample def forward(self, x): identity = x out = self.bottleneck(x) if self.downsample is not None: identity = self.downsample(x) out += identity out = self.relu(out) return outclass FPN(nn.Module): def __init__(self, layers): super(FPN, self).__init__() self.inplanes = 64 self.conv1 = nn.Conv2d(3, 64, 7, 2, 3, bias=False) self.bn1 = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(3, 2, 1) self.layer1 = self._make_layer(64, layers[0]) self.layer2 = self._make_layer(128, layers[1], 2) self.layer3 = self._make_layer(256, layers[2], 2) self.layer4 = self._make_layer(512, layers[3], 2) self.toplayer = nn.Conv2d(2048, 256, 1, 1, 0) self.smooth1 = nn.Conv2d(256, 256, 3, 1, 1) self.smooth2 = nn.Conv2d(256, 256, 3, 1, 1) self.smooth3 = nn.Conv2d(256, 256, 3, 1, 1) self.latlayer1 = nn.Conv2d(1024, 256, 1, 1, 0) self.latlayer2 = nn.Conv2d( 512, 256, 1, 1, 0) self.latlayer3 = nn.Conv2d( 256, 256, 1, 1, 0) def _make_layer(self, planes, blocks, stride=1): downsample = None if stride != 1 or self.inplanes != Bottleneck.expansion * planes: downsample = nn.Sequential( nn.Conv2d(self.inplanes, Bottleneck.expansion * planes, 1, stride, bias=False), nn.BatchNorm2d(Bottleneck.expansion * planes) ) layers = [] layers.append(Bottleneck(self.inplanes, planes, stride, downsample)) self.inplanes = planes * Bottleneck.expansion for i in range(1, blocks): layers.append(Bottleneck(self.inplanes, planes)) return nn.Sequential(*layers) def _upsample_add(self, x, y): _,_,H,W = y.shape return F.upsample(x, size=(H,W), mode='bilinear') + y def forward(self, x): c1 = self.maxpool(self.relu(self.bn1(self.conv1(x)))) c2 = self.layer1(c1) c3 = self.layer2(c2) c4 = self.layer3(c3) c5 = self.layer4(c4) p5 = self.toplayer(c5) p4 = self._upsample_add(p5, self.latlayer1(c4)) p3 = self._upsample_add(p4, self.latlayer2(c3)) p2 = self._upsample_add(p3, self.latlayer3(c2)) p4 = self.smooth1(p4) p3 = self.smooth2(p3) p2 = self.smooth3(p2)????????return?p2,?p3,?p4,?p52. DetNet:專為目標檢測而生的Backbone,利用空洞卷積與殘差結構,使得多個融合后的特征圖尺寸相同,從而也避免了上采樣操作。3. Faster RCNN系列中,HyperNet將第1、3、5個卷積組后得到的特征圖進行融合,淺層的特征進行池化、深層的特征進行反卷積,最終采用通道拼接的方式進行融合,優勢互補。4. SSD系列中,DSSD在SSD的基礎上,對深層特征圖進行反卷積,與淺層的特征相乘,得到了更優的多層特征圖,這對于小物體的檢測十分有利。5.?RefineDet將SSD的多層特征圖結構作為了Faster RCNN的RPN網絡,結合了兩者的優點。特征圖處理上與FPN類似,利用反卷積與逐元素相加,將深層特征圖與淺層的特征圖進行結合,實現了一個十分精巧的檢測網絡。6. YOLO系列中,YOLO v3也使用了特征融合的思想,通過上采樣與通道拼接的方式,最終輸出了3種尺寸的特征圖。5?SNIP:尺度歸一化
論文地址:
https://arxiv.org/abs/1711.08189
代碼地址:https://github.com/mahyarnajibi/SNIPER當前的物體檢測算法通常使用微調的方法,即先在ImageNet數據集上訓練分類任務,然后再遷移到物體檢測的數據集上,如COCO來訓練檢測任務。我們可以將ImageNet的分類任務看做224×224的尺度,而COCO中的物體尺度大部分在幾十像素的范圍內,并且包含大量小物體,物體尺度差距更大,因此兩者的樣本差距太大,會導致映射遷移(Domain Shift)的誤差。SNIP是多尺度訓練(Multi-Scale Training)的改進版本。MST的思想是使用隨機采樣的多分辨率圖像使檢測器具有尺度不變特性。然而作者通過實驗發現,在MST中,對于極大目標和過小目標的檢測效果并不好,但是MST也有一些優點,比如對一張圖片會有幾種不同分辨率,每個目標在訓練時都會有幾個不同的尺寸,那么總有一個尺寸在指定的尺寸范圍內。SNIP的做法是只對size在指定范圍內的目標回傳損失,即訓練過程實際上只是針對某些特定目標進行,這樣就能減少domain-shift帶來的影響。SNIP的網絡結構如下圖所示:具體的實現細節(1)3個尺度分別擁有各自的RPN模塊,并且各自預測指定范圍內的物體。(2)對于大尺度的特征圖,其RPN只負責預測被放大的小物體,對于小尺度的特征圖,其RPN只負責預測被縮小的大物體,這樣真實的物體尺度分布在較小的區間內,避免了極大或者極小的物體。(3)在RPN階段,如果真實物體不在該RPN預測范圍內,會被判定為無效,并且與該無效物體的IoU大于0.3的Anchor也被判定為無效的Anchor。(4)在訓練時,只對有效的Proposal進行反向傳播。在測試階段,對有效的預測Boxes先縮放到原圖尺度,利用Soft NMS將不同分辨率的預測結果合并。(5)實現時SNIP采用了可變形卷積的卷積方式,并且為了降低對于GPU的占用,將原圖隨機裁剪為1000×1000大小的圖像。總體來說,SNIP讓模型更專注于物體本身的檢測,剝離了多尺度的學習難題。在網絡搭建時,SNIP也使用了類似于MST的多尺度訓練方法,構建了3個尺度的圖像金字塔,但在訓練時,只對指定范圍內的Proposal進行反向傳播,而忽略掉過大或者過小的Proposal。SNIP方法雖然實現簡單,但其背后卻蘊藏深意,更深入地分析了當前檢測算法在多尺度檢測上的問題所在,在訓練時只選擇在一定尺度范圍內的物體進行學習,在COCO數據集上有3%的檢測精度提升,可謂是大道至簡。6 TridentNet:三叉戟網絡
論文地址:https://arxiv.org/abs/1901.01892代碼地址:https://github.com/TuSimple/simpledet/tree/master/models/tridentnet傳統的解決多尺度檢測的算法,大都依賴于圖像金字塔與特征金字塔。與上述算法不同,圖森組對感受野這一因素進行了深入的分析,并利用了空洞卷積這一利器,構建了簡單的三分支網絡TridentNet,對于多尺度物體的檢測有了明顯的精度提升。TridentNet網絡的作者將3種不同的感受野網絡并行化,提出了如下圖所示的檢測框架。采用ResNet作為基礎Backbone,前三個stage沿用原始的結構,在第四個stage,使用了三個感受野不同的并行網絡。具體實現細節(1)3個不同的分支使用了空洞數不同的空洞卷積,感受野由小到大,可以更好地覆蓋多尺度的物體分布。(2)由于3個分支要檢測的內容是相同的、要學習的特征也是相同的,只不過是形成了不同的感受野來檢測不同尺度的物體,因此,3個分支共享權重,這樣既充分利用了樣本信息,學習到更本質的目標檢測信息,也減少了參數量與過擬合的風險。(3)借鑒了SNIP的思想,在每一個分支內只訓練一定范圍內的樣本,避免了過大與過小的樣本對于網絡參數的影響。在訓練時,TridentNet網絡的三個分支會接入三個不同的head網絡進行后續損失計算。在測試時,由于沒有先驗的標簽來選擇不同的分支,因此只保留了一個分支進行前向計算,這種前向方法只有少量的精度損失。具體細節可以參考論文。參考資料1.深度學習之PyTorch物體檢測實戰 董洪義2.https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1901.018923.https://zhuanlan.zhihu.com/p/744156024.https://zhuanlan.zhihu.com/p/61536443推薦閱讀
無痛漲點:目標檢測優化的實用Trick
綜述:目標檢測二十年
總結目標檢測匹配策略與改進思路
總結
以上是生活随笔為你收集整理的检测到目标服务器启用了trace方法_综述:目标检测中的多尺度检测方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我想看基金27005_宅家变富,你知道如
- 下一篇: 按周选择的时间控件_基金定投到底是选择按