偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

特征金字塔網(wǎng)絡(luò)及變體【詳解及代碼實(shí)現(xiàn)】

開發(fā) 人工智能
特征金字塔網(wǎng)絡(luò)徹底改變了我們?cè)谏窠?jīng)網(wǎng)絡(luò)中處理多尺度特征表示的方式,本文將深入探討FPN。

在深度學(xué)習(xí)和計(jì)算機(jī)視覺領(lǐng)域,架構(gòu)創(chuàng)新在推動(dòng)技術(shù)進(jìn)步中發(fā)揮了重要作用。在這些創(chuàng)新中,特征金字塔網(wǎng)絡(luò)(Feature Pyramid Networks, FPN)脫穎而出,成為革命性的基礎(chǔ)構(gòu)建模塊,徹底改變了我們?cè)谏窠?jīng)網(wǎng)絡(luò)中處理多尺度特征表示的方式。本文將深入探討FPN。

一、現(xiàn)代神經(jīng)網(wǎng)絡(luò)的三個(gè)主要組成部分(骨干網(wǎng)絡(luò)、頸部網(wǎng)絡(luò)和頭部網(wǎng)絡(luò))  

在深入FPN之前,了解現(xiàn)代計(jì)算機(jī)視覺神經(jīng)網(wǎng)絡(luò)的三個(gè)主要組成部分非常重要:

1. 骨干網(wǎng)絡(luò)(Backbone)

骨干網(wǎng)絡(luò)通常是一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(如ResNet或VGG),作為主要特征提取器。它處理原始輸入圖像,并生成不同尺度的層次化特征表示。可以將其視為捕捉從邊緣、紋理到高級(jí)語義信息的基礎(chǔ)。

2. 頸部網(wǎng)絡(luò)(Neck)

頸部網(wǎng)絡(luò)是骨干網(wǎng)絡(luò)和頭部網(wǎng)絡(luò)之間的特征融合和增強(qiáng)模塊。其主要目的是處理和組合來自骨干網(wǎng)絡(luò)不同尺度或階段的特征,以生成更具判別性的特征表示??梢詫⑵湟暈橐粋€(gè)加工廠,將來自不同來源的原材料(特征)提煉成更有用的產(chǎn)品。  

頸部網(wǎng)絡(luò)可以執(zhí)行多種操作,例如:  

  • 跨不同尺度的特征融合  
  • 通過額外卷積增強(qiáng)特征  
  • 管理不同網(wǎng)絡(luò)層級(jí)之間的信息流  

特征金字塔網(wǎng)絡(luò)是頸部網(wǎng)絡(luò)架構(gòu)的一種流行實(shí)現(xiàn),但還有其他實(shí)現(xiàn),如路徑聚合網(wǎng)絡(luò)(PANet)和高分辨率網(wǎng)絡(luò)(HRNet)。

3. 頭部網(wǎng)絡(luò)(Head)

頭部網(wǎng)絡(luò)是任務(wù)特定的組件,使用經(jīng)過優(yōu)化的特征進(jìn)行最終預(yù)測(cè)。不同任務(wù)(檢測(cè)、分割、分類)需要不同的頭部架構(gòu),但它們都受益于頸部網(wǎng)絡(luò)提供的經(jīng)過良好處理的特征。

二、為什么需要特征金字塔網(wǎng)絡(luò)?  

計(jì)算機(jī)視覺中的多尺度挑戰(zhàn)源于傳統(tǒng)CNN架構(gòu)的多個(gè)基本限制:  

1. 特征層次問題

隨著CNN的深入,空間分辨率降低,而語義層次提高。例如,在典型的ResNet中:  

  • 早期層(如Conv1)具有1/2分辨率,捕捉基本特征(邊緣、紋理)  
  • 中間層(如Conv3)具有1/8分辨率,捕捉中級(jí)特征(部件、模式)  
  • 深層(如Conv5)具有1/32分辨率,捕捉高級(jí)特征(物體、場(chǎng)景)  

2. 尺度變化

自然圖像中的物體以不同的尺度出現(xiàn)。例如,在自動(dòng)駕駛中:  

  • 附近的行人可能占據(jù)300x600像素  
  • 遠(yuǎn)處的車輛可能僅占據(jù)30x60像素  
  • 交通標(biāo)志可能以任何大小出現(xiàn)  

3. 信息丟失 

傳統(tǒng)的特征金字塔(如圖像金字塔)保持了空間分辨率,但在較低層次缺乏語義強(qiáng)度,使其在現(xiàn)代深度學(xué)習(xí)中效率低下。這些問題的結(jié)合構(gòu)成了計(jì)算機(jī)視覺中的重大挑戰(zhàn)。  

現(xiàn)實(shí)世界的例子:想象一輛自動(dòng)駕駛汽車試圖檢測(cè)街道上的物體。  攝像頭看到的物體距離不同,有些近,有些遠(yuǎn)。  要檢測(cè)遠(yuǎn)處的行人,系統(tǒng)需要處理高分辨率(詳細(xì))圖像以捕捉小細(xì)節(jié)。  但問題在于:處理這些詳細(xì)圖像的早期網(wǎng)絡(luò)層并不擅長(zhǎng)理解內(nèi)容。它們可能看到人的基本形狀,但無法區(qū)分是行人還是路燈桿,因?yàn)樗鼈內(nèi)狈ι顚哟蔚睦斫狻?nbsp; 

為什么不使用傳統(tǒng)方法(如圖像金字塔)?  這種方法提取的特征信息不夠豐富,無法真正用于現(xiàn)代深度學(xué)習(xí)。  

我們陷入了兩難選擇: 要么獲得良好的細(xì)節(jié)但理解力差,要么獲得良好的理解力但細(xì)節(jié)差。這就像在放大鏡(能看清細(xì)節(jié)但無法識(shí)別物體)和模糊眼鏡(能識(shí)別物體但看不清細(xì)節(jié))之間做出選擇。  這種“看清”與“理解”之間的權(quán)衡正是研究人員開發(fā)特征金字塔網(wǎng)絡(luò)的原因——最終解決這一困境。

三、特征金字塔網(wǎng)絡(luò)(FPN)

圖片、、圖片、、

FPN通過三個(gè)關(guān)鍵組件結(jié)合了低層次和高層次特征:  

(1) 自下而上路徑(骨干網(wǎng)絡(luò))

  • 這是常規(guī)的卷積神經(jīng)網(wǎng)絡(luò)前向傳播。  
  • 特征逐漸變得更語義化,但空間分辨率降低。  
  • 每個(gè)階段輸出不同尺度的特征圖(C?, C?, C?, C?)。  

(2) 自上而下路徑

  • 從最深層開始,逐步上采樣空間較粗糙但語義較強(qiáng)的特征。  
  • 創(chuàng)建更高分辨率的特征(P?, P?, P?, P?)。  
  • 使用最近鄰上采樣來增加分辨率。  

(3) 橫向連接 

  • 1x1卷積減少骨干網(wǎng)絡(luò)特征的通道維度。  
  • 逐元素加法合并自下而上和自上而下的特征。  
  • 3x3卷積平滑合并后的特征。  

1. 技術(shù)過程

  • 提取自下而上的特征 {C?, C?, C?, C?}  
  • 通過1x1卷積處理頂層特征C?以創(chuàng)建P?  
  • 上采樣P?并與處理后的C?合并以創(chuàng)建P?  
  • 此過程持續(xù)到P?  
  • 最終金字塔的每個(gè)層級(jí) {P?, P?, P?, P?} 包含豐富的語義信息,同時(shí)保持適當(dāng)?shù)目臻g分辨率  

2. 示例代碼  

以下是一個(gè)使用ResNet-18骨干網(wǎng)絡(luò)實(shí)現(xiàn)FPN進(jìn)行圖像分類的示例代碼。  

import torch
import torch.nn as nn
import torchvision.models as models

class FPNNeck(nn.Module):
    def __init__(self, in_channels_list, out_channels):
        super(FPNNeck, self).__init__()
        
        # Lateral connections (1x1 convolutions)
        self.lateral_convs = nn.ModuleList([
            nn.Conv2d(in_channels, out_channels, 1)
            for in_channels in in_channels_list
        ])
        
        # Top-down pathway (upsampling + smoothing)
        self.fpn_convs = nn.ModuleList([
            nn.Conv2d(out_channels, out_channels, 3, padding=1)
            for _ in range(len(in_channels_list))
        ])
        
    def forward(self, features):
        # features should be ordered from highest resolution to lowest
        laterals = [conv(feature) for feature, conv in zip(features, self.lateral_convs)]
        
        # Top-down pathway
        for i in range(len(laterals)-1, 0, -1):
            laterals[i-1] += nn.functional.interpolate(
                laterals[i], size=laterals[i-1].shape[-2:], mode='nearest'
            )
        
        # Smoothing
        outputs = [conv(lateral) for lateral, conv in zip(laterals, self.fpn_convs)]
        return outputs

