日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

目标检测中特征融合技术(YOLO v4)(上)

發(fā)布時間:2023/11/28 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标检测中特征融合技术(YOLO v4)(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目標(biāo)檢測中特征融合技術(shù)(YOLO v4)(上)

論文鏈接:https://arxiv.org/abs/1612.03144

Feature Pyramid Networks for Object Detection

Tsung-Yi
Lin, Piotr
Dollár, Ross
Girshick, Kaiming
He, Bharath
Hariharan, Serge
Belongie

PANet(Path
Aggregation Network)

論文地址:

https://arxiv.org/abs/1803.01534

代碼地址:

https://github.com/ShuLiu1993/PANet

M2det: A single-shot object detector
based on multi-level feature pyramid network

論文地址:

https://arxiv.org/abs/1811.04533

代碼地址:

https://github.com/qijiezhao/M2Det

Learning Spatial Fusion for Single-Shot Object Detection,也就是著名的yolov3-asff。

論文地址:

https://arxiv.org/pdf/1911.09516.pdf

代碼地址:

https://github.com/ruinmessi/ASFF

EfficientDet: Scalable and efficient object detection。BiFPN思想和ASFF非常類似,也是可學(xué)習(xí)參數(shù)的自適應(yīng)加權(quán)融合,但是比ASFF更加復(fù)雜。

論文地址:

https://arxiv.org/abs/1901.01892

代碼地址:

https://github.com/google/automl/tree/master/efficientdet(Google官方)

https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch(高星PyTorch復(fù)現(xiàn))

特征融合分類

在深度學(xué)習(xí)的很多工作中(例如目標(biāo)檢測、圖像分割),融合不同尺度的特征是提高性能的一個重要手段。低層特征分辨率更高,包含更多位置、細(xì)節(jié)信息,但是由于經(jīng)過的卷積更少,其語義性更低,噪聲更多。高層特征具有更強的語義信息,但是分辨率很低,對細(xì)節(jié)的感知能力較差。如何將兩者高效融合,取其長處,棄之糟泊,是改善分割模型的關(guān)鍵。

很多工作通過融合多層來提升檢測和分割的性能,按照融合與預(yù)測的先后順序,分類為早融合(Early fusion)和晚融合(Late fusion)。

早融合(Early fusion): 先融合多層的特征,然后在融合后的特征上訓(xùn)練預(yù)測器(只在完全融合之后,才統(tǒng)一進行檢測)。這類方法也被稱為skip connection,即采用concat、add操作。這一思路的代表是Inside-Outside Net(ION)和HyperNet。兩個經(jīng)典的特征融合方法:

(1)concat:系列特征融合,直接將兩個特征進行連接。兩個輸入特征x和y的維數(shù)若為p和q,輸出特征z的維數(shù)為p+q;

(2)add:并行策略,將這兩個特征向量組合成復(fù)向量,對于輸入特征x和y,z = x + iy,其中i是虛數(shù)單位。

晚融合(Late fusion):通過結(jié)合不同層的檢測結(jié)果改進檢測性能(尚未完成最終的融合之前,在部分融合的層上就開始進行檢測,會有多層的檢測,最終將多個檢測結(jié)果進行融合)。這一類研究思路的代表有兩種:

(1)feature不融合,多尺度的feture分別進行預(yù)測,然后對預(yù)測結(jié)果進行綜合,如Single Shot
MultiBox Detector (SSD) , Multi-scale CNN(MS-CNN)

(2)feature進行金字塔融合,融合后進行預(yù)測,如Feature Pyramid Network(FPN)等。

接下來,主要對晚融合方法進行歸納總結(jié)。

Feature Pyramid Network(FPN)

FPN(Feature Pyramid
Network)算法同時利用低層特征高分辨率和高層特征的高語義信息,通過融合這些不同層的特征達到預(yù)測的效果。并且預(yù)測是在每個融合后的特征層上單獨進行的,這和常規(guī)的特征融合方式不同。

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

·
自下而上:最左側(cè)為普通的卷積網(wǎng)絡(luò),默認(rèn)使用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倍最鄰近上采樣,即直接對臨近元素進行復(fù)制,而非線性插值。

·
橫向連接(Lateral
Connection):目的是為了將上采樣后的高語義特征與淺層的定位細(xì)節(jié)特征進行融合。高語義特征經(jīng)過上采樣后,其長寬與對應(yīng)的淺層特征相同,而通道數(shù)固定為256,因此需要對底層特征C2至C4進行11卷積使得其通道數(shù)變?yōu)?56,然后兩者進行逐元素相加得到P4、P3與P2。由于C1的特征圖尺寸較大且語義信息不足,因此沒有把C1放到橫向連接中。

