# 論文:InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions CVPR 2023 highlighted paper ## 介紹 近期 ViT 出現,許多研究都 Focus 在基於 ViT 的大型模型 但沒有什麼大型 CNN 相關的研究 因此此篇論文提出 InternImage:CNN-based 的大型模型 CNN 和 ViT 之間的差距可以大致分成幾個面向: * MHSA 帶來的 Global 相關性資訊優勢。雖然近期有人嘗試用很大 Kernel 的 Convolution 來做,但效果還是不如最先進的 ViTs * ViT 有一些標準 CNN 沒有的 Components,例如:Layer Norm、Feed Forwrd network、GeLU * 常見的 CNN 有較強烈的歸納偏差,所以通常收斂比 ViT 快,需要比較少訓練資料。但限制是沒有能力從更大量的資料中學習更 general 的 patterns 於是模型使用 deformable (可變型的) convolution 作為主要的 Operator 可以帶來類似 MHSA 的好處: long-range dependence 和 adaptive spatial aggregation 同時又不會造成運算效率低落 ![image](https://hackmd.io/_uploads/B1KRU2kWR.png) 另外也結合一系列類似 Transformer 的架構設計和 Blocks 並基於以上設計擴展參數量,來學習更大規模的訓練資料,可以和 ViT 一樣得到好處 在表現上面,InternImage 在 COCO dataset 上達到 65.4 mAP (新紀錄) 超越目前領先的 CNNs 和 ViTs。 ## Deformable Convolution (DCN) ![image](https://hackmd.io/_uploads/SyB9kqV-0.png) 如圖所示,dynamic sparse convolution,Window Size 只用常見的 $3*3$ 擁有以下優勢: * 可以彈性的去學習 reception fields (long-range / short range) * Sampling offset 和 Modulation scalar 依照 Input data 動態調整,達到像是 ViT 的 Adaptive spatial aggregation (適應性空間聚合:MHSA 的 weights 依照 input 動態調整) 特性。 * Window size 為 $3*3$,不會因為 large dense kernels 造成效率問題 ### 重新審視 DCNv2. input image:![image](https://hackmd.io/_uploads/SysRhsVWC.png) DCNv2:![image](https://hackmd.io/_uploads/S1GzpiEZA.png) * $p_0$:current pixel * $p_k$:正規卷積中的第 k 個 Sample 點(相對 $p_0$ 的 $\{(−1, −1), (−1, 0), ..., (0, +1), ..., (+1, +1)\}$) * $\Delta{p_k}$:每個 Sample Point 對應的 offset(依 input 動態調整) * $w_k$:第 k 個 Sample Point 的 projection weight * $m_k$:第 k 個 Sample Point 的 modulation scalar (Sigmoid Normalized $[0, 1]$,依 input 動態調整) ![image](https://hackmd.io/_uploads/S1C1iANb0.png) DCNv2 通常拿來作為普通卷積的擴充,讀取預訓練 weights 來達到更好效果,但不太適合拿來用在要從頭訓練的大型模型,所以做了一些改進,提出 DCNv3: * Convolution Neurons 之間共享 weights:原本不同的卷積 Neurons 分別有獨立的 linear projection weights,參數量和複雜度受總 Sample points 數量影響。v3 中借用 Seperable Convolution 的概念,並將 $w_k$ 拆成 depth-wise 和 point-wise,Depth-wise 部分給 $m_k$ 負責,point-wise 部分 neurons 之間共享。 (複習一下 Seperable Convolution) ![image](https://hackmd.io/_uploads/S19--1BbR.png) * multi-group:類似 MHSA 中 multi-head 的概念,將 $\Delta{p_k}$ 和 $m_k$ 拆成 g 個組別,讓一個卷積層可以學出多種不同的 spatial aggregation。 * DCNv2 用 Sigmoid Normalize $m_k$(範圍 $[0, 1]$),但是所有 modulation scalar 的總合是不穩定的(範圍 $[0, K]$),這造成參數量多時 gradient 會不穩定。所以將對每個 $m_k$ 做 sigmoid 改成對全部的 $m_k$ 做 Softmax,就可以讓總和在範圍 $[0, 1]$ 內,讓各個 scale 的訓練更穩定。 DCNv3 Equation:![image](https://hackmd.io/_uploads/BkxQllBZA.png) * $x_g$:Sliced Input Feature Map(切割 Channels,![image](https://hackmd.io/_uploads/Hk-nn9_WA.png),![image](https://hackmd.io/_uploads/S1Zvp9uZC.png)) * $w_g$:shared point-wise weight of group g * $m_{gk}$:group g、第 k 個 Sample point 的 modulation scalar * $\Delta{p_{gk}}$:group g,sample point $p_k$ 對應的 offset ## InternImage Model ![image](https://hackmd.io/_uploads/SkGEdlHW0.png) ### Basic Block Basic Block 的堆疊方式跟 ViTs 比較像,且其中包含 LN、FFN 和 GeLU ![image](https://hackmd.io/_uploads/r1OfUCB-0.png) Sampling offset $\Delta{p}$ 和 modulation scalar $m$ 產生方式:將 input 傳入一個 seperable convolution(3x3 DWCONV -> linear projection) 另外,與 tranformer 一樣採用 post-normaliztion ![image](https://hackmd.io/_uploads/SyDFilSbC.png) ### Stem & Downsampling | ![image](https://hackmd.io/_uploads/rkXSL0BWC.png) | $s2$:stride = 2 <br/> $p1$:padding = 1 | | -------- | -------- | Convolutional Stem:before first stage,將 input 縮小成原本的 $\frac{1}{4}$ | ![image](https://hackmd.io/_uploads/HyQpqRB-A.png) | $s2$:stride = 2 <br/> $p1$:padding = 1 | | -------- | -------- | Downsampling:將上一層 output 縮小成原本的 $\frac{1}{2}$ 再送入下一層 ### Stacking Rule & Scaling Rule 分成以下幾種 Hyper-params: ![image](https://hackmd.io/_uploads/S1NEJJIW0.png) 模型有 4 個 Stages,所以總共會有 12 個 hyper-params 但這樣 search space 會太大,所以加入 4 個 rules 來縮小 search space ![image](https://hackmd.io/_uploads/rktxgk8b0.png) * $C_2$、$C_3$、$C_4$ 以 $C_1$ 來決定(乘上 $2^{i-1}$) * Group 數:channel 數除上 hyper-param $C^\prime$ * stage 1、stage 2、stage 4 的 Basic Number 數量相同,且皆少於或等於 stage 3 要決定的 hyper-param 就剩下 4 個:$C_1$、$C^\prime$、$L_1$、$L_3$ 接著先 $C_1$、$C^\prime$、$L_1$ 限制在幾個數字: $C_1$:$\{48, 64, 80\}$ $C^\prime$:$\{1,2,3,4,5\}$ $L_1$:$\{16,32\}$ 並選擇總參數量 30M 的 Model 來測試 Search Space 縮小到 30,從中選出表現最好的:(64,16,4,18) 當作 InternImage-T ,並以此當作基礎來放大,如下表: ![image](https://hackmd.io/_uploads/BycOMJUb0.png) 而放大主要分成兩個面向,分別是 Depth 和 Width,可以寫成以下式子: $D^\prime = \alpha^\phi D$,$\alpha \geq 1$ $C_1^\prime = \beta^\phi D$,$\beta \geq 1$ 且 $\alpha\beta^{1.99} \approx 2$ (此處 1.99 專為 InternImage 設定,計算方法為將深度固定然後寬度加倍) 最後找出最好的 scaling setting 為 $\alpha=1.09$、$\beta=1.36$ ## 貢獻與實驗表現 * 第一個參數量超過 1 billion 的 CNN, 並用 400 million 大型資料來訓練 * improve 3×3 DCN operator,並一一檢視 block 設計、堆疊設計、模型放大策略 * 測試在圖像分類、物件偵測、Segmentation,測試 model size 30M~1B,data 1M~400M 測試表現: * InternImage-B 用 ImageNet-1k 訓練,達 84.9 top-1,跟對應的模型($31*31$ kernel CNN)相比,高了至少 1.1 個百分點 * 1B params + 427M data InternImage-H ImageNet-1k top-1 達到 89.6,跟設計良好的 ViTs 還有混合 ViTs 相近 * COCO dataset:InternImage-H(2.18B params) 65.4% box mAP,2.3 points higher than SwinV2-G,27% fewer parameters。 ### Classification Training settings: * InternImage-T/S/B trained on ImageNet-1K (∼1.3 million) for 300 epochs * InternImage-L/XL pre-trained on ImageNet-22K (∼14.2 million) for 90 epochs, fine-tuned on ImageNet-1K for 20 epochs * InternImage-H pre-train on large-scale joint dataset (427 million) for 30 epochs, fine-tune the model on ImageNet-1K for 20 epochs Performance: * InternImage-T achieves 83.5% top-1 accuracy, outperforming ConvNext-T by 1.4 points * InternImage-B surpasses the hybrid-ViT CoAtNet-2 by 0.8 points * InternImage-XL pre-train on ImageNet-22K, top-1 accuracy 88.0% * InternImage-H pre-train on large-scale joint dataset, top-1 accuracy 89.6%,跟目前最先進的 ViT 差距剩約一個百分點。 ### Object Detection Settings: * 2 種 object detection frameworks Mask R-CNN 和 Cascade Mask R-CNN * initialize the backbone with pre-trained classification weights * 1× (訓練 12 epochs) 或 3× (訓練 36 epochs) Performance: * InternImage-T、1×、Mask R-CNN * box AP 47.2% * 比 Swin-T 高 4.5 個百分點 * 比 ConvNeXt-T 高 3.0 個百分點、 * InternImage-XL、3×、Cascade Mask R-CNN * box AP 56.2% * 比 ConvNeXt-XL 高一個百分點 * InternImage-H、weights pre-trained on ImageNet-22K / large-scale joint dataset、DINO detector、fine-tune 26 epochs on Objects365 then 12 epochs on COCO * COCO val2017 65.0 box AP、COCO test-dev 65.4 box AP * test-dev 比 FD-SwinV2-G 高 1.2 百分點,且參數量少 27%,不須經過複雜的Distillation ### Instance Segmentation Performance: * InternImage-T、1×、Mask R-CNN * mask AP 42.5% * 比 Swin-T 高 3.2 個百分點 * 比 ConvNeXt-T 高 2.4 個百分點、 * InternImage-XL、3×、Cascade Mask R-CNN * mask AP 48.8% * 比相對的模型們高至少 1.1 個百分點 ### Semantic Segmentation Settings: * pre-trained classification weights、with UperNet for Semantic Segmentation、train on ADE20K for 160k iterations * InternImage-H with more advanced Mask2Former for Semantic Segmentation Performance: * InternImage-B 50.8 mIoU on ADE20K val * 超越 ConvNeXt-B (49.1) 和 RepLKNet-31B (49.9),且參數量幾乎一樣 * InternImage-H 60.3 MS mIoU on ADE20K val * 超越 SwinV2-G (59.9),且參數更少(1.12B vs. 3.00B) * InternImage-H using Mask2Former mIoU of 62.9 * 超越目前最好的 BEiT-3(62.8) ## Ablation Study(消融實驗) 透過去除某些元件來測試該設計對 Performance 的影響 可以確定以下幾件事: * Sharing weights among convolution neurons matters ![image](https://hackmd.io/_uploads/HkFK2X8ZR.png) InternImage-H share weights 以後,參數量少了 42%,Memory 用量少 84.2% 而且沒有造成太多的準確率下降 ![image](https://hackmd.io/_uploads/rypdp78WA.png) * Multi-group spatial aggregation brings stronger features ![image](https://hackmd.io/_uploads/rJogC7IbA.png) 同一個 query point(藍星),不同的 Group 會 Focus 在不一樣的地方 在第一、第二個 stages,receptive field 相對比較小,越往下漸漸擴大成 Global ![image](https://hackmd.io/_uploads/rypdp78WA.png) 可以看到如果把 multi-group 拿掉的話,準確率下降。 ## Conclusion & Limitations 此論文證明除了 ViT 之外,對於 large-scale vision task,CNN 也是一個值得考慮的選項 但對於要求快速的 tasks,DCN based 的 Model 帶來的 Latency 還是個問題。 但大型 CNN 模型的研究還在初始階段,InternImage 也許是個很好的起點。