一、FPN網路簡介
FPN(Feature Pyramid Network)網路是一種融合不同尺度feature map並保持信息豐富度的卷積神經網路模型。它是2017年由羅迪尼奧(Lin, Tsung-Yi)等人在IEEE CVPR上提出的。FPN網路有助於解決單尺度特徵學習出現的物體尺度變化導致檢測準確率下降的問題。
特徵金字塔網路(PPN)和SSD單尺度網路前兩篇都介紹過,這裡重點介紹FPN網路。FPN網路是金字塔形的,由bottom-up和top-down兩個過程組成。在bottom-up過程中,各級別的feature map通過降採樣融合得到尺度變小、語義層次更高的feature map;在top-down過程中,這些feature map通過上採樣得到尺度變大、語義層次更低的feature map。融合後的金字塔結構可以有效地提高網路的檢測精度。
二、FPN網路結構
整個FPN網路由兩個主要部分組成:底部的處理模塊和頂部的預測模塊。
1.底部的處理模塊
底部的處理模塊由特徵提取和特徵融合兩部分組成。特徵提取採用ResNet網路、VGG網路等尺度不同的主幹網路。在特徵提取完之後,不同層級的feature map會被送入top-down和bottom-up兩個模塊進行融合處理。
下面是底部的處理模塊的代碼:
<tf.function>
def bottom_up_module(inputs):
c3_output, c4_output, c5_output = inputs
p5_output = Conv2D(256, kernel_size=(1, 1), name='fpn_c5p5')(c5_output)
p4_output = Add(name='fpn_p4add')([
UpSampling2D(size=(2, 2), name='fpn_p5upsampled')(p5_output),
Conv2D(256, kernel_size=(1, 1), name='fpn_c4p4')(c4_output)])
p3_output = Add(name='fpn_p3add')([
UpSampling2D(size=(2, 2), name='fpn_p4upsampled')(p4_output),
Conv2D(256, kernel_size=(1, 1), name='fpn_c3p3')(c3_output)])
return [p3_output, p4_output, p5_output]
2.頂部的預測模塊
頂部的預測模塊由多個分支組成,每個分支在進行對象檢測和分割任務時負責不同尺度下的特徵提取與預測。每個分支包含一個分類分支,一個回歸分支和一個mask分支。分類分支負責對每個anchor進行分類,回歸分支負責精調檢測框位置,mask分支負責行人segmantic segmentation任務。各個分支在融合時使用fpn演算法融合各個尺度的特徵圖,融合後得到一個特徵圖,通過各個分支的輸出進行預測結果。
下面是頂部的預測模塊的代碼:
<tf.function>
def top_down_module(inputs):
feature_maps, fpn_channels = inputs
num_level = len(feature_maps)
for i in range(num_level - 1, 0, -1):
prev_feature_maps = feature_maps[i - 1]
prev_channels = fpn_channels[i - 1]
cur_channels = fpn_channels[i]
top_down = UpsampleLike(name='fpn_p%dupsampled' % i)(
feature_maps[i])
lateral = Conv2D(cur_channels, kernel_size=(1, 1), strides=(1, 1),
padding='valid', name='fpn_p%dlateral' % i)(
feature_maps[i - 1])
merged_data = Add(name='fpn_p%dadd' % i)([top_down, lateral])
feature_maps[i - 1] = Conv2D(prev_channels, kernel_size=(3, 3), padding='same',
name='fpn_p%d' % i)(merged_data)
return feature_maps
三、FPN網路的優點
FPN網路的結構有效地解決了特徵金字塔網路中信息丟失和運算量大的問題,具有以下優點:
1.避免了各級別特徵的信息丟失:在同等計算量下,FPN網路對目標的多尺度特徵感知能力明顯高於其他單尺度網路,在小目標檢測中表現尤為突出。
2.減少了計算量:與金字塔網路和SSD單尺度網路相比,FPN網路具有更少的參數和計算量。
四、FPN網路的應用
1.目標檢測:FPN網路的多尺度特徵可以更好地識別各種尺度的目標,因此廣泛應用於目標檢測場景中。
2.行人檢測:在行人檢測任務中,FPN網路通常使用在Faster R-CNN演算法中,可以極大地提高演算法的準確性。
3.遙感圖像識別:FPN網路在遙感圖像識別中也有其獨特的應用,可以提升遙感圖像檢測精度。
五、FPN網路的代碼示例
下面是一個基於TensorFlow2實現的簡單FPN網路代碼示例:
<tf.function>
def create_fpn_model():
inputs = Input(shape=(None, None, 3))
c3_output, c4_output, c5_output = resnet.get_resnet50_model(inputs)
outputs = fpn.bottom_up_module([c3_output, c4_output, c5_output])
outputs = fpn.top_down_module([outputs, [256, 256, 256]])
model = tf.keras.Model(inputs, outputs, name='fpn')
return model
在上面的代碼中,我們使用ResNet50網路實現底部的特徵提取,然後通過FPN演算法進行特徵融合。
六、總結
FPN網路的創新性地應用了金字塔形的特徵融合結構,從底層到高層處理了尺度不同的特徵,使得網路具有更好的感知能力和識別能力。此外,FPN網路還可以作為基礎模型應用在目標檢測等領域,推動人工智慧技術的發展。
原創文章,作者:IUNGU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332289.html