·
卷積融合:在得到相加后的特征后,利用3×3卷積對生成的P2至P4再進行融合,目的是消除上采樣過程帶來的重疊效應(yīng),以生成最終的特征圖。

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

PANet(Path Aggregation Network)

1、縮短信息路徑和用低層級的準(zhǔn)確定位信息增強特征金字塔,創(chuàng)建了自下而上的路徑增強

2、為了恢復(fù)每個建議區(qū)域和所有特征層級之間被破壞的信息,作者開發(fā)了適應(yīng)性特征池化(adaptive
feature pooling)技術(shù),可以將所有特征層級中的特征整合到每個建議區(qū)域中,避免了任意分配的結(jié)果。

3、全連接融合層:使用一個小型fc層用于補充mask預(yù)測

自下而上的路徑增強

Bottom-up Path
Augemtation的提出主要是考慮到網(wǎng)絡(luò)的淺層特征對于實例分割非常重要,不難想到淺層特征中包含大量邊緣形狀等特征,這對實例分割這種像素級別的分類任務(wù)是起到至關(guān)重要的作用的。因此,為了保留更多的淺層特征,論文引入了Bottom-up Path Augemtation。

紅色的箭頭表示在FPN中,因為要走自底向上的過程,淺層的特征傳遞到頂層需要經(jīng)過幾十個甚至上百個網(wǎng)絡(luò)層,當(dāng)然這取決于BackBone網(wǎng)絡(luò)用的什么,因此經(jīng)過這么多層傳遞之后,淺層的特征信息丟失就會比較嚴(yán)重。

綠色的箭頭表作者添加了一個Bottom-up Path Augemtation結(jié)構(gòu),這個結(jié)構(gòu)本身不到10層,這樣淺層特征經(jīng)過原始FPN中的橫向連接到P2然后再從P2沿著Bottom-up Path Augemtation傳遞到頂層,經(jīng)過的層數(shù)不到10層,能較好的保存淺層特征信息。注意,這里的N2和P2表示同一個特征圖。 但N3,N4,N5和P3,P4,P5不一樣,實際上N3,N4,N5是P3,P4,P5融合后的結(jié)果。
Bottom-up Path
Augemtation的詳細(xì)結(jié)構(gòu)如下圖所示,經(jīng)過一個尺寸為,步長為的卷積之后,特征圖尺寸減小為原來的一半然后和這個特征圖做add操作,得到的結(jié)果再經(jīng)過一個卷積核尺寸為,的卷積層得到。

Bottom-up Path Augemtation詳細(xì)結(jié)構(gòu)

適應(yīng)性特征池化(adaptive feature pooling)

論文指出,在Faster-RCNN系列的標(biāo)檢測或分割算法中,RPN網(wǎng)絡(luò)得到的ROI需要經(jīng)過ROI
Pooling或ROI Align提取ROI特征,這一步操作中每個ROI所基于的特征都是單層特征,FPN同樣也是基于單層特征,因為檢測頭是分別接在每個尺度上的。

本文提出的Adaptive
Feature Pooling則是將單層特征換成多層特征,即每個ROI需要和多層特征(論文中是4層)做ROI Align的操作,然后將得到的不同層的ROI特征融合在一起,這樣每個ROI特征就融合了多層特征。

RPN網(wǎng)絡(luò)獲得的每個ROI都要分別和特征層做ROI Align操作,這樣個ROI就提取到4個不同的特征圖,然后將4個不同的特征圖融合在一起就得到最終的特征,后續(xù)的分類和回歸都是基于此最終的特征進行。

全連接融合層(Fully-Connected Fusion)

全連接融合層對原有的分割支路(FCN)引入一個前景二分類的全連接支路,通過融合這兩條支路的輸出得到更加精確的分割結(jié)果。這個模塊的具體實現(xiàn)如圖所示。

Fully-Connected Fusion模塊

從圖中可以看到這個結(jié)構(gòu)主要是在原始的Mask支路(即帶deconv那條支路)的基礎(chǔ)上增加了下面那個支路做融合。增加的這個支路包含個的卷積層,然后接一個全連接層,再經(jīng)過reshape操作得到維度和上面支路相同的前背景Mask,即是說下面這個支路做的就是前景和背景的二分類,輸出維度類似于文中說的。而上面的支路輸出維度類似,其中代表數(shù)據(jù)集目標(biāo)類別數(shù)。最終,這兩條支路的輸出Mask做融合以獲得更加精細(xì)的最終結(jié)果。

MLFPN

MLFPN來自《M2det: A single-shot object
detector based on multi-level feature pyramid network》。

之前的特征金字塔目標(biāo)檢測網(wǎng)絡(luò)共有的兩個問題是:

1、原本 backbone 是用于目標(biāo)分類的網(wǎng)絡(luò),導(dǎo)致用于目標(biāo)檢測的語義特征不足;

