檢測實(shí)現(xiàn))
1. 項(xiàng)目概述從“暴力搜索”到“優(yōu)雅卷積”在計(jì)算機(jī)視覺特別是目標(biāo)檢測任務(wù)里“滑動窗口”是一個(gè)古老而經(jīng)典的方法。想象一下你要在一張圖片里找一只貓。最樸素的想法是拿一個(gè)固定大小的“框”比如100x100像素從圖片的左上角開始把這個(gè)框一點(diǎn)點(diǎn)地、一格一格地向右、向下移動每移動到一個(gè)新位置就把框里的圖像截取出來扔給一個(gè)分類器比如一個(gè)訓(xùn)練好的貓/非貓分類模型去判斷“這里有沒有貓”。這就是傳統(tǒng)的滑動窗口檢測。它直觀但有一個(gè)致命的缺點(diǎn)計(jì)算成本高得嚇人。假設(shè)一張400x400的圖片我們用100x100的窗口以步長stride10像素進(jìn)行滑動。那么水平方向需要滑動(400-100)/10 1 31次垂直方向同樣31次總共需要執(zhí)行31 * 31 961次前向傳播forward pass。如果你的分類器是一個(gè)復(fù)雜的卷積神經(jīng)網(wǎng)絡(luò)CNN比如YOLO或Fast R-CNN的某個(gè)變體這961次獨(dú)立的CNN推理足以讓實(shí)時(shí)檢測成為泡影。那么有沒有辦法讓這961次計(jì)算“合而為一”一次性完成對所有可能窗口的評估呢這就是“滑動窗口的卷積實(shí)現(xiàn)”要解決的核心問題。它不是一個(gè)新算法而是一種將全連接層等價(jià)轉(zhuǎn)換為卷積層的計(jì)算技巧從而利用CNN固有的空間共享計(jì)算特性將多次獨(dú)立的滑動窗口分類融合成一次高效的全圖卷積計(jì)算。簡單說它把“挪動窗口截取圖片再預(yù)測”的過程變成了“讓整個(gè)網(wǎng)絡(luò)像一塊海綿一樣吸過整張圖片直接吐出密集預(yù)測圖”的過程。這不僅是速度上的飛躍更是理解現(xiàn)代單階段檢測器如SSD, YOLO和全卷積網(wǎng)絡(luò)FCN思想的關(guān)鍵基石。2. 核心思路全連接層與卷積層的等價(jià)轉(zhuǎn)換要理解這個(gè)技巧我們必須先深入CNN的末端。一個(gè)典型的用于圖像分類的CNN例如VGG或AlexNet其結(jié)構(gòu)通常是若干卷積層和池化層 - 展平層Flatten- 若干全連接層Fully Connected Layers- 輸出層如Softmax。2.1 傳統(tǒng)流程的瓶頸在傳統(tǒng)滑動窗口方法中我們截取的每個(gè)100x100的子圖都會獨(dú)立地走一遍這個(gè)流程輸入子圖 - 卷積/池化特征提取- 展平 - 全連接 - 輸出。問題就出在“展平 - 全連接”這一步。全連接層要求固定的輸入維度。假設(shè)經(jīng)過前面的卷積池化后我們得到一個(gè)5x5x256的特征圖即高5寬5通道數(shù)256展平后就是6400 (5*5*256)個(gè)神經(jīng)元。第一個(gè)全連接層可能有4096個(gè)神經(jīng)元這就意味著一個(gè)6400x4096的巨大權(quán)重矩陣。每輸入一個(gè)子圖就要用這個(gè)矩陣做一次矩陣乘法。當(dāng)我們滑動窗口時(shí)每個(gè)子圖經(jīng)過前面的卷積池化理論上都會得到一個(gè)5x5x256的特征圖因?yàn)榫W(wǎng)絡(luò)結(jié)構(gòu)固定。這相當(dāng)于我們在重復(fù)進(jìn)行成千上萬次完全相同的、且計(jì)算量巨大的矩陣乘法而其中包含了大量的冗余計(jì)算。2.2 洞察全連接層就是特殊的卷積層這里的關(guān)鍵洞察在于一個(gè)全連接層可以看作是一個(gè)卷積核大小與其輸入特征圖空間尺寸完全相同的卷積層。讓我們用上面的例子具體化輸入到第一個(gè)全連接層的特征圖尺寸是5x5x256。全連接層有4096個(gè)神經(jīng)元。這意味著它有4096個(gè)“過濾器”每個(gè)過濾器負(fù)責(zé)連接到輸入特征圖的每一個(gè)空間位置5x5和每一個(gè)通道256。所以每個(gè)過濾器的尺寸就是5x5x256。這個(gè)全連接層的作用就是對5x5x256的輸入?yún)^(qū)域進(jìn)行一次全局的加權(quán)求和輸出一個(gè)標(biāo)量對于該過濾器。因?yàn)橛?096個(gè)過濾器所以輸出是一個(gè)4096維的向量。現(xiàn)在我們把它看成卷積層卷積核尺寸5x5x256與原全連接層權(quán)重張量形狀一致。輸入特征圖5x5x256。步長stride通常為1。填充padding為了讓輸出尺寸匹配這里需要padding0因?yàn)楹舜笮〉扔谳斎氪笮utput_size (input_size - kernel_size 2*padding)/stride 1 1。輸出特征圖1x1x4096。看這完全等價(jià)一個(gè)輸入為5x5x256輸出為4096維向量的全連接層嚴(yán)格等價(jià)于一個(gè)使用4096個(gè)5x5x256卷積核、stride1、padding0的卷積層其輸出是一個(gè)1x1x4096的特征圖。2.3 思維的飛躍輸入更大的特征圖傳統(tǒng)分類網(wǎng)絡(luò)的輸入是固定大小的如100x100經(jīng)過一系列卷積池化后得到固定大小的特征圖如5x5。如果我們不改變網(wǎng)絡(luò)權(quán)重但輸入一張更大的圖片如400x400呢假設(shè)網(wǎng)絡(luò)結(jié)構(gòu)使得100x100的輸入對應(yīng)5x5的輸出。那么對于400x400的輸入經(jīng)過同樣的卷積和池化操作注意這些操作不要求固定輸入尺寸我們可能會得到一個(gè)更大的特征圖例如20x20x256具體尺寸取決于網(wǎng)絡(luò)的下采樣倍數(shù)這里假設(shè)是20倍下采樣400/2020。現(xiàn)在我們把之前等價(jià)轉(zhuǎn)換得到的那個(gè)“卷積版全連接層”應(yīng)用到這個(gè)20x20x256的特征圖上輸入特征圖20x20x256卷積核來自原全連接層5x5x256共4096個(gè)。步長1填充0輸出特征圖尺寸計(jì)算(20 - 5 0)/1 1 16。所以輸出是16x16x4096。這個(gè)16x16x4096的輸出意味著什么它意味著對于原始400x400輸入圖片我們在特征空間上生成了一個(gè)16x16的“網(wǎng)格”。這個(gè)網(wǎng)格中的每一個(gè)點(diǎn)(i, j)都對應(yīng)著原始輸入圖片中某個(gè)特定區(qū)域一個(gè)滑動窗口的4096維特征向量16x16的網(wǎng)格是怎么來的它正好對應(yīng)了我們在原始圖片上以某種步長滑動窗口時(shí)所有可能窗口中心在特征圖上的投影。原來需要滑動961次進(jìn)行961次獨(dú)立的全連接計(jì)算。現(xiàn)在我們只進(jìn)行了一次覆蓋整個(gè)20x20特征圖的卷積操作就一次性得到了所有16x16256個(gè)位置在特征圖尺度上的“全連接層輸出”。這實(shí)現(xiàn)了巨大的計(jì)算共享。注意這里16x16是特征圖尺度上的窗口數(shù)量。對應(yīng)回原圖由于有下采樣一個(gè)特征圖上的像素點(diǎn)可能對應(yīng)原圖上一個(gè)20x20的區(qū)域即感受野。所以這16x16個(gè)預(yù)測對應(yīng)了原圖上16*20320像素范圍內(nèi)、以特征圖步長為單位的密集預(yù)測網(wǎng)格。這比原圖的961個(gè)窗口要少是因?yàn)槲覀兪窃诟橄蟮奶卣鲌D上進(jìn)行“滑動”步長和窗口大小都是特征圖意義上的效率更高。3. 完整架構(gòu)轉(zhuǎn)換與實(shí)操步驟理解了核心等價(jià)原理后我們將一個(gè)傳統(tǒng)的“分類CNN”轉(zhuǎn)換為一個(gè)“全卷積網(wǎng)絡(luò)FCN”用于密集預(yù)測。下面以將一個(gè)訓(xùn)練好的貓分類器輸入100x100輸出是/否改造為貓檢測器為例詳細(xì)拆解步驟。3.1 訓(xùn)練階段的網(wǎng)絡(luò)分類網(wǎng)絡(luò)假設(shè)我們用于訓(xùn)練的分類網(wǎng)絡(luò)結(jié)構(gòu)如下一個(gè)簡化版VGGInput:(100, 100, 3)Conv2D (32 filters, 3x3, paddingsame) - ReLUMaxPooling2D (2x2)Conv2D (64 filters, 3x3, paddingsame) - ReLUMaxPooling2D (2x2)Conv2D (128 filters, 3x3, paddingsame) - ReLUMaxPooling2D (2x2) # 此時(shí)特征圖尺寸為 (12, 12, 128)? 我們需要精確計(jì)算。FlattenDense (256 units) - ReLU # 第一個(gè)全連接層Dense (1 unit) - Sigmoid # 輸出層我們需要精確計(jì)算經(jīng)過所有池化層后的特征圖尺寸。假設(shè)所有卷積paddingsame保持尺寸只有池化層減半尺寸。輸入: 100x100經(jīng)過Pool1 (2x2): 50x50經(jīng)過Pool2 (2x2): 25x25經(jīng)過Pool3 (2x2):12.5x12.5 這出現(xiàn)了小數(shù)在實(shí)際網(wǎng)絡(luò)中這是不允許的說明我們的輸入尺寸或網(wǎng)絡(luò)設(shè)計(jì)有問題。為了演示的清晰性我們調(diào)整網(wǎng)絡(luò)或輸入尺寸。更常見的做法是設(shè)計(jì)網(wǎng)絡(luò)使得下采樣后得到整數(shù)尺寸。讓我們重新設(shè)計(jì)一個(gè)更合理的示例網(wǎng)絡(luò)使用paddingvalid即無填充的卷積以便更清晰地計(jì)算尺寸。假設(shè)輸入為100x100x3。Conv2D(32, 3x3, strides1, paddingvalid): 輸出尺寸(100-30)/11 98-98x98x32MaxPool2D(2x2, strides2):98/2 49-49x49x32Conv2D(64, 3x3, strides1, paddingvalid):(49-30)/11 47-47x47x64MaxPool2D(2x2, strides2):47/2 23.5- 向下取整 實(shí)際上池化層默認(rèn)是ceil模式這又會產(chǎn)生歧義。為了絕對清晰我們使用深度學(xué)習(xí)框架中常見的配置卷積使用paddingsame保持尺寸池化層尺寸整除。最終確定的訓(xùn)練網(wǎng)絡(luò)概念模型我們關(guān)注原理暫不糾結(jié)于絕對精確的尺寸數(shù)字。關(guān)鍵在于經(jīng)過一系列卷積和池化后我們得到一個(gè)空間尺寸為H_f x W_f x C的特征圖例如6x6x128然后將其展平送入全連接層。假設(shè)最終特征圖尺寸為6x6x128。Flatten 后:6*6*128 4608維向量。Dense(256): 這是一個(gè)權(quán)重矩陣為(4608, 256)的全連接層。Dense(1): 權(quán)重矩陣為(256, 1)。這個(gè)網(wǎng)絡(luò)在大量100x100的貓/非貓圖片上訓(xùn)練學(xué)會了區(qū)分局部圖像塊是否為貓。3.2 推理階段的轉(zhuǎn)換全卷積網(wǎng)絡(luò)現(xiàn)在我們想在400x400的大圖上做檢測。步驟如下步驟1移除展平層Flatten和全連接層Dense我們將網(wǎng)絡(luò)從Flatten層之前截?cái)唷N覀兊奶卣魈崛∑鳜F(xiàn)在是Input - [ConvPooling Layers] - Output Feature Map (H_f, W_f, C)。步驟2將第一個(gè)全連接層Dense(256)轉(zhuǎn)換為卷積層原全連接層輸入維度4608 (6*6*128)。原全連接層輸出維度256。轉(zhuǎn)換規(guī)則創(chuàng)建一個(gè)卷積層其卷積核尺寸等于該全連接層所“看到”的輸入特征圖的空間尺寸通道數(shù)等于輸入特征圖的通道數(shù)濾波器的數(shù)量等于全連接層的輸出單元數(shù)。因此新的卷積層參數(shù)為Conv2D(filters256, kernel_size(6, 6), strides(1, 1), paddingvalid)。權(quán)重移植這是最關(guān)鍵的一步。原全連接層的權(quán)重矩陣W形狀為(4608, 256)。我們需要將其reshape成卷積核的形狀(6, 6, 128, 256)。這里的變換是將4608維的輸入向量還原成其來源的6x6x128的空間-通道結(jié)構(gòu)并將256個(gè)輸出單元對應(yīng)到256個(gè)濾波器。具體操作以PyTorch為例conv_weight fc_weight.view(256, 128, 6, 6).permute(1, 0, 2, 3) 更標(biāo)準(zhǔn)的做法是conv_weight fc_weight.T.reshape(256, 128, 6, 6)。需要根據(jù)框架的維度順序如PyTorch的(out_channels, in_channels, kH, kW)仔細(xì)調(diào)整。在Keras/TF中維度順序可能不同。實(shí)操中許多現(xiàn)代框架如PyTorch提供了torch.nn.Linear到torch.nn.Conv2d的權(quán)重直接加載方法只要形狀匹配即可。步驟3將第二個(gè)全連接層Dense(1)轉(zhuǎn)換為卷積層原層輸入256維輸出1維。它“看到”的上一個(gè)層的輸出是一個(gè)256維的向量在空間上可以看作是1x1x256的特征圖。因此新的卷積層參數(shù)為Conv2D(filters1, kernel_size(1, 1), strides(1, 1), paddingvalid)。權(quán)重移植將原權(quán)重矩陣(256, 1)reshape 為(1, 256, 1, 1)或?qū)?yīng)的格式。步驟4組裝全卷積網(wǎng)絡(luò)FCN并處理大圖輸入現(xiàn)在我們的網(wǎng)絡(luò)全部由卷積/池化層構(gòu)成Input (任意尺寸如400x400x3) - [特征提取卷積池化層] (輸出尺寸變?yōu)?H_f_large x W_f_large x C如 23x23x128) - Conv2D(256, kernel_size(6,6), paddingvalid) (輸出尺寸: (23-60)/11 18, 即 18x18x256) - Conv2D(1, kernel_size(1,1), paddingvalid) (輸出尺寸: 18x18x1) - Sigmoid Activation (輸出尺寸: 18x18x1)最終我們得到了一個(gè)18x18的二維得分圖score map。這個(gè)圖中的每一個(gè)值score[i, j]就代表了原輸入圖像中以某個(gè)對應(yīng)位置為中心的、與訓(xùn)練時(shí)相同大小的圖像區(qū)域即一個(gè)滑動窗口是“貓”的概率。步驟5將得分圖映射回原圖并生成檢測框映射關(guān)系得分圖上位置(i, j)對應(yīng)原圖上的一個(gè)區(qū)域。這個(gè)映射關(guān)系由網(wǎng)絡(luò)的下采樣總步長Total Stride決定。假設(shè)從輸入圖像到最終得分圖空間尺寸總共下采樣了S倍例如400-18約22.2倍但更準(zhǔn)確的是根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)計(jì)算特征圖尺度變化。計(jì)算錨點(diǎn)得分圖位置(i, j)對應(yīng)原圖的坐標(biāo)大致為(x, y) ≈ (S * i S/2, S * j S/2)這個(gè)點(diǎn)可以作為潛在檢測框的中心。框的尺寸檢測框的寬度和高度就是訓(xùn)練時(shí)網(wǎng)絡(luò)輸入的尺寸100x100。閾值篩選設(shè)定一個(gè)置信度閾值如0.5遍歷得分圖所有18x18324個(gè)位置將得分高于閾值的位置所對應(yīng)的原圖區(qū)域作為檢測到的目標(biāo)框輸出。3.3 實(shí)操要點(diǎn)與注意事項(xiàng)網(wǎng)絡(luò)設(shè)計(jì)的一致性在訓(xùn)練分類網(wǎng)絡(luò)時(shí)就要考慮到后續(xù)的卷積化轉(zhuǎn)換。最好使用全局平均池化Global Average Pooling, GAP代替展平全連接層作為分類頭。因?yàn)镚AP本身就是空間維度的平均天然兼容任意輸入尺寸轉(zhuǎn)換后就是一個(gè)1x1的卷積層更加靈活和現(xiàn)代化。但經(jīng)典的滑動窗口卷積實(shí)現(xiàn)展示的是如何改造傳統(tǒng)的全連接網(wǎng)絡(luò)。步長Stride的影響在我們轉(zhuǎn)換后的卷積層中stride通常設(shè)為1以實(shí)現(xiàn)最密集的預(yù)測。但也可以設(shè)置為更大的值這相當(dāng)于在特征圖上以更大的步長“滑動窗口”會減少計(jì)算量但也會降低檢測的密集度。邊界效應(yīng)由于轉(zhuǎn)換后的卷積層使用paddingvalid無填充輸出特征圖的尺寸會小于輸入特征圖。這意味著圖像邊緣的信息會被“吃掉”一部分對應(yīng)原圖邊緣的一些滑動窗口無法被評估。如果需要評估邊緣窗口可以在網(wǎng)絡(luò)前向傳播時(shí)對輸入圖像進(jìn)行適當(dāng)?shù)奶畛鋚adding或者接受邊緣檢測的遺漏。多尺度檢測單一尺寸的滑動窗口如100x100無法應(yīng)對不同大小的物體。在實(shí)際系統(tǒng)如OverFeat, SSD中會在多個(gè)不同層級的特征圖上進(jìn)行這種“卷積化的滑動窗口”預(yù)測。深層特征圖感受野大適合檢測大物體淺層特征圖細(xì)節(jié)多適合檢測小物體。這就實(shí)現(xiàn)了多尺度檢測。從二分類到多分類上述例子是二分類貓/背景。對于多分類如COCO數(shù)據(jù)集的80類只需將最后的Conv2D(1)改為Conv2D(C)其中C是類別數(shù)并將Sigmoid激活函數(shù)改為Softmax在空間每個(gè)位置獨(dú)立進(jìn)行Softmax。4. 在經(jīng)典目標(biāo)檢測框架中的體現(xiàn)滑動窗口的卷積實(shí)現(xiàn)思想直接催生或深刻影響了現(xiàn)代主流的目標(biāo)檢測框架。4.1 OverFeat開山之作OverFeat是2013年ILSVRC定位任務(wù)的冠軍它首次系統(tǒng)性地展示了這一思想。其流程是在一個(gè)圖像分類任務(wù)上訓(xùn)練一個(gè)CNN。將全連接層轉(zhuǎn)換為卷積層使網(wǎng)絡(luò)變成全卷積網(wǎng)絡(luò)FCN。輸入任意尺寸圖像網(wǎng)絡(luò)輸出一個(gè)空間化的預(yù)測網(wǎng)格即得分圖。在多個(gè)尺度的圖像金字塔上運(yùn)行這個(gè)FCN以檢測不同大小的物體。對預(yù)測結(jié)果進(jìn)行聚合和非極大值抑制NMS得到最終檢測框。OverFeat完美詮釋了“一次前向傳播評估所有窗口”的高效性。4.2 SSD (Single Shot MultiBox Detector) 與 YOLO (You Only Look Once)SSD和YOLO是單階段檢測器的代表它們將滑動窗口的卷積實(shí)現(xiàn)思想發(fā)揮到了極致。SSD直接在多個(gè)不同尺度的特征圖如VGG的conv4_3, conv7, conv8_2等的每個(gè)空間位置上通過一系列小的卷積濾波器3x3xC來同時(shí)預(yù)測類別得分和相對于默認(rèn)框default box即先驗(yàn)框的坐標(biāo)偏移。這里的“每個(gè)空間位置”就是卷積實(shí)現(xiàn)后的滑動窗口錨點(diǎn)。3x3的卷積核相當(dāng)于在以該位置為中心的鄰域內(nèi)提取特征用于預(yù)測。YOLO將輸入圖像劃分為S x S的網(wǎng)格。每個(gè)網(wǎng)格單元負(fù)責(zé)預(yù)測以該單元為中心的物體。這可以理解為一種步長很大的特殊滑動窗口。YOLO v1之后版本也采用了錨框anchor boxes機(jī)制在每個(gè)網(wǎng)格單元預(yù)測多個(gè)不同尺度和長寬比的邊界框其本質(zhì)也是在特征圖的每個(gè)點(diǎn)上進(jìn)行密集預(yù)測。在這些框架中傳統(tǒng)的“滑動窗口分類器”流程被徹底重塑為“特征提取密集預(yù)測”的端到端范式。滑動窗口的卷積實(shí)現(xiàn)是理解這一范式轉(zhuǎn)換的關(guān)鍵橋梁。4.3 與區(qū)域提議網(wǎng)絡(luò)RPN的關(guān)系兩階段檢測器如Faster R-CNN其核心組件區(qū)域提議網(wǎng)絡(luò)RPN也運(yùn)用了這一思想。RPN在主干網(wǎng)絡(luò)提取的特征圖上滑動一個(gè)小型網(wǎng)絡(luò)通常是3x3卷積然后在每個(gè)滑動窗口位置即特征圖上的每個(gè)點(diǎn)預(yù)測多個(gè)不同尺度和長寬比的“錨框”anchor是否包含物體以及初步的坐標(biāo)修正。這個(gè)“滑動”過程正是通過卷積操作高效實(shí)現(xiàn)的。3x3卷積層共享參數(shù)地掃描整個(gè)特征圖其每個(gè)位置的計(jì)算結(jié)果就對應(yīng)了原圖上一個(gè)滑動窗口區(qū)域的物體性評估。5. 常見問題、挑戰(zhàn)與優(yōu)化技巧在實(shí)際實(shí)現(xiàn)和應(yīng)用這一技術(shù)時(shí)會遇到一些典型問題。5.1 感受野對齊問題這是最容易被忽視的問題。當(dāng)我們說特征圖上的一個(gè)點(diǎn)對應(yīng)原圖的一個(gè)區(qū)域即該點(diǎn)的感受野時(shí)這個(gè)對應(yīng)關(guān)系是近似的尤其是對于深層網(wǎng)絡(luò)。感受野的中心并不總是嚴(yán)格對齊。直接使用(S*i, S*j)作為窗口中心可能會引入偏差。更準(zhǔn)確的做法是進(jìn)行感受野映射計(jì)算或者像Faster R-CNN的RPN那樣預(yù)測相對于錨點(diǎn)的偏移量讓網(wǎng)絡(luò)自己學(xué)習(xí)并修正這個(gè)映射關(guān)系。5.2 計(jì)算精度與效率的權(quán)衡計(jì)算共享的極限卷積實(shí)現(xiàn)共享了特征提取階段的計(jì)算這是最大的收益。但在最后的預(yù)測頭即由全連接層轉(zhuǎn)換來的1x1或kxk卷積計(jì)算量依然與預(yù)測點(diǎn)的數(shù)量成正比。雖然比原始滑動窗口快幾個(gè)數(shù)量級但在追求極致的邊緣設(shè)備部署時(shí)仍需對預(yù)測頭進(jìn)行剪枝、量化等優(yōu)化。大卷積核的消耗第一個(gè)轉(zhuǎn)換來的卷積層如6x6x128x256參數(shù)量和計(jì)算量可能很大。可以用兩個(gè)連續(xù)的3x3卷積來近似替代一個(gè)5x5卷積的思想考慮是否能用更小的卷積核或深度可分離卷積來替代大的全連接轉(zhuǎn)換層以進(jìn)一步提升效率。5.3 實(shí)現(xiàn)細(xì)節(jié)與調(diào)試技巧權(quán)重轉(zhuǎn)換驗(yàn)證轉(zhuǎn)換后務(wù)必用一個(gè)小批量batch的固定輸入數(shù)據(jù)分別通過原始分類網(wǎng)絡(luò)和轉(zhuǎn)換后的全卷積網(wǎng)絡(luò)進(jìn)行前向傳播對比輸出結(jié)果是否一致在輸入尺寸為訓(xùn)練尺寸時(shí)。這是驗(yàn)證轉(zhuǎn)換正確性的金標(biāo)準(zhǔn)。處理可變輸入尺寸使用PyTorch或TensorFlow等動態(tài)圖框架時(shí)全卷積網(wǎng)絡(luò)可以自然地處理可變尺寸輸入。但在部署到某些需要靜態(tài)圖的推理引擎時(shí)可能需要固定輸入尺寸。輸出解析全卷積網(wǎng)絡(luò)的輸出是一個(gè)三維或四維張量(Batch, Channel, Height, Width)。需要清晰地理解每個(gè)維度的含義Height和Width是空間網(wǎng)格Channel是預(yù)測的維度如類別數(shù)*41對于帶錨框的檢測器。編寫后處理代碼時(shí)索引順序不能錯(cuò)。與NMS的集成卷積化滑動窗口會產(chǎn)生大量重疊的、置信度不同的預(yù)測框。非極大值抑制NMS是必不可少的后處理步驟用于去除冗余框。需要根據(jù)任務(wù)調(diào)整NMS的閾值iou_threshold。5.4 性能優(yōu)化方向特征金字塔網(wǎng)絡(luò)FPN為了更好處理多尺度物體不再依賴圖像金字塔而是構(gòu)建一個(gè)從深層到淺層的特征金字塔并在每一層進(jìn)行獨(dú)立的預(yù)測。這可以看作是在多個(gè)不同分辨率的特征圖上進(jìn)行滑動窗口卷積預(yù)測是當(dāng)前主流檢測器的標(biāo)準(zhǔn)配置。Anchor-Free方法近年來一些方法如FCOS、CenterNet等摒棄了預(yù)定義的錨框anchor直接在特征圖的每個(gè)點(diǎn)上預(yù)測物體中心或關(guān)鍵點(diǎn)。這可以看作是滑動窗口卷積實(shí)現(xiàn)的更簡潔形式每個(gè)點(diǎn)只預(yù)測是否有一個(gè)物體的中心落在此處以及該物體的尺寸。這簡化了設(shè)計(jì)并減少了超參數(shù)。Transformer的沖擊Vision TransformerViT和檢測TransformerDETR等模型采用了完全不同的架構(gòu)使用全局注意力機(jī)制而非局部卷積滑動。但在一些基于ViT的檢測器如Swin Transformer中其層次化設(shè)計(jì)和窗口注意力機(jī)制在思想上仍與多尺度滑動窗口有相通之處可以理解為在語義層次上進(jìn)行的、自適應(yīng)的“窗口滑動”。滑動窗口的卷積實(shí)現(xiàn)這個(gè)看似簡單的技巧是連接傳統(tǒng)計(jì)算機(jī)視覺與現(xiàn)代深度學(xué)習(xí)目標(biāo)檢測的重要紐帶。它教會我們?nèi)绾我杂?jì)算共享的視角重新審視網(wǎng)絡(luò)結(jié)構(gòu)將空間冗余轉(zhuǎn)化為計(jì)算效率。盡管最新的研究正在探索超越滑動窗口的范式但這一思想所蘊(yùn)含的“參數(shù)共享”和“密集預(yù)測”理念已經(jīng)深深地烙印在了當(dāng)代計(jì)算機(jī)視覺架構(gòu)的基因之中。理解它不僅能讓你讀懂許多經(jīng)典論文更能讓你在設(shè)計(jì)和優(yōu)化自己的模型時(shí)擁有一個(gè)強(qiáng)大而本質(zhì)的工具。