class ResNetFPN(nn.Module):
    def __init__(self, num_classes):
        super(ResNetFPN, self).__init__()
        
        # Load pretrained ResNet-18 as backbone
        resnet = models.resnet18(pretrained=True)
        self.backbone_layers = nn.ModuleList([
            nn.Sequential(resnet.conv1, resnet.bn1, resnet.relu, resnet.maxpool, resnet.layer1),
            resnet.layer2,
            resnet.layer3,
            resnet.layer4
        ])
        
        # FPN neck
        in_channels_list = [64, 128, 256, 512]  # ResNet-18 output channels
        self.fpn = FPNNeck(in_channels_list, out_channels=256)
        
        # Classification head
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(256 * 4, num_classes)  # 4 feature maps from FPN
        
    def forward(self, x):
        # Extract features from backbone
        features = []
        for layer in self.backbone_layers:
            x = layer(x)
            features.append(x)
            
        # FPN forward pass
        fpn_features = self.fpn(features)
        
        # Global average pooling on each FPN level
        pooled_features = []
        for feature in fpn_features:
            pooled = self.avgpool(feature)
            pooled_features.append(pooled.flatten(1))
            
        # Concatenate all pooled features
        x = torch.cat(pooled_features, dim=1)
        x = self.fc(x)
        
        return x
import torch
import torch.nn as nn
import torchvision.models as models

class FPNNeck(nn.Module):
    def __init__(self, in_channels_list, out_channels):
        super(FPNNeck, self).__init__()
        
        # Lateral connections (1x1 convolutions)
        self.lateral_convs = nn.ModuleList([
            nn.Conv2d(in_channels, out_channels, 1)
            for in_channels in in_channels_list
        ])
        
        # Top-down pathway (upsampling + smoothing)
        self.fpn_convs = nn.ModuleList([
            nn.Conv2d(out_channels, out_channels, 3, padding=1)
            for _ in range(len(in_channels_list))
        ])

FPNNeck類實(shí)現(xiàn)了FPN的核心架構(gòu):  

  • `lateral_convs` 創(chuàng)建1x1卷積,減少來自不同層級(jí)骨干網(wǎng)絡(luò)特征的通道維度。  
  • `fpn_convs` 是3x3卷積,用于平滑合并后的特征。  
def forward(self, features):
        # features should be ordered from highest resolution to lowest
        laterals = [conv(feature) for feature, conv in zip(features, self.lateral_convs)]
        
        # Top-down pathway
        for i in range(len(laterals)-1, 0, -1):
            laterals[i-1] += nn.functional.interpolate(
                laterals[i], size=laterals[i-1].shape[-2:], mode='nearest'
            )
        
        # Smoothing
        outputs = [conv(lateral) for lateral, conv in zip(laterals, self.fpn_convs)]
        return outputs

前向傳播展示了FPN如何處理特征:

  • 它對(duì)所有特征層級(jí)應(yīng)用橫向卷積。  
  • 它實(shí)現(xiàn)自上而下的路徑:從最深層開始,上采樣特征并將其添加到上一層級(jí)。  
  • 它對(duì)所有層級(jí)應(yīng)用平滑卷積。
class ResNetFPN(nn.Module):
    def __init__(self, num_classes):
        super(ResNetFPN, self).__init__()
        
        # Load pretrained ResNet-18 as backbone
        resnet = models.resnet18(pretrained=True)
        self.backbone_layers = nn.ModuleList([
            nn.Sequential(resnet.conv1, resnet.bn1, resnet.relu, resnet.maxpool, resnet.layer1),
            resnet.layer2,
            resnet.layer3,
            resnet.layer4
        ])

ResNetFPN類組合所有內(nèi)容:  

  • 使用預(yù)訓(xùn)練的ResNet-18作為骨干網(wǎng)絡(luò)。  
  • 添加FPN頸部網(wǎng)絡(luò)以處理來自ResNet四個(gè)階段的特征。  
  • 添加一個(gè)簡(jiǎn)單的分類頭,用于池化每個(gè)FPN層級(jí)的特征并最終分類。  
# FPN neck
        in_channels_list = [64, 128, 256, 512]  # ResNet-18 output channels
        self.fpn = FPNNeck(in_channels_list, out_channels=256)
        
        # Classification head
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(256 * 4, num_classes)  # 4 feature maps from FPN