2、每個用于目標(biāo)檢測的特征層主要或者僅僅是由單級特征層(single-level layers)構(gòu)成,也就是僅僅包含了單級信息;

這種思想導(dǎo)致一個很嚴(yán)重的問題,對分類子網(wǎng)絡(luò)來說更深更高的層更容易區(qū)分,對定位的回歸任務(wù)來說使用更低更淺的層比較好。此外,底層特征更適合描述具有簡單外觀的目標(biāo),而高層特征更適合描述具有復(fù)雜外觀的目標(biāo)。在實際中,具有相似大小目標(biāo)實例的外觀可能非常不同。例如一個交通燈和一個遠(yuǎn)距離的人可能具有可以比較的尺寸,但是人的外表更加復(fù)雜。因此,金字塔中的每個特征圖主要或者僅僅由單層特征構(gòu)成可能會導(dǎo)致次優(yōu)的檢測性能。

為了更好地解決目標(biāo)檢測中尺度變化帶來的問題,M2det提出一種更有效的特征金字塔結(jié)構(gòu)MLFPN, 其大致流程如下圖所示:首先,對主干網(wǎng)絡(luò)提取到的特征進行融合;然后通過TUM和FFM提取更有代表性的Multi-level&Mutli-scale特征;最后通過SFAM融合多級特征,得到多級特征金字塔用于最終階段的預(yù)測。M2Det使用主干網(wǎng)絡(luò)+MLFPN來提取圖像特征,然后采用類似SSD的方式預(yù)測密集的包圍框和類別得分,通過NMS得到最后的檢測結(jié)果。

如上圖所示,MLFPN主要有3個模塊組成:

1)特征融合模塊FFM;

2)細(xì)化U型模塊TUM;

3)尺度特征聚合模塊SFAM.

首先, FFMv1對主干網(wǎng)絡(luò)提取到的淺層和深層特征進行融合,得到base feature;

其次,堆疊多個TUM和FFMv2,每個TUM可以產(chǎn)生多個不同scale的feature
map,每個FFMv2融合base feature和上一個TUM的輸出,并給到下一個TUM作為輸入(更高level)。

最后,SFAM通過scale-wise拼接和channel-wise attention來聚合multi-level&multi-scale的特征。

· 特征融合模塊FFM

FFM用于融合M2Det中不同級別的特征,先通過1x1卷積壓縮通道數(shù),再進行拼接。

FFM1 用于融合深層和和淺層特征,為 MLFPN 提供基本輸入的特征層(Base Feature);由于 M2Det 使用了 VGG 作為 backbone,因此
FFM1 取出了 Conv4_3 和 Conv5_3 作為輸入:FFMv1使用兩種不同scale的feature
map作為輸入,所以在拼接操作之前加入了上采樣操作來調(diào)整大小;

FFMv2用于融合 MLFPN 的基本輸入(Base Feature)和上一個 TUM 模塊的輸出,兩個輸入的scale相同,所以比較簡單。

· 細(xì)化U型模塊TUM

TUM使用了比FPN和RetinaNet更薄的U型網(wǎng)絡(luò)。在上采樣和元素相加操作之后加上1x1卷積來加強學(xué)習(xí)能力和保持特征平滑度。TUM中每個解碼器的輸出共同構(gòu)成了該TUM的multi-scale輸出。每個TUM的輸出共同構(gòu)成了multi-level&multi-scale特征,前面的TUM提供low level feature,后面的TUM提供high level feature。

TUM 的編碼器(encoder)使用 3×3 大小、步長為 2 的卷積層進行特征提取,特征圖不斷縮小;解碼器(decoder)同過雙線性插值的方法將特征圖放大回原大小。

· 尺度特征聚合模塊SFAM

SFAM旨在聚合TUMs產(chǎn)生的多級多尺度特征,以構(gòu)造一個多級特征金字塔。在first stage,SFAM沿著channel維度將擁有相同scale的feature map進行拼接,這樣得到的每個scale的特征都包含了多個level的信息。然后在second stage,借鑒SENet的思想,加入channel-wise attention,以更好地捕捉有用的特征。SFAM的細(xì)節(jié)如下圖所示:

網(wǎng)絡(luò)配置

M2Det的主干網(wǎng)絡(luò)采用VGG-16和ResNet-101。

MLFPN的默認(rèn)配置包含有8個TUM,每個TUM包含5個跨步卷積核5個上采樣操作,所以每個TUM的輸出包含了6個不同scale的特征。

在檢測階段,為6組金字塔特征每組后面添加兩個卷積層,以分別實現(xiàn)位置回歸和分類。

后處理階段,使用soft-NMS來過濾無用的包圍框。

總結(jié)

以上是生活随笔為你收集整理的目标检测中特征融合技术(YOLO v4)(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。