<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          綜述:目標檢測中的多尺度檢測方法

          共 9962字,需瀏覽 20分鐘

           ·

          2020-09-25 03:03

          ↑ 點擊藍字?關(guān)注極市平臺

          作者丨SFXiang
          來源丨AI算法修煉營
          編輯丨極市平臺

          極市導讀

          ?

          本文從降低下采樣率與空洞卷積、多尺度訓練、優(yōu)化Anchor尺寸設(shè)計、深層和淺層特征融合等多個方面入手,對標檢測中的多尺度檢測方法進行了全面概述,并介紹了多尺度檢測相關(guān)方法。


          前面的話


          傳統(tǒng)卷積網(wǎng)絡(luò)通常采用從上到下的單行結(jié)構(gòu)。對于大物體而言,其語義信息將出現(xiàn)在較深的特征圖中;而對于小物體,其語義信息出現(xiàn)在較淺的特征圖中,隨著網(wǎng)絡(luò)的加深,其細節(jié)信息可能會完全消失。


          多尺度檢測也是當今物體檢測領(lǐng)域最為活躍的研究主題之一,本文主要介紹:多尺度檢測

          多尺度是目標檢測與圖像分類兩個任務的一大區(qū)別。分類問題通常針對同一種尺度,如ImageNet中的224大小;而目標檢測中,模型需要對不同尺度的物體都能檢測出來,這要求模型對于尺度要具有魯棒性。

          在多尺度的物體中,大尺度的物體由于面積大、特征豐富,通常來講較為容易檢測。難度較大的主要是小尺度的物體,而這部分小物體在實際工程中卻占據(jù)了較大的比例。通常認為絕對尺寸小于32×32的物體,可以視為小物體或者物體寬高是原圖寬高的1/10以下,可以視為小物體。
          ?

          小物體由于其尺寸較小,可利用的特征有限,這使得其檢測較為困難。當前的檢測算法對于小物體并不友好,體現(xiàn)在以下4個方面:

          ?

          1、過大的下采樣率:假設(shè)當前小物體尺寸為15×15,一般的物體檢測中卷積下采樣率為16,這樣在特征圖上,過大的下采樣率使得小物體連一個像素點都占據(jù)不到

          2、過大的感受野:在卷積網(wǎng)絡(luò)中,特征圖上特征點的感受野比下采樣率大很多,導致在特征圖上的一個點中,小物體占據(jù)的特征更少,會包含大量周圍區(qū)域的特征,從而影響其檢測結(jié)果。?

          3、語義與空間的矛盾:當前檢測算法,如Faster RCNN,其Backbone大都是自上到下的方式,深層與淺層特征圖在語義性與空間性上沒有做到更好的均衡。?
          ?
          4、SSD一階算法乏特征融合:SSD雖然使用了多層特征圖,但淺層的特征圖語義信息不足,沒有進行特征的融合,致使小物體檢測的結(jié)果較差。

          多尺度的檢測能力實際上體現(xiàn)了尺度的不變性,當前的卷積網(wǎng)絡(luò)能夠檢測多種尺度的物體,很大程度上是由于其本身具有超強的擬合能力。


          較為通用的提升多尺度檢測的經(jīng)典方法有:


          降低下采樣率與空洞卷積可以顯著提升小物體的檢測性能;設(shè)計更好的Anchor可以有效提升Proposal的質(zhì)量;多尺度的訓練可以近似構(gòu)建出圖像金字塔,增加樣本的多樣性;特征融合可以構(gòu)建出特征金字塔,將淺層與深層特征的優(yōu)勢互補。下面將詳細介紹:

          1?降低下采樣率與空洞卷積


          對于小物體檢測而言,降低網(wǎng)絡(luò)的下采樣率通常的做法是直接去除掉Pooling層。


          例如,將原始的VGGNet-16作為物體檢測的Backbone時,通常是將第5個Pooling層之前的特征圖作為輸出的特征圖,一共擁有4個Pooling層,這時下采樣率為16。為了降低下采樣率,我們可以將第4個Pooling層去掉,使得下采樣率變?yōu)?,減少了小物體在特征圖上的信息損失。
          ?
          但是,如果僅僅去除掉Pooling層,則會減小后續(xù)層的感受野。如果使用預訓練模型進行微調(diào)(Fine-tune),則僅去除掉Pooling層會使得后續(xù)層感受野與預訓練模型對應層的感受野不同,從而導致不能很好地收斂。

          因此,需要在去除Pooling的前提下增加后續(xù)層的感受野,使用空洞卷積可以在保證不改變網(wǎng)絡(luò)分辨率的前提下增加網(wǎng)絡(luò)的感受野。

          需要注意的是,采用空洞卷積也不能保證修改后與修改前的感受野完全相同,但能夠最大限度地使感受野在可接受的誤差內(nèi)。

          2 多尺度訓練?


          多尺度類似于數(shù)字圖像處理中的圖像金字塔,即將輸入圖片縮放到多個尺度下,每一個尺度單獨地計算特征圖,并進行后續(xù)的檢測。這種方式雖然一定程度上可以提升檢測精度,但由于多個尺度完全并行,耗時巨大。
          ?
          多尺度訓練(Multi Scale Training, MST)通常是指設(shè)置幾種不同的圖片輸入尺度,訓練時從多個尺度中隨機選取一種尺度,將輸入圖片縮放到該尺度并送入網(wǎng)絡(luò)中,是一種簡單又有效的提升多尺度物體檢測的方法。
          ?
          雖然一次迭代時都是單一尺度的,但每次都各不相同,增加了網(wǎng)絡(luò)的魯棒性,又不至于增加過多的計算量。而在測試時,為了得到更為精準的檢測結(jié)果,也可以將測試圖片的尺度放大,例如放大4倍,這樣可以避免過多的小物體。
          ?
          多尺度訓練是一種十分有效的trick方法,放大了小物體的尺度,同時增加了多尺度物體的多樣性,在多個檢測算法中都可以直接嵌入,在不要求速度的場合或者各大物體檢測競賽中尤為常見。


          3?優(yōu)化Anchor尺寸設(shè)計


          現(xiàn)今較為成熟的檢測算法大都采用Anchor作為先驗框,如Faster RCNN和SSD等。模型在Anchor的基礎(chǔ)上只需要去預測其與真實物體邊框的偏移即可,可以說是物體檢測算法發(fā)展中的一個相當經(jīng)典的設(shè)計。
          ?
          Anchor通常是多個不同大小與寬高的邊框,這個大小與寬高是一組超參數(shù),需要我們手動配置。在不同的數(shù)據(jù)集與任務中,由于物體的尺度、大小會有差距,例如行人檢測的數(shù)據(jù)集中,行人標簽寬高比通常為0.41,與通用物體的標簽會有所區(qū)別,這時就需要相應地調(diào)整Anchor的大小與寬高。
          ?
          如果Anchor設(shè)計的不合理,與數(shù)據(jù)集中的物體分布存在差距,則會給模型收斂帶來較大的困難,影響模型的精度,甚至不會收斂。
          ?
          另外,Anchor的設(shè)計對于小物體的檢測也尤為重要,如果Anchor過大,即使小物體全部在Anchor內(nèi),也會因為其自身面積小導致IoU低,從而造成漏檢。


          通常來講,可以從以下兩個角度考慮如何設(shè)計一組好的Anchor。
          ?
          1.?? 統(tǒng)計實驗,手工設(shè)計


          在Faster RCNN的RPN階段,所有Anchor會與真實標簽進行匹配,根據(jù)匹配的IoU值得到正樣本與負樣本,正樣本的IoU閾值為0.7。在這個過程中,Anchor與真實標簽越接近,正樣本的IoU會更高,RPN階段對于真實標簽的召回率會越高,正樣本也會更豐富,模型效果會更好。
          ?
          因此,可以僅僅利用訓練集的標簽與設(shè)計的Anchor進行匹配試驗,試驗的指標是所有訓練標簽的召回率,以及正樣本的平均IoU值。當然,也可以增加每個標簽的正樣本數(shù)、標簽的最大IoU等作為輔助指標。
          ?
          為了方便地匹配,在此不考慮Anchor與標簽的位置偏移,而是把兩者的中心點放在一起,僅僅利用其寬高信息進行匹配。這種統(tǒng)計實驗實際是通過手工設(shè)計的方式,尋找與標簽寬高分布最為一致的一組Anchor。
          ?
          2.邊框聚類


          相比起手工尋找標簽的寬高分布,也可以利用聚類的思想,在訓練集的標簽上直接聚類出一組合適的Anchor。由于一組Anchor會出現(xiàn)在特征圖的每一個位置上,因此沒有位置區(qū)別,可以只關(guān)注標簽里的物體寬高,而沒必要關(guān)心物體出現(xiàn)的位置。
          ?
          邊框聚類時通常使用K-Means算法,這也是YOLO采用的Anchor聚類方法。K-Means算法輸入超參數(shù)K,即最終想要獲得的邊框數(shù)量,首先隨機選取K個中心點,然后遍歷所有的數(shù)據(jù),并將所有的邊框劃分到最近的中心點中。在每個邊框都落到不同的聚類后,計算每一個聚類的平均值,并將此平均值作為新的中心點。重復上述過程,直到算法收斂。
          ?
          在聚類過程中,Anchor的數(shù)量K是一個較為重要的超參,數(shù)量越多,精度越高,但與此同時會帶來計算量的增加。對于使用Anchor的物體檢測算法而言,設(shè)計一組好的Anchor是基礎(chǔ),這對于多尺度、擁擠等問題都有較大的幫助。

          4 深層和淺層特征融合


          傳統(tǒng)的卷積網(wǎng)絡(luò)通常是自上而下的模式,隨著網(wǎng)絡(luò)層數(shù)的增加,感受野會增大,語義信息也更為豐富。這種自上而下的結(jié)構(gòu)本身對于多尺度的物體檢測就存在弊端,尤其是小物體,其特征可能會隨著深度的增加而漸漸丟失,從而導致檢測性能的降低。
          ?
          可以將深層的語義信息添加到淺層的特征圖中,融合兩者的特征,優(yōu)勢互補,從而提升對于小物體的檢測性能。


          特征融合有多種方式,增大特征圖尺寸可以使用上采樣、反卷積等,融合方法有逐元素相加、相乘和通道拼接等,具體哪種效果更好,還要看實際的檢測任務及使用的檢測算法。特征融合的普遍缺點是通常會帶來一定計算量的增加


          特征融合方法示例:


          1. FPN(Feature Pyramid Network)

          將深層信息上采樣,與淺層信息逐元素地相加,從而構(gòu)建了尺寸不同的特征金字塔結(jié)構(gòu),性能優(yōu)越,現(xiàn)已成為目標檢測算法的一個標準組件。FPN的結(jié)構(gòu)如下所示。



          自下而上:最左側(cè)為普通的卷積網(wǎng)絡(luò),默認使用ResNet結(jié)構(gòu),用作提取語義信息。C1代表了ResNet的前幾個卷積與池化層,而C2至C5分別為不同的ResNet卷積組,這些卷積組包含了多個Bottleneck結(jié)構(gòu),組內(nèi)的特征圖大小相同,組間大小遞減。
          ?
          自上而下:首先對C5進行1×1卷積降低通道數(shù)得到P5,然后依次進行上采樣得到P4、P3和P2,目的是得到與C4、C3與C2長寬相同的特征,以方便下一步進行逐元素相加。這里采用2倍最鄰近上采樣,即直接對臨近元素進行復制,而非線性插值。
          ?
          橫向連接(Lateral Connection):目的是為了將上采樣后的高語義特征與淺層的定位細節(jié)特征進行融合。高語義特征經(jīng)過上采樣后,其長寬與對應的淺層特征相同,而通道數(shù)固定為256,因此需要對底層特征C2至C4進行11卷積使得其通道數(shù)變?yōu)?56,然后兩者進行逐元素相加得到P4、P3與P2。由于C1的特征圖尺寸較大且語義信息不足,因此沒有把C1放到橫向連接中。
          ?
          卷積融合:在得到相加后的特征后,利用3×3卷積對生成的P2至P4再進行融合,目的是消除上采樣過程帶來的重疊效應,以生成最終的特征圖。

          FPN對于不同大小的RoI,使用不同的特征圖,大尺度的RoI在深層的特征圖上進行提取,如P5,小尺度的RoI在淺層的特征圖上進行提取,如P2。FPN的代碼實現(xiàn)如下:
          import torch.nn as nnimport torch.nn.functional as Fimport math
          class 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 out
          class 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,?p5


          2. DetNet:專為目標檢測而生的Backbone,利用空洞卷積與殘差結(jié)構(gòu),使得多個融合后的特征圖尺寸相同,從而也避免了上采樣操作。
          ?
          3. Faster RCNN系列中,HyperNet將第1、3、5個卷積組后得到的特征圖進行融合,淺層的特征進行池化、深層的特征進行反卷積,最終采用通道拼接的方式進行融合,優(yōu)勢互補。
          ?
          4. SSD系列中,DSSD在SSD的基礎(chǔ)上,對深層特征圖進行反卷積,與淺層的特征相乘,得到了更優(yōu)的多層特征圖,這對于小物體的檢測十分有利。
          ?
          5.?RefineDet將SSD的多層特征圖結(jié)構(gòu)作為了Faster RCNN的RPN網(wǎng)絡(luò),結(jié)合了兩者的優(yōu)點。特征圖處理上與FPN類似,利用反卷積與逐元素相加,將深層特征圖與淺層的特征圖進行結(jié)合,實現(xiàn)了一個十分精巧的檢測網(wǎng)絡(luò)。

          6. YOLO系列中,YOLO v3也使用了特征融合的思想,通過上采樣與通道拼接的方式,最終輸出了3種尺寸的特征圖。

          5?SNIP:尺度歸一化


          論文地址:

          https://arxiv.org/abs/1711.08189


          代碼地址
          https://github.com/mahyarnajibi/SNIPER

          當前的物體檢測算法通常使用微調(diào)的方法,即先在ImageNet數(shù)據(jù)集上訓練分類任務,然后再遷移到物體檢測的數(shù)據(jù)集上,如COCO來訓練檢測任務。我們可以將ImageNet的分類任務看做224×224的尺度,而COCO中的物體尺度大部分在幾十像素的范圍內(nèi),并且包含大量小物體,物體尺度差距更大,因此兩者的樣本差距太大,會導致映射遷移(Domain Shift)的誤差。


          SNIP是多尺度訓練(Multi-Scale Training)的改進版本。MST的思想是使用隨機采樣的多分辨率圖像使檢測器具有尺度不變特性。然而作者通過實驗發(fā)現(xiàn),在MST中,對于極大目標和過小目標的檢測效果并不好,但是MST也有一些優(yōu)點,比如對一張圖片會有幾種不同分辨率,每個目標在訓練時都會有幾個不同的尺寸,那么總有一個尺寸在指定的尺寸范圍內(nèi)。
          SNIP的做法是只對size在指定范圍內(nèi)的目標回傳損失,即訓練過程實際上只是針對某些特定目標進行,這樣就能減少domain-shift帶來的影響。
          SNIP的網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:

          具體的實現(xiàn)細節(jié)


          (1)3個尺度分別擁有各自的RPN模塊,并且各自預測指定范圍內(nèi)的物體。


          (2)對于大尺度的特征圖,其RPN只負責預測被放大的小物體,對于小尺度的特征圖,其RPN只負責預測被縮小的大物體,這樣真實的物體尺度分布在較小的區(qū)間內(nèi),避免了極大或者極小的物體。


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


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


          (5)實現(xiàn)時SNIP采用了可變形卷積的卷積方式,并且為了降低對于GPU的占用,將原圖隨機裁剪為1000×1000大小的圖像。
          總體來說,SNIP讓模型更專注于物體本身的檢測,剝離了多尺度的學習難題。在網(wǎng)絡(luò)搭建時,SNIP也使用了類似于MST的多尺度訓練方法,構(gòu)建了3個尺度的圖像金字塔,但在訓練時,只對指定范圍內(nèi)的Proposal進行反向傳播,而忽略掉過大或者過小的Proposal。
          SNIP方法雖然實現(xiàn)簡單,但其背后卻蘊藏深意,更深入地分析了當前檢測算法在多尺度檢測上的問題所在,在訓練時只選擇在一定尺度范圍內(nèi)的物體進行學習,在COCO數(shù)據(jù)集上有3%的檢測精度提升,可謂是大道至簡。


          6 TridentNet:三叉戟網(wǎng)絡(luò)


          論文地址:
          https://arxiv.org/abs/1901.01892

          代碼地址:
          https://github.com/TuSimple/simpledet/tree/master/models/tridentnet


          傳統(tǒng)的解決多尺度檢測的算法,大都依賴于圖像金字塔與特征金字塔。與上述算法不同,圖森組對感受野這一因素進行了深入的分析,并利用了空洞卷積這一利器,構(gòu)建了簡單的三分支網(wǎng)絡(luò)TridentNet,對于多尺度物體的檢測有了明顯的精度提升。

          TridentNet網(wǎng)絡(luò)的作者將3種不同的感受野網(wǎng)絡(luò)并行化,提出了如下圖所示的檢測框架。采用ResNet作為基礎(chǔ)Backbone,前三個stage沿用原始的結(jié)構(gòu),在第四個stage,使用了三個感受野不同的并行網(wǎng)絡(luò)。

          具體實現(xiàn)細節(jié)


          (1)3個不同的分支使用了空洞數(shù)不同的空洞卷積,感受野由小到大,可以更好地覆蓋多尺度的物體分布。


          (2)由于3個分支要檢測的內(nèi)容是相同的、要學習的特征也是相同的,只不過是形成了不同的感受野來檢測不同尺度的物體,因此,3個分支共享權(quán)重,這樣既充分利用了樣本信息,學習到更本質(zhì)的目標檢測信息,也減少了參數(shù)量與過擬合的風險。


          (3)借鑒了SNIP的思想,在每一個分支內(nèi)只訓練一定范圍內(nèi)的樣本,避免了過大與過小的樣本對于網(wǎng)絡(luò)參數(shù)的影響。

          在訓練時,TridentNet網(wǎng)絡(luò)的三個分支會接入三個不同的head網(wǎng)絡(luò)進行后續(xù)損失計算。在測試時,由于沒有先驗的標簽來選擇不同的分支,因此只保留了一個分支進行前向計算,這種前向方法只有少量的精度損失。


          具體細節(jié)可以參考論文。

          參考資料

          1.深度學習之PyTorch物體檢測實戰(zhàn) 董洪義
          2.https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1901.01892
          3.https://zhuanlan.zhihu.com/p/74415602
          4.https://zhuanlan.zhihu.com/p/61536443

          推薦閱讀


          來測一測你是幾級的煉丹師?

          添加極市小助手微信(ID : cvmart2),備注:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群:月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

          △長按添加極市小助手

          △長按關(guān)注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 250
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  性猛交ⅩXXXx | 翔田千里菊门无码 | 婷婷亚洲综合 | 就看操逼片 | 国产精品女人久久久久 |