對(duì)于分類任務(wù):我們創(chuàng)建FPN頸部網(wǎng)絡(luò),用于處理來自ResNet四個(gè)階段的特征。我們添加一個(gè)簡(jiǎn)單的分類頭,其功能包括:

  • 對(duì)每個(gè)FPN層級(jí)的特征進(jìn)行池化
  • 將它們連接在一起
  • 進(jìn)行最終的分類
def forward(self, x):
        # Extract features from backbone
        features = []
        for layer in self.backbone_layers:
            x = layer(x)
            features.append(x)
            
        # FPN forward pass
        fpn_features = self.fpn(features)
        
        # Global average pooling on each FPN level
        pooled_features = []
        for feature in fpn_features:
            pooled = self.avgpool(feature)
            pooled_features.append(pooled.flatten(1))
            
        # Concatenate all pooled features
        x = torch.cat(pooled_features, dim=1)
        x = self.fc(x)
        
        return x

前向傳播將所有內(nèi)容結(jié)合在一起:

  • 輸入圖像通過ResNet骨干網(wǎng)絡(luò),收集每個(gè)階段的特征。
  • 這些特征通過FPN頸部網(wǎng)絡(luò),生成特征金字塔。
  • 我們對(duì)金字塔的每個(gè)層級(jí)的特征進(jìn)行池化。
  • 最后,我們結(jié)合所有這些特征以進(jìn)行最終的分類預(yù)測(cè)。

四、變體(特征金字塔網(wǎng)絡(luò)的演進(jìn))  

自FPN誕生以來,研究人員對(duì)其進(jìn)行了多種改進(jìn)。以下是一些常見變體:  

1. PANet(路徑聚合網(wǎng)絡(luò))

  • 通過添加額外的自下而上路徑增強(qiáng)信息流。  
  • 用于實(shí)例分割的Mask Scoring R-CNN和實(shí)時(shí)目標(biāo)檢測(cè)的Thunder-Net。  

2. BiFPN(雙向FPN)

  • 引入加權(quán)雙向跨尺度連接。  
  • 用于EfficientDet系列目標(biāo)檢測(cè)器。  

3. 最新模型(2023-2024)

  • RT-DETR:使用基于變形Transformer的FPN變體。  
  • DINO-V2:實(shí)現(xiàn)混合FPN-Transformer頸部網(wǎng)絡(luò)。  
  • YOLOv8:采用受FPN啟發(fā)的改進(jìn)CSP-PAN頸部網(wǎng)絡(luò)。  

五、結(jié)論  

特征金字塔網(wǎng)絡(luò)代表了計(jì)算機(jī)視覺架構(gòu)設(shè)計(jì)的一項(xiàng)重大成就。其有效處理多尺度特征表示并保持計(jì)算效率的能力,使其成為現(xiàn)代計(jì)算機(jī)視覺系統(tǒng)中不可或缺的組成部分。隨著領(lǐng)域的不斷發(fā)展,F(xiàn)PN的影響可以在新架構(gòu)中看到,其設(shè)計(jì)原則繼續(xù)激發(fā)神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的創(chuàng)新。  

責(zé)任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2017-07-26 10:32:51

計(jì)算機(jī)視覺卷積神經(jīng)網(wǎng)絡(luò)FPN

2017-08-02 00:12:50

CVPR 2017論文FPN網(wǎng)絡(luò)

2018-10-11 15:05:56

測(cè)試軟件自動(dòng)化

2021-01-25 06:37:06

Css前端CSS 特效

2020-04-27 13:45:08

數(shù)據(jù)流沙Filecoin

2018-01-26 08:54:29

存儲(chǔ)SSDHDD

2022-12-13 15:41:41

測(cè)試軟件開發(fā)

2013-03-14 09:46:05

移動(dòng)創(chuàng)業(yè)諾基亞NEIC大師論道

2009-11-04 10:51:19

程序員職業(yè)規(guī)劃

2010-07-08 14:02:35

UML建模流程

2024-11-21 10:58:05

模型AI

2022-12-29 16:09:25

2022-09-03 08:06:44

測(cè)試開發(fā)DevOps

2025-05-20 08:15:00

AI大模型架構(gòu)

2020-04-08 08:00:00

開發(fā)者金字塔模型

2019-07-04 17:42:57

開發(fā)技能模型

2009-10-29 11:21:11

IT運(yùn)維管理體系

2020-04-12 13:05:45

ASFApache董事會(huì)

2024-06-26 10:16:41

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)