摘要
提出了一種算法,用于生成任意尺寸卷積核的初始采樣坐標。與常規卷積核相比,提出的AKConv實現了不規則卷積核的函數來提取特征,為各種變化目標提供具有任意采樣形狀和尺寸的卷積核,彌補了常規卷積的不足。在COCO2017和VisDrone-DET2021上進行目標檢測實驗,并進行了比較實驗。結果表明,提出的AKConv方法在目標檢測方面具有更好的性能。
在目標檢測方面,本文提出的AKConv方法相比常規卷積有以下優勢:
- 樣本形狀的靈活性:常規卷積操作具有固定的樣本形狀,而AKConv方法可以允許卷積具有任意形狀和大小。這種靈活性使得AKConv能夠更好地適應形狀變化的目標,從而提高目標檢測的準確性。
- 參數和計算效率:AKConv方法可以通過調整卷積的大小來減少參數數量和計算量,從而提高模型的效率和性能。相比之下,常規卷積需要更多的參數和計算資源,可能在資源有限的環境下導致模型效率降低。
- 網絡性能的優化:AKConv方法可以作為一種輕量級模型替代常規卷積,從而減少模型參數和計算開銷,優化網絡性能。通過實驗驗證,使用AKConv的模型在保持性能的同時,能夠減少參數和計算量,從而提高網絡的效率和泛化能力。
- 擴展性:AKConv方法可以擴展到更大的內核尺寸,從而提供更多的選項來改善網絡性能。這種擴展性使得AKConv能夠適應不同的應用場景和需求,具有更廣泛的適用性。
綜上所述,本文提出的AKConv方法在目標檢測方面相比常規卷積具有更高的靈活性、參數和計算效率以及網絡性能優化等優勢。這些優勢有助于提高目標檢測的準確性和效率,為計算機視覺領域的發展提供新的思路和方法。
論文:《AKConv:具有任意采樣形狀和任意數目參數的卷積核》
https://arxiv.org/pdf/2311.11587.pdf
基于卷積運算的神經網絡在深度學習領域取得了顯著的成果,但標準卷積運算存在兩個固有缺陷。一方面,卷積運算被限制在一個局部窗口,不能從其他位置捕獲信息,并且其采樣形狀是固定的;另一方面,卷積核的大小是固定為k × k的,它是一個固定的方形形狀,參數的數量往往與大小成正比。很明顯,在不同的數據集和不同的位置,目標的形狀和大小是不同的。具有固定樣本形狀和正方形的卷積核不能很好地適應不斷變化的目標。針對上述問題,本研究探索了可變核卷積(AKConv),它為卷積核提供了任意數量的參數和任意采樣形狀,為網絡開銷和性能之間的權衡提供了更豐富的選擇。在AKConv中,我們通過一種新的坐標生成算法來定義任意大小的卷積核的初始位置。為了適應目標的變化,我們引入偏移量來調整每個位置的樣本形狀。此外,我們通過使用相同大小和不同初始采樣形狀的AKConv來探索神經網絡的效果。AKConv通過不規則卷積運算完成了高效的特征提取過程,為卷積采樣形狀帶來了更多的探索選擇。在COCO2017、VOC 7+12和VisDrone-DET2021等代表性數據集上的目標檢測實驗充分展示了AKConv的優勢。AKConv可以作為即插即用的卷積運算來替代卷積運算,提高網絡性能。相關任務的代碼可以在https://github.com/CV-ZhangXin/AKConv上找到。
1、引言
卷積神經網絡(CNN),如ResNet [1]、DenseNet [2]和YOLO [3],已經在各種應用中展示了出色的性能,并在現代社會的許多方面引領了技術進步。它已經從自動駕駛汽車中的圖像識別[4]和醫療圖像分析[5]變得不可或缺,以及智能監控[6]和個性化推薦系統[7]。這些成功的網絡模型在很大程度上依賴于卷積操作,有效地提取圖像中的局部特征,并確保模型的復雜性。
盡管CNN在分類[8]、目標檢測[9]、語義分割[10]等方面取得了許多成功,但它們仍然存在一些局限性。最值得注意的是,關于卷積樣本形狀和大小的選擇。標準的卷積操作往往依賴于具有固定采樣位置的正方形內核,例如1×1、3×3、5×5和7×7等。規則內核的采樣位置是不可變形的,不能動態地響應目標形狀的變化。可變形的卷積[11,12]通過偏移來增強網絡性能,以靈活地調整卷積核的采樣形狀,從而適應目標的變化。例如,[13,14,15]利用它來對齊特征。趙等人[16]通過將其添加到YOLOv4[17]中來改進檢測死魚的有效性。楊等人[18]通過將其添加到主干網絡中來改進檢測牛的YOLOv8[19]。李等人[20]將可變形卷積引入到深度圖像壓縮任務中[21,22],以獲得內容自適應的接收域。
盡管上述研究已經證明了可變形卷積的優越性,但它仍然不夠靈活。因為卷積核仍然局限于選擇核大小,標準卷積操作和可變形卷積中的卷積核參數數量隨著卷積核尺寸的增加呈現出平方增長的趨勢,這對硬件環境來說不是一個友好的增長方式。因此,在對標準卷積操作和可變形卷積進行仔細分析后,我們提出了可變核卷積(AKConv)。與標準常規卷積不同,AKConv是一種新型卷積操作,可以使用任何參數數量的有效卷積核提取特征,例如(1,2,3,4,5,6,7…),這是標準卷積和可變形卷積無法實現的。AKConv可以輕松地用于替換網絡中的標準卷積操作以提高網絡性能。重要的是,AKConv允許卷積參數的數量呈現線性上升或下降的趨勢,這對硬件環境是有利的,它可以作為輕量級模型的替代方案來減少模型參數和計算開銷。其次,在具有充足資源的條件下,它為大型內核提供了更多提高網絡性能的選擇。圖1顯示了常規卷積核使參數數量呈現平方增長趨勢,而AKConv僅顯示線性增長趨勢。與平方增長趨勢相比,AKConv增長較為平緩,為卷積核的選擇提供了更多選項。此外,其思想可以擴展到特定領域。因為可以根據先驗知識為卷積操作創建特殊的采樣形狀,然后通過偏移動態地自動適應目標形狀的變化。
在代表性的數據集VOC [23]、COCO2017 [24]、VisDrone-DET2021 [25]上進行的目標檢測實驗充分證明了AKConv的優勢。總的來說,我們的貢獻如下:
- 對于不同大小的卷積核,我們提出了一種算法,用于生成任意大小卷積核的初始采樣坐標。
- 為了適應目標的不同變化,我們通過獲得的偏移量來調整不規則卷積核的采樣位置。
- 與常規卷積核相比,所提出的AKConv實現了不規則卷積核提取特征的功能,為各種變化的目標提供了具有任意采樣形狀和大小的卷積核,彌補了常規卷積的不足之處。
2、相關工作
近年來,許多作品從不同的角度考慮和分析標準卷積操作,并設計新型卷積操作以提高網絡性能。
Li等人[26]認為,卷積核在所有空間位置共享參數會導致模型在各個空間位置上的建模能力有限,并且不能有效地捕捉空間上的長距離關系。其次,為每個輸出通道使用不同的卷積核的方法實際上效率不高。因此,為了解決這些不足,他們提出了倒置卷積操作,該操作反轉了卷積操作的特征以改善網絡性能。Qi等人[27]基于可變形卷積提出了DSConv。從可變形卷積中學習的偏移量具有自由性,導致模型損失一小部分精細結構特征,這對于分割細長的管狀結構任務構成了巨大挑戰,因此他們提出了DSConv。Zhang等人[28]從新的角度理解了空間注意力機制。他們斷言,空間注意力機制本質上解決了卷積操作參數字典共享的問題。但是,一些空間注意力機制,如CBAM[29]和CA[30],并未完全解決大尺寸卷積參數字典共享的問題。因此,他們提出了RFAConv。Chen等人[31]提出了動態卷積。與在每一層使用卷積核不同,動態卷積根據注意力動態聚合多個并行卷積核。動態卷積提供了更大的特征表示。Tan等人[32]認為,在CNN中,核大小經常被忽視,這可能影響網絡的準確性和效率。其次,僅使用逐層卷積并不能充分利用卷積網絡的全部潛力。因此,他們提出了MixConv,該操作在單個卷積中自然地混合多個核大小以改善網絡性能。
盡管這些方法提高了卷積運算的性能,但它們仍然局限于常規卷積運算,不允許卷積采樣形狀的多種變化。相反,我們所提出的AKConv能夠有效地使用具有任意數量參數和采樣形狀的卷積核來提取特征。
3、方法
3.1、定義初始采樣位置
卷積神經網絡基于卷積運算,通過規則的采樣網格將特征定位到相應位置。在[11, 33, 34]中給出了 3 × 3 3 \times 3 3×3卷積運算的規則采樣網格。讓 R \mathrm{R} R 表示采樣網格,則 R \mathrm{R} R 表示如下:
R = { ( ? 1 , ? 1 ) , ( ? 1 , 0 ) , … , ( 0 , 1 ) , ( 1 , 1 ) } (1) R=\{(-1,-1),(-1,0), \ldots,(0,1),(1,1)\} \tag{1} R={(?1,?1),(?1,0),…,(0,1),(1,1)}(1)
但是,采樣網格是規則的,而AKConv的目標是不規則形狀的卷積核。因此,為了讓不規則卷積核具有采樣網格,我們創建了任意大小卷積的算法來生成卷積核的初始采樣坐標 P_{n}。首先,我們生成規則的采樣網格,然后創建剩余采樣點的不規則網格,最后將它們拼接起來以生成整個采樣網格。偽代碼如下算法1所示。
如圖2所示,它顯示了任意大小卷積的初始采樣坐標的生成。規則卷積的采樣網格以點 (0,0) 為中心。而不規則卷積沒有許多尺寸的中心,為了適應所使用的卷積尺寸,我們在算法中將左上角點 (0,0) 設置為采樣原點。
定義了不規則卷積的初始坐標 P_{n} 后,在位置 P_{0} 處的相應卷積操作可以定義如下:
Conv ? ( P 0 ) = ∑ w × ( P 0 + P n ) (2) \operatorname{Conv}\left(P_{0}\right)=\sum w \times\left(P_{0}+P_{n}\right) \tag{2} Conv(P0?)=∑w×(P0?+Pn?)(2)
這里,w 表示卷積參數。然而,不規則卷積操作是不可能實現的,因為不規則采樣坐標無法與相應大小的卷積操作相匹配,例如大小為 5、7 和 13 的卷積。巧妙的是,我們提出的 AKConv 實現了這一點。
3.2、可變卷積操作
很明顯,標準卷積的采樣位置是固定的,這導致卷積只能提取當前窗口的局部信息,而無法捕捉其他位置的信息。可變形卷積通過卷積操作學習偏移量來調整初始規則模式的采樣網格。該方法在一定程度上彌補了卷積操作的缺點。然而,標準卷積和可變形卷積都是規則的采樣網格,不允許具有任意數量參數的卷積核。此外,隨著卷積核大小的增加,它們的卷積參數數量趨于平方增長,這對硬件環境并不友好。因此,我們提出了一個新型的可變卷積操作(AKConv)。如圖3所示,它展示了大小為5的AKConv的整體結構。
類似于可變形卷積,在AKConv中,相應核的偏移量首先通過卷積運算獲得,其具有維度 ( B , 2 N , H , W ) (\mathrm{B}, 2 \mathrm{~N}, \mathrm{H}, \mathrm{W}) (B,2?N,H,W),其中 N \mathrm{N} N 是卷積核大小。以圖3為例, N = 5 \mathrm{N}=5 N=5。然后通過將偏移量和原始坐標相加得到修改后的坐標 ( P 0 + P n ) (P_{0}+P_{n}) (P0?+Pn?)。最后通過插值和重新采樣得到相應位置的特征。提取不規則卷積核采樣位置的特征是困難的。為了解決這個問題,我們發現經過深入思考后有很多方法來解決這個問題。在可變形卷積[11]和RFAConv[28]中,他們在空間維度上堆疊了 3 × 3 3 \times 3 3×3 卷積特征。然后使用步長為3的卷積操作來提取特征。然而,這種方法針對的是方形采樣形狀。因此,可以將特征堆疊在行上或列上,以使用列卷積或行卷積提取與不規則采樣形狀相對應的特征。提取的特征將使用適當大小和步長的卷積核。此外,我們可以將特征轉換為四個維度 ( C , N , H , W ) (\mathrm{C}, \mathrm{N}, \mathrm{H}, \mathrm{W}) (C,N,H,W) ,然后使用步長和卷積大小為 (N, 1,1) 的Conv3d來提取特征。當然,我們還可以將特征堆疊在通道維度上,以 ( C N , H , W ) (\mathrm{CN}, \mathrm{H}, \mathrm{W}) (CN,H,W),然后使用 1 × 1 1 \times 1 1×1 卷積將維度減少到 ( C , H , W ) (\mathrm{C}, \mathrm{H}, \mathrm{W}) (C,H,W)。因此,上述所有方法都可以提取與不規則采樣形狀相對應的特征。只需要重新調整特征的形狀并使用相應的卷積操作即可。因此,在圖3中,“Reshape”和“Conv”的最終表示可以是上述任何一種方法。此外,為了清楚地展示AKConv的過程,在圖3中進行重新采樣后,我們將與卷積相對應的特征維度放在了第三個維度。但在代碼實現時,它位于最后一個維度。
在RFAConv和Deformable Conv之后,我們將重采樣的特征按列方向進行疊加,然后使用大小為(N, 1),步長為(N, 1)的行卷積。因此,AKConv可以很好地完成不規則卷積特征提取過程。AKConv通過不規則卷積完成特征提取過程,可以根據偏移量靈活調整樣本形狀,為卷積采樣形狀帶來更多的探索選擇。與標準卷積和可變形卷積不同,它們受到正則卷積核思想的限制。
3.3、擴展AKConv
我們認為AKConv的設計是一種新穎的設計,它完成了從不規則和任意采樣形狀卷積核中提取特征的壯舉。即使沒有使用可變形卷積中的偏移量思想,AKConv仍然可以使卷積核形狀多樣化。因為AKConv可以對初始坐標進行重新采樣以呈現出各種變化。如圖4所示,我們為大小為5的卷積設計了各種初始采樣形狀。在圖4中,我們只展示了大小為5的一些示例。但是,AKConv的大小可以是任意的,因此隨著大小的增加,AKConv的初始卷積采樣形狀變得更加豐富,甚至無限。鑒于目標形狀因數據集而異,設計對應于采樣形狀的卷積操作至關重要。AKConv通過根據相位特化域設計具有相應形狀的卷積操作而充分實現。它也可以類似于可變形卷積,通過添加一個可學習的偏移量來動態適應目標的變化。對于特定任務,卷積核初始采樣位置的設計是重要的,因為它是一種先驗知識。正如Qi等人[27]提出的那樣,他們為細長管狀結構分割任務提出了具有相應形狀的采樣坐標,但他們的形狀選擇僅適用于細長管狀結構。
4、實驗
為了驗證AKConv的優勢,我們分別在先進的YOLOv5 [35]、YOLOv7 [36]和YOLOv8 [19]上進行了豐富的目標檢測實驗。實驗中所有的模型都是基于RTX3090進行訓練的。為了驗證AKConv的優勢,我們在代表性的COCO2017、VOC 7+12和VisDroneDET2021數據集上進行了相關實驗。
4.1、在COCO2017上的目標檢測實驗
COCO2017包括訓練集(118287張圖片)和驗證集(5000張圖片),涵蓋了80個目標類別。它已成為計算機視覺研究領域,尤其是目標檢測領域的一項標準數據集。我們選擇YOLOv5n和YOLOv5s作為基準模型,它們是目標檢測領域的先進模型。然后,使用不同大小的AKConv來替換YOLOv5n和YOLOv5s的卷積操作。替換的細節與[28]中的目標檢測實驗相同。在實驗中,除了epoch和batch-size參數外,默認使用網絡的參數。在batch size為32的情況下,我們對每個模型訓練了300個epochs。遵循以前的工作,我們報告了AP50、AP75、AP、APs、APm和APl。此外,我們還分別報告了使用大小為5、4、6、7、9和13的AKConv在YOLOv5n和YOLOv5s上的目標檢測結果。如表1所示,YOLOv5的檢測精度隨著卷積核尺寸的增加而逐漸提高,但模型所需的參數數量和計算量也逐漸增加。與標準卷積操作相比,AKConv顯著提高了YOLOv5在COCO2017上的目標檢測性能。可以看出,當AKConv的大小為5時,它不僅使模型所需的參數數量和計算量減少,而且顯著提高了YOLOv5n的AP50、AP75和AP,均提高了三個百分點,這是非常出色的。AKConv提高了基線模型的APs、APm和APl,但很明顯,與小、中物體相比,AKConv顯著提高了大物體的檢測精度。我們斷言,AKConv使用偏移量更好地適應大物體的形狀。
4.2、在VOC 7+12上的目標檢測實驗
為了進一步驗證我們的方法,我們在VOC 7+12數據集上進行了實驗,該數據集是VOC2007和VOC2012的組合,包括16551個訓練集和4952個驗證集,涵蓋20個目標類別。為了測試AKConv在不同架構上的泛化能力,我們選擇了YOLOv7-tiny作為基準模型。由于YOLOv7和YOLOv5采用不同的架構,因此可以比較不同架構設置的AKConv的性能。在YOLOv7-tiny中,我們使用不同大小的AKConv來替換標準卷積操作。替換的細節遵循[28]中的工作。所有模型的超參數設置與前一節中的一致。如表2所示,隨著AKConv大小的增加,網絡的檢測精度逐漸提高,而模型的參數數量和計算量也逐漸增加。這些實驗進一步證實了AKConv的優勢。
4.3、在VisDrone-DET2021上的目標檢測實驗
為了再次驗證AKConv具有很強的泛化能力,我們基于VisDrone-DET2021數據集進行了相關的目標檢測實驗。VisDrone-DET2021是一個具有挑戰性的數據集,由無人機在不同環境、天氣和光照條件下拍攝而成。它是中國最大的無人機航拍圖像數據集之一,涵蓋范圍最廣。訓練集數量為6471個,驗證集數量為548個。與第4.1節一樣,我們選擇YOLOv5n作為基準模型,使用AKConv來替換網絡中的卷積操作。實驗中,將batchsize設置為16,以方便探索更大的卷積尺寸,而所有其他超參數設置與之前相同。如表3所示,很明顯,基于不同大小的AKConv可以用作輕量級選項,以減少參數數量和計算量,并提高網絡性能。實驗中,當AKConv的大小設置為3時,與基準模型相比,模型的檢測性能下降,但相應的參數數量和計算開銷要小得多。此外,我們可以逐漸調整AKConv的大小來探索網絡性能的變化。AKConv為網絡帶來了更豐富的選項。
4.4、比較實驗
與可變形的Conv [11]不同,AKConv提供了更豐富的網絡選擇。AKConv彌補了可變形Conv的不足,可變形Conv只使用常規卷積操作,而AKConv可以使用常規和非常規卷積操作。當AKConv的大小設置為K的平方時,AKConv變成可變形的Conv。此外,DSConv [27]還使用偏移量來調整采樣形狀,但其采樣形狀是為管狀目標設計的,并且采樣形狀的變化是有限的。為了對比AKConv、可變形Conv和DSConv的優點,我們在YOLOv5s和YOLOv5n的基礎上在COCO2017和VOC 7+12上進行實驗。如表4和表5所示。當卷積核參數的數量為9時(即標準的3 3卷積),可以看出AKConv和可變形Conv的性能相同。因為當卷積核大小規則時,AKConv就是可變形Conv。但是,我們之前提到過,可變形Conv沒有探索非常規的卷積核大小。因此,不能實現參數數量為5和11的卷積操作。在設計AKConv時,我們沒有對輸入特征進行零填充。然而,在可變形Conv中使用了填充。因此,為了公平比較,在AKConv中我們也對輸入特征進行零填充。實驗表明,在AKConv中零填充有助于網絡提高性能。由于DSConv是專為特定的管狀形狀設計的,因此可以看出其在COCO2017和VOC 7+12上的檢測性能并不明顯。在實現DSConv時,[27]將特征向行或列擴展,并最終使用列卷積或列卷積來提取與我們的方法相似的特征。因此,他們的方法也可以實現參數為2、3、4、5、6、7等的卷積操作。在同一規模下,我們也進行了比較實驗。因為DSConv沒有完成下采樣方法,在實驗中,我們使用AKConv和DSConv來替代YOLOv5n中的C3中的3 × 3卷積。實驗結果如表4和表5所示。AKConv優于DSConv,因為DSConv不是為了提高任意大小的卷積核的性能而設計的,而是為了探索特定形狀的目標。相比之下,AKConv提供了豐富的卷積核選擇和探索選項,可以有效提高網絡性能。
4.5、探索初始采樣形狀
如前所述,AKConv可以通過使用任意大小和任意采樣形狀來提取特征。為了探索AKConv與不同的初始采樣形狀在網絡上的效果,我們在COCO2017和VisDrone-DET2021上分別進行了實驗。在COCO2017上,我們在批量大小為32和每個周期為100的情況下進行了實驗。在VisDrone-DET2021上,我們在批量大小為16和每個周期為300的情況下進行了實驗。所有其他超參數都是網絡默認值。在COCO2017中,我們選擇YOLOv8n進行實驗。如表6所示,AKConv仍然可以提高網絡的檢測精度。YOLOv8和YOLOv5的網絡結構相似。區別在于C3和C2f的設計。可以看出,與在YOLOv5中添加AKConv相比,在YOLOv8中添加AKConv的性能提升不如YOLOv5。我們認為,在相同大小下,YOLOv8需要的參數比YOLOv5多,因此更多的參數可以提供更好的特征信息,就像AKConv一樣。因此,隨著AKConv的加入,YOLOv8的提升不如YOLOv5明顯。此外,在相同大小下,我們在COCO2017上測試了不同初始采樣形狀對網絡性能的影響。很明顯,在不同的初始樣本下,網絡獲得的檢測精度的波動并不大。這得益于COCO2017的大量數據可以靈活地調整偏移量。但這并不意味著網絡在所有初始采樣坐標下獲得的檢測精度沒有顯著差異。為了再次探索AKConv與不同初始形狀對網絡的影響,我們在基于YOLOv5n的實驗中探索了大小為5的AKConv以及不同的初始樣本在VisDrone-DET2021上的效果。從表7中可以看出,網絡在不同的初始樣本下具有不同的檢測精度。因此,具有不同初始采樣形狀的AKConv對網絡性能有影響。此外,對于特定的網絡和數據集,探索具有適當初始采樣形狀的AKConv以改善網絡性能是很重要的。
5、分析討論
我們在之前的實驗中初步觀察了大小為5的AKConv在不同采樣位置下YOLOv5n的檢測性能。可以清楚地注意到,網絡在具有不同初始采樣形狀時表現不同。這表明偏移量的調整能力也是有限的。為了衡量每個給定位置的偏移量的變化,我們給出了平均偏移量的定義,定義如下:
A O = ( ∑ i 2 N ∣ O f f set ? i ∣ ) / ( 2 N ) (3) A O=\left(\sum_{i}^{2 N}\left|O f f \operatorname{set}_{i}\right|\right) /(2 N) \tag{3} AO=(i∑2N?∣Offseti?∣)/(2N)(3)
AO(平均偏移量)是通過將偏移量相加并取平均值來衡量每個位置采樣點的平均變化程度。為了觀察偏移量的變化,我們選擇了訓練好的網絡,并選擇了AKConv的最后一層來分析偏移量的整體變化趨勢。為了進行分析,我們隨機選擇了VisDrone-DET2021中的四張圖像,然后可視化了大小為5的初始不同采樣位置的AKConv。如圖5所示,我們可視化了每個采樣位置的偏移量的變化程度。圖5中不同的顏色表示訓練后不同初始樣本在每個采樣位置的偏移量的變化。線條的顏色對應于中間的初始采樣形狀。圖5中不同的初始樣本形狀對應于表7中的初始樣本形狀。可以得出結論,圖5中藍色和紅色的初始樣本形狀的變化較小。這意味著紅色和藍色的初始樣本比其他初始樣本更適合此數據集。如表7中的實驗所示,與紅色和藍色相對應的初始采樣形狀獲得了更好的檢測精度。所有實驗都證明了AKConv能夠給網絡帶來顯著的性能改進。與可變形的Conv不同,AKConv具有基于大小的靈活性來擴展網絡性能。在所有實驗中,我們廣泛探索了大小為5的AKConv。因為在用大量數據訓練COCO2017時,我們發現將AKConv的大小設置為5時,訓練速度與原始模型相差不大。此外,隨著AKConv大小的增加,訓練時間逐漸增加。在COCO2017、VOC 7+12和VisDrone-DET2021的實驗中,將AKConv的大小設置為5在網絡中取得了良好的結果。當然,探索其他大小的AKConv是可能的,因為顯示線性增長和任意采樣形狀的參數數量為AKConv的探索帶來了豐富的選擇。AKConv可以實現任意大小和任意樣本的卷積操作,并可以通過偏移量自動調整樣本形狀以適應目標變化。所有實驗都證明,AKConv提高了網絡性能,并為網絡開銷和性能之間的權衡提供了更豐富的選擇。
6、結論
顯然,在現實生活和計算機視覺領域中,物體的形狀存在各種變化。卷積運算的固定樣本形狀無法適應這些變化。盡管可變形的Conv可以通過偏移量的調整靈活改變卷積的樣本形狀,但它仍然存在局限性。因此,我們提出了AKConv,它真正實現了允許卷積具有任意樣本形狀和大小,為卷積核的選擇提供了多樣性。此外,對于不同的領域,我們可以設計特定的初始采樣坐標形狀來滿足實際需求。雖然在本論文中,我們僅針對大小為5的AKConv設計了多種采樣坐標形狀。但是,AKConv的靈活性在于它可以針對任何采樣核大小來提取信息。因此,未來我們希望針對特定任務探索適當大小和采樣形狀的AKConv,這將對后續任務產生推動力。
RT-DERT官方測試結果
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 15/15 [00:02<00:00, 5.36it/s]all 230 1412 0.882 0.907 0.93 0.667c17 230 131 0.945 0.926 0.986 0.794c5 230 68 0.857 0.881 0.949 0.783helicopter 230 43 0.951 0.907 0.954 0.573c130 230 85 0.985 0.976 0.983 0.658f16 230 57 0.827 0.924 0.925 0.631b2 230 2 0.963 1 0.995 0.553other 230 86 0.86 0.788 0.884 0.464b52 230 70 0.889 0.943 0.942 0.779kc10 230 62 0.971 0.984 0.985 0.82command 230 40 1 0.958 0.995 0.759f15 230 123 0.952 0.968 0.99 0.688kc135 230 91 0.976 0.911 0.941 0.662a10 230 27 0.892 0.914 0.907 0.419b1 230 20 0.749 0.95 0.936 0.614aew 230 25 0.921 0.938 0.95 0.739f22 230 17 0.891 0.965 0.99 0.703p3 230 105 1 0.945 0.967 0.768p8 230 1 0.798 1 0.995 0.647f35 230 32 0.903 0.872 0.951 0.496f18 230 125 0.946 0.944 0.95 0.78v22 230 41 0.983 0.927 0.99 0.645su-27 230 31 0.924 0.968 0.992 0.833il-38 230 27 0.986 0.926 0.981 0.736tu-134 230 1 0.794 1 0.995 0.895su-33 230 2 0 0 0 0an-70 230 2 0.861 1 0.995 0.796tu-22 230 98 0.996 0.969 0.994 0.788
Speed: 0.3ms preprocess, 5.3ms inference, 0.0ms loss, 0.5ms postprocess per image
改進方法
從官方的源碼中得到AKConv的源碼,對源碼做一些校正,代碼如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
import einops
class AKConv(nn.Module):def __init__(self, inc, outc, num_param, stride=1, bias=None):super(AKConv, self).__init__()self.num_param = num_paramself.stride = strideself.conv = nn.Sequential(nn.Conv2d(inc, outc, kernel_size=(num_param, 1), stride=(num_param, 1), bias=bias),nn.BatchNorm2d(outc),nn.SiLU()) # the conv adds the BN and SiLU to compare original Conv in YOLOv5.self.p_conv = nn.Conv2d(inc, 2 * num_param, kernel_size=3, padding=1, stride=stride)nn.init.constant_(self.p_conv.weight, 0)self.p_conv.register_full_backward_hook(self._set_lr)@staticmethoddef _set_lr(module, grad_input, grad_output):grad_input = (grad_input[i] * 0.1 for i in range(len(grad_input)))grad_output = (grad_output[i] * 0.1 for i in range(len(grad_output)))def forward(self, x):# N is num_param.offset = self.p_conv(x)dtype = offset.data.type()N = offset.size(1) // 2# (b, 2N, h, w)p = self._get_p(offset, dtype)# (b, h, w, 2N)p = p.contiguous().permute(0, 2, 3, 1)q_lt = p.detach().floor()q_rb = q_lt + 1q_lt = torch.cat([torch.clamp(q_lt[..., :N], 0, x.size(2) - 1), torch.clamp(q_lt[..., N:], 0, x.size(3) - 1)],dim=-1).long()q_rb = torch.cat([torch.clamp(q_rb[..., :N], 0, x.size(2) - 1), torch.clamp(q_rb[..., N:], 0, x.size(3) - 1)],dim=-1).long()q_lb = torch.cat([q_lt[..., :N], q_rb[..., N:]], dim=-1)q_rt = torch.cat([q_rb[..., :N], q_lt[..., N:]], dim=-1)# clip pp = torch.cat([torch.clamp(p[..., :N], 0, x.size(2) - 1), torch.clamp(p[..., N:], 0, x.size(3) - 1)], dim=-1)# bilinear kernel (b, h, w, N)g_lt = (1 + (q_lt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_lt[..., N:].type_as(p) - p[..., N:]))g_rb = (1 - (q_rb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_rb[..., N:].type_as(p) - p[..., N:]))g_lb = (1 + (q_lb[..., :N].type_as(p) - p[..., :N])) * (1 - (q_lb[..., N:].type_as(p) - p[..., N:]))g_rt = (1 - (q_rt[..., :N].type_as(p) - p[..., :N])) * (1 + (q_rt[..., N:].type_as(p) - p[..., N:]))# resampling the features based on the modified coordinates.x_q_lt = self._get_x_q(x, q_lt, N)x_q_rb = self._get_x_q(x, q_rb, N)x_q_lb = self._get_x_q(x, q_lb, N)x_q_rt = self._get_x_q(x, q_rt, N)# bilinearx_offset = g_lt.unsqueeze(dim=1) * x_q_lt + \g_rb.unsqueeze(dim=1) * x_q_rb + \g_lb.unsqueeze(dim=1) * x_q_lb + \g_rt.unsqueeze(dim=1) * x_q_rtx_offset = self._reshape_x_offset(x_offset, self.num_param)out = self.conv(x_offset)return out# generating the inital sampled shapes for the AKConv with different sizes.def _get_p_n(self, N, dtype):base_int = round(math.sqrt(self.num_param))row_number = self.num_param // base_intmod_number = self.num_param % base_intp_n_x ,p_n_y = torch.meshgrid(torch.arange(0, row_number),torch.arange(0 ,base_int))p_n_x = torch.flatten(p_n_x)p_n_y = torch.flatten(p_n_y)if mod_number > 0:mod_p_n_x ,mod_p_n_y = torch.meshgrid(torch.arange(row_number ,row_number +1),torch.arange(0 ,mod_number))mod_p_n_x = torch.flatten(mod_p_n_x)mod_p_n_y = torch.flatten(mod_p_n_y)p_n_x ,p_n_y = torch.cat((p_n_x ,mod_p_n_x)) ,torch.cat((p_n_y ,mod_p_n_y))p_n = torch.cat([p_n_x ,p_n_y], 0)p_n = p_n.view(1, 2 * N, 1, 1).type(dtype)return p_n# no zero-paddingdef _get_p_0(self, h, w, N, dtype):p_0_x, p_0_y = torch.meshgrid(torch.arange(0, h * self.stride, self.stride),torch.arange(0, w * self.stride, self.stride))p_0_x = torch.flatten(p_0_x).view(1, 1, h, w).repeat(1, N, 1, 1)p_0_y = torch.flatten(p_0_y).view(1, 1, h, w).repeat(1, N, 1, 1)p_0 = torch.cat([p_0_x, p_0_y], 1).type(dtype)return p_0def _get_p(self, offset, dtype):N, h, w = offset.size(1) // 2, offset.size(2), offset.size(3)# (1, 2N, 1, 1)p_n = self._get_p_n(N, dtype)# (1, 2N, h, w)p_0 = self._get_p_0(h, w, N, dtype)p = p_0 + p_n + offsetreturn pdef _get_x_q(self, x, q, N):b, h, w, _ = q.size()padded_w = x.size(3)c = x.size(1)# (b, c, h*w)x = x.contiguous().view(b, c, -1)# (b, h, w, N)index = q[..., :N] * padded_w + q[..., N:] # offset_x*w + offset_y# (b, c, h*w*N)index = index.contiguous().unsqueeze(dim=1).expand(-1, c, -1, -1, -1).contiguous().view(b, c, -1)x_offset = x.gather(dim=-1, index=index).contiguous().view(b, c, h, w, N)return x_offset# Stacking resampled features in the row direction.@staticmethoddef _reshape_x_offset(x_offset, num_param):b, c, h, w, n = x_offset.size()x_offset = einops.rearrange(x_offset, 'b c h w n -> b c (h n) w')return x_offset
AKConv第二個參數是卷積核的大小,可以設置為:3、4、5、6、7、8、9、10、11等,不再限制為奇數。不過過大的卷積核會占用很大的顯存。
測試結果
Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 15/15 [00:04<00:00, 3.72it/s]all 230 1412 0.902 0.937 0.951 0.688c17 230 131 0.95 0.969 0.989 0.79c5 230 68 0.881 0.853 0.885 0.734helicopter 230 43 0.928 0.902 0.961 0.6c130 230 85 0.956 0.976 0.975 0.667f16 230 57 0.945 0.906 0.94 0.647b2 230 2 0.601 1 0.995 0.539other 230 86 0.88 0.851 0.871 0.435b52 230 70 0.958 0.929 0.925 0.768kc10 230 62 0.948 0.984 0.986 0.806command 230 40 0.956 1 0.995 0.805f15 230 123 0.903 0.987 0.988 0.683kc135 230 91 0.895 0.934 0.942 0.681a10 230 27 0.793 0.741 0.694 0.324b1 230 20 0.984 0.95 0.948 0.625aew 230 25 0.873 1 0.992 0.8f22 230 17 0.934 1 0.989 0.7p3 230 105 0.979 0.952 0.967 0.752p8 230 1 0.77 1 0.995 0.716f35 230 32 0.878 0.938 0.938 0.51f18 230 125 0.938 0.984 0.983 0.8v22 230 41 0.949 0.976 0.992 0.656su-27 230 31 0.915 1 0.993 0.826il-38 230 27 0.931 0.992 0.993 0.756tu-134 230 1 0.825 1 0.995 0.796su-33 230 2 1 0.5 0.75 0.6an-70 230 2 0.844 1 0.995 0.796tu-22 230 98 0.939 0.98 0.991 0.762
還是有漲點的!
總結
本文嘗試使用最新的卷積AKConv改進RT-DERT,從實驗的結果來看還是不錯的。大家可以在自己的數據集上做嘗試。
代碼和PDF版本的文章鏈接: