{"notes":[{"id":"classic-cnns/internimage","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"InternImage","subtitle":"力業で奇跡は起きる？","author":"Z. Yuan","paperDate":"2022-11-10","publishedOn":"2025-09-04","world":"external/internimage","paperTitle":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","paperUrl":"https://arxiv.org/abs/2211.05778","bibliography":{"title":"InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions","authors":["Wenhai Wang","Jifeng Dai","Zhe Chen","Zhenhang Huang","Zhiqi Li","Xizhou Zhu","Xiaowei Hu","Tong Lu","Lewei Lu","Hongsheng Li","Xiaogang Wang","Yu Qiao"],"url":"https://arxiv.org/abs/2211.05778","pdfUrl":"https://arxiv.org/pdf/2211.05778v4","codeUrl":null,"preprint":{"id":"2211.05778","submittedOn":"2022-11-10","url":"https://arxiv.org/abs/2211.05778"},"publication":{"venue":"CVPR","year":2023,"kind":"conference","url":"https://openaccess.thecvf.com/content/CVPR2023/html/Wang_InternImage_Exploring_Large-Scale_Vision_Foundation_Models_With_Deformable_Convolutions_CVPR_2023_paper.html"},"citation":"@misc{classiccnnsinternimage2022,\n  title = {{InternImage: Exploring Large-Scale Vision Foundation Models with Deformable Convolutions}},\n  author = {Wenhai Wang and Jifeng Dai and Zhe Chen and Zhenhang Huang and Zhiqi Li and Xizhou Zhu and Xiaowei Hu and Tong Lu and Lewei Lu and Hongsheng Li and Xiaogang Wang and Yu Qiao},\n  year = {2022},\n  eprint = {2211.05778},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2211.05778}\n}\n","citationPath":"/content/papers/citations/classic-cnns/internimage.4baca0899bc9.bib"},"thumbnail":{"src":"/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png","width":1012,"height":1179},"locale":"ja","path":"/content/papers/ja/classic-cnns/internimage.d096fceb3441.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"畳み込みはどこで負けているのか","text":"畳み込みはどこで負けているのか","depth":3},{"id":"dcnv2をそのまま使えない理由","text":"DCNv2をそのまま使えない理由","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"dcnv3の三つの変更","text":"DCNv3の三つの変更","depth":3},{"id":"ネットワークに積み上げる","text":"ネットワークに積み上げる","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"検出とセグメンテーション","text":"検出とセグメンテーション","depth":3},{"id":"アブレーションsoftmaxの項目","text":"アブレーション：softmaxの項目","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/deformable-convnets","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/slak","relation":"referenced","topic":""}]},{"id":"classic-cnns/deformable-convnets","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"Deformable ConvNets","subtitle":"八艘飛び","author":"Z. Yuan","paperDate":"2017-03-17","publishedOn":"2024-05-01","world":"external/deformable-convnets","paperTitle":"Deformable Convolutional Networks","paperUrl":"https://arxiv.org/abs/1703.06211","bibliography":{"title":"Deformable Convolutional Networks","authors":["Jifeng Dai","Haozhi Qi","Yuwen Xiong","Yi Li","Guodong Zhang","Han Hu","Yichen Wei"],"url":"https://arxiv.org/abs/1703.06211","pdfUrl":"https://arxiv.org/pdf/1703.06211v3","codeUrl":null,"preprint":{"id":"1703.06211","submittedOn":"2017-03-17","url":"https://arxiv.org/abs/1703.06211"},"publication":{"venue":"ICCV","year":2017,"kind":"conference","url":"https://openaccess.thecvf.com/content_iccv_2017/html/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.html"},"citation":"@misc{classiccnnsdeformableconvnets2017,\n  title = {{Deformable Convolutional Networks}},\n  author = {Jifeng Dai and Haozhi Qi and Yuwen Xiong and Yi Li and Guodong Zhang and Han Hu and Yichen Wei},\n  year = {2017},\n  eprint = {1703.06211},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1703.06211}\n}\n","citationPath":"/content/papers/citations/classic-cnns/deformable-convnets.f724f3ff1784.bib"},"thumbnail":{"src":"/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png","width":987,"height":633},"locale":"ja","path":"/content/papers/ja/classic-cnns/deformable-convnets.36d236ad40bc.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"固定された格子","text":"固定された格子","depth":3},{"id":"ネットワークに変形を学ばせる試みはすでにあった","text":"ネットワークに変形を学ばせる試みはすでにあった","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"畳み込みの二つのステップ","text":"畳み込みの二つのステップ","depth":3},{"id":"各点にオフセットを加える","text":"各点にオフセットを加える","depth":3},{"id":"小数の位置からどう値を取るか","text":"小数の位置からどう値を取るか","depth":3},{"id":"オフセットはどこから来るのか","text":"オフセットはどこから来るのか","depth":3},{"id":"二つの特殊な場合","text":"二つの特殊な場合","depth":3},{"id":"変形可能roi-pooling","text":"変形可能RoI pooling","depth":3},{"id":"ネットワークに組み込む","text":"ネットワークに組み込む","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"受容野は本当に物体に合わせて変わる","text":"受容野は本当に物体に合わせて変わる","depth":3},{"id":"何層置き換えるか","text":"何層置き換えるか","depth":3},{"id":"膨張畳み込みと比べる","text":"膨張畳み込みと比べる","depth":3},{"id":"代償","text":"代償","depth":3},{"id":"coco","text":"COCO","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/stn","relation":"referenced","topic":""},{"id":"object-detection/deformable-detr","relation":"referenced","topic":""}]},{"id":"reparameterization/replknet","category":"reparameterization","legacyPath":"reparameterization/2203-replknet","legacySlug":"2203-replknet","legacyPaths":[],"title":"RepLKNet","subtitle":"巨大なカーネル","author":"Z. Yuan","paperDate":"2022-03-13","publishedOn":"2024-07-21","paperTitle":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","paperUrl":"https://arxiv.org/abs/2203.06717","bibliography":{"title":"Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs","authors":["Xiaohan Ding","Xiangyu Zhang","Yizhuang Zhou","Jungong Han","Guiguang Ding","Jian Sun"],"url":"https://arxiv.org/abs/2203.06717","pdfUrl":"https://arxiv.org/pdf/2203.06717","codeUrl":null,"preprint":{"id":"2203.06717","submittedOn":"2022-03-13","url":"https://arxiv.org/abs/2203.06717"},"publication":{"venue":"CVPR","year":2022,"kind":"conference","url":"https://arxiv.org/abs/2203.06717"},"citation":"@misc{reparameterizationreplknet2022,\n  title = {{Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs}},\n  author = {Xiaohan Ding and Xiangyu Zhang and Yizhuang Zhou and Jungong Han and Guiguang Ding and Jian Sun},\n  year = {2022},\n  eprint = {2203.06717},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2203.06717}\n}\n","citationPath":"/content/papers/citations/reparameterization/replknet.c7cc2407aa19.bib"},"thumbnail":{"src":"/content/papers/assets/b85fa678b6e815b9d112b67d68443295a98c80478664ec8053c2e832d89574ca.jpg","width":1140,"height":972},"locale":"ja","path":"/content/papers/ja/reparameterization/replknet.c895ec076bd6.md","headings":[{"id":"問題設定","text":"問題設定","depth":2},{"id":"大きなカーネルの使い方","text":"大きなカーネルの使い方","depth":2},{"id":"大きな-depthwise-カーネルも効率化できる","text":"大きな depthwise カーネルも効率化できる","depth":3},{"id":"大きなカーネルは残差接続に依存している","text":"大きなカーネルは残差接続に依存している","depth":3},{"id":"大きなカーネルには再パラメータ化が必要","text":"大きなカーネルには再パラメータ化が必要","depth":3},{"id":"大きなカーネルは下流タスクの性能を大きく向上させる","text":"大きなカーネルは下流タスクの性能を大きく向上させる","depth":3},{"id":"大きなカーネルは小さな特徴マップにも効果的","text":"大きなカーネルは小さな特徴マップにも効果的","depth":3},{"id":"提案手法","text":"提案手法","depth":2},{"id":"ネットワークアーキテクチャ","text":"ネットワークアーキテクチャ","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"大きなカーネルの評価","text":"大きなカーネルの評価","depth":3},{"id":"imagenet-上の性能","text":"ImageNet 上の性能","depth":3},{"id":"大きなカーネル-cnn-は深い小さなカーネルモデルよりも大きな-erf-を持つ","text":"大きなカーネル CNN は深い小さなカーネルモデルよりも大きな ERF を持つ","depth":3},{"id":"形状バイアス","text":"形状バイアス","depth":3},{"id":"制限","text":"制限","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{"問題定義":"問題設定","深層の大きなカーネルは依然として効率的":"大きな-depthwise-カーネルも効率化できる","問題解決":"提案手法","討論":"考察"},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"comparison","topic":"大きなカーネルと簡潔な畳み込み骨格"}]},{"id":"classic-cnns/slak","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"SLaK","subtitle":"カーネルPro Max","author":"Z. Yuan","paperDate":"2022-07-07","publishedOn":"2025-03-09","world":"external/slak","paperTitle":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","paperUrl":"https://arxiv.org/abs/2207.03620","bibliography":{"title":"More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity","authors":["Shiwei Liu","Tianlong Chen","Xiaohan Chen","Xuxi Chen","Qiao Xiao","Boqian Wu","Tommi Kärkkäinen","Mykola Pechenizkiy","Decebal Mocanu","Zhangyang Wang"],"url":"https://arxiv.org/abs/2207.03620","pdfUrl":"https://arxiv.org/pdf/2207.03620v3","codeUrl":null,"preprint":{"id":"2207.03620","submittedOn":"2022-07-07","url":"https://arxiv.org/abs/2207.03620"},"publication":{"venue":"ICLR","year":2023,"kind":"conference","url":"https://iclr.cc/virtual/2023/poster/11529"},"citation":"@misc{classiccnnsslak2022,\n  title = {{More ConvNets in the 2020s: Scaling up Kernels Beyond 51x51 using Sparsity}},\n  author = {Shiwei Liu and Tianlong Chen and Xiaohan Chen and Xuxi Chen and Qiao Xiao and Boqian Wu and Tommi Kärkkäinen and Mykola Pechenizkiy and Decebal Mocanu and Zhangyang Wang},\n  year = {2022},\n  eprint = {2207.03620},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2207.03620}\n}\n","citationPath":"/content/papers/citations/classic-cnns/slak.e167e693df01.bib"},"thumbnail":{"src":"/content/papers/assets/b5b8ba279efe42831c7ec4e60395d0559da26774c8519a438783f49f4b814a85.png","width":1640,"height":660},"locale":"ja","path":"/content/papers/ja/classic-cnns/slak.2268b5d78db5.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"31の先へ","text":"31の先へ","depth":3},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"ステップ12本の細長いカーネルに分解する","text":"ステップ1：2本の細長いカーネルに分解する","depth":3},{"id":"ステップ2もう少しスパースにもう少し広く","text":"ステップ2：もう少しスパースに、もう少し広く","depth":3},{"id":"slakの構成","text":"SLaKの構成","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"imagenet","text":"ImageNet","depth":3},{"id":"下流タスク","text":"下流タスク","depth":3},{"id":"実際に動かしてみると","text":"実際に動かしてみると","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/convnext","relation":"referenced","topic":""},{"id":"reparameterization/replknet","relation":"referenced","topic":""},{"id":"classic-cnns/resnext","relation":"referenced","topic":""}]}],"text":"2022年の時点で、パラメータが10億を超える視覚モデルはほぼすべてTransformerでした。ViT-Gは18億パラメータ、SwinV2-Gは30億、BEiT-3も19億あります。畳み込みネットワークの側では、最大のConvNeXt-XLとRepLKNet-XLでも3億あまりで止まっています。ConvNeXtは、一般的なサイズなら畳み込みもまだ戦えることを示しましたが、10億パラメータ、億単位の画像という規模で、ViTに匹敵する畳み込みネットワークを作った人はまだいませんでした。\n\nこの論文は、上海人工知能実験室、SenseTime、清華大学、南京大学、香港中文大学によるものです。著者リストにいるJifeng DaiとXizhou Zhuは、それぞれ変形可能畳み込みの第1世代と第2世代の筆頭著者で、今回は自分たちの演算子を持ち出して、大規模モデルのバックボーンにしようとしています。\n\n\n> [!TIP]\n> \n> 変形可能畳み込みは、先に私たちのノートで読めます。\n> \n> - **[[17.03] Deformable ConvNets：八艘飛び](/blog/papers/classic-cnns/deformable-convnets)**\n\n\n## 問題の定義\n\n### 畳み込みはどこで負けているのか\n\n著者らはまず、通常の畳み込みとマルチヘッド自己注意（MHSA）を比べ、二つの違いを挙げています。\n\n一つ目は長距離の依存関係です。3×3畳み込みを1層ずつ重ねても、有効受容野は実はそれほど大きくならず、ネットワークをいくら深くしても、ViTのように最初から画像全体を見るのは難しいのです。\n\n二つ目は適応的な空間集約です。自己注意の重みは入力に応じて変わり、画像ごと、位置ごとに異なります。畳み込みの重みは学習が終われば固定され、しかも局所性や平行移動同変性といった強い帰納バイアスを持っています。帰納バイアスのおかげで畳み込みネットワークは収束が速く、必要なデータも少なくて済みますが、Web規模のデータからより一般的なパターンを学ぶ妨げにもなります。\n\n[![4つのマスからなる模式図で、4種類の中核演算子を比べている。各マスの中央には、クエリピクセルを表す青い星印がある。(a)大域的な注意：画像全体が濃淡の異なる緑のマスで埋まり、適応的な重みを表す。長距離の依存関係あり、適応的な集約あり、ただし計算とメモリは節約できない、と注記されている。(b)局所的な注意：星印の左上の一角にだけ緑のマスがあり、長距離の依存関係なし、と注記されている。(c)大きなカーネル：灰色のマスが大きく広がり、固定の重みを表す。適応的な集約なし、と注記されている。(d)著者らの動的スパース畳み込み：9個の小さな緑の四角が星印のまわりに遠近さまざまに散らばり、3項目すべてにチェックが付いている](/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png)](/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png)\n\n*原論文Figure 1。[**v4 PDFの1ページ**](https://arxiv.org/pdf/2211.05778v4#page=1)から抜粋、CC BY 4.0。灰色は固定の重み、緑は入力に応じて変わる重みです。*\n\nRepLKNetやSLaKのような大きなカーネルは一つ目を補いましたが、二つ目はまだ欠けていて、重みは学習が終われば固定のままです。変形可能畳み込みは両方を備えています。各サンプリング点のオフセットによって近くも遠くも見られ、しかもオフセットと変調の重みはどちらも入力から計算されます。\n\n\n> [!TIP]\n> \n> 大きなカーネルの路線は、この2本で読めます。\n> \n> - **[[22.03] RepLKNet：巨大なカーネル](/blog/papers/reparameterization/replknet)**\n> - **[[22.07] SLaK：カーネルPro Max](/blog/papers/classic-cnns/slak)**\n\n\n### DCNv2をそのまま使えない理由\n\nDCNv2の位置$p_0$での出力は、次のように書けます。\n\n$$\ny(p_0)=\\sum_{k=1}^{K} w_k\\, m_k\\, x\\!\\left(p_0+p_k+\\Delta p_k\\right),\n$$\n\n$K$はサンプリング点の数で、3×3なら$K=9$です。$p_k$は通常の畳み込みの格子位置、$\\Delta p_k$は学習されたオフセット、$m_k$はsigmoidを通した変調の重み、$w_k$は$k$番目のサンプリング点の射影重みで、大きさは$C\\times C$です。\n\n問題は、DCNv2が普段はアドオンとして使われていることです。通常の畳み込みで事前学習した重みを読み込んでから、変形可能畳み込みに置き換えて微調整します。10億パラメータのバックボーンをゼロから学習させるとなると、二つの難点があります。各サンプリング点がそれぞれ$C\\times C$の重みを1組持つので、パラメータ数もメモリも$K$に比例して増えます。また、sigmoidによって各$m_k$は0から1のあいだに収まるので、9個の合計は0から9のあいだのどんな値にもなりえ、モデルが大きく、データが多くなると、勾配が不安定になります。\n\n## 問題の解決\n\n### DCNv3の三つの変更\n\n**一、サンプリング点で重みを共有する**。可分離畳み込みの考え方を借りて、$w_k$を二つに分けます。位置に関係する部分は変調の重み$m_k$に任せ、これはdepthwiseに相当します。位置に関係しない射影$w$はすべてのサンプリング点で共有し、これはpointwiseに相当します。もともと9組あった$C\\times C$の重みが、1組だけになります。\n\n**二、グループ化**。マルチヘッド注意にならって、チャネルを$G$個のグループに分けます。各グループは独自のオフセットと変調の重みを持つので、同じ層の中でもグループごとに違う場所を見られます。\n\n**三、変調の重みをsoftmaxに替える**。sigmoidは点ごとに別々に計算しますが、これを9点まとめてsoftmaxにすると、合計は常に1になります。\n\nこれらを合わせたものがDCNv3です。\n\n$$\ny(p_0)=\\sum_{g=1}^{G}\\sum_{k=1}^{K} w_g\\, m_{gk}\\, x_g\\!\\left(p_0+p_k+\\Delta p_{gk}\\right),\n$$\n\n$x_g$は$g$番目のグループのチャネルで、各グループは$C' = C/G$チャネルです。$m_{gk}$は$K$の方向にsoftmaxをとります。\n\nオフセットは小数なので、サンプリング位置はふつうピクセルのあいだに落ち、双線形補間で値を取る必要があります。PyTorchの`grid_sample`で最も簡単な版を書いてみましょう。最後の共有の射影はひとまず省きます。\n\n```python\nimport torch\nimport torch.nn.functional as F\n\ndef dcnv3_core(x, offset, logits, G):\n    # x: (C, H, W)；offset: (G, 9, 2, H, W)、単位はピクセル；logits: (G, 9, H, W)\n    C, H, W = x.shape\n    m = logits.softmax(dim=1)                                  # 各グループの9個のサンプリング点の重みの合計は1\n    ys, xs = torch.meshgrid(torch.arange(H), torch.arange(W), indexing=\"ij\")\n    grid = [(dy, dx) for dy in (-1, 0, 1) for dx in (-1, 0, 1)]  # 3×3の基本位置p_k\n    out = torch.zeros_like(x)\n    for g, xg in enumerate(x.split(C // G)):                   # グループごとに独自のオフセットと重み\n        for k, (dy, dx) in enumerate(grid):\n            py = ys + dy + offset[g, k, 0]                     # p0 + p_k + Δp\n            px = xs + dx + offset[g, k, 1]\n            pos = torch.stack([px / (W - 1) * 2 - 1, py / (H - 1) * 2 - 1], -1)\n            v = F.grid_sample(xg[None], pos[None], align_corners=True)[0]   # 双線形補間で値を取る\n            out[g * (C // G):(g + 1) * (C // G)] += m[g, k] * v\n    return out                                                 # この後に、全サンプリング点で共有する線形射影を1つつなぐ\n\ntorch.manual_seed(0)\nC, H, W, G = 8, 16, 16, 2\nx = torch.randn(C, H, W)\n\n# オフセットがすべて0、重みもすべて同じ：3×3の平均に退化する\nzero_off, flat = torch.zeros(G, 9, 2, H, W), torch.zeros(G, 9, H, W)\nout = dcnv3_core(x, zero_off, flat, G)\nprint(\"オフセットが0のとき、3×3平均プーリングとの最大の差：\", f\"{(out - F.avg_pool2d(x, 3, 1, 1)).abs().max():.1e}\")\n\n# グループ0の9点をすべて5マス下へ移す：3×3のカーネルが5マス先を見る\noff = zero_off.clone()\noff[0, :, 0] = 5.0\nout = dcnv3_core(x, off, flat, G)\nref = F.avg_pool2d(x, 3, 1, 1)\nprint(\"グループ0を5マス下へ移した後、5マス下の平均値との最大の差：\", f\"{(out[:4, :-5] - ref[:4, 5:]).abs().max():.1e}\")\nprint(\"グループ1は影響を受けない。最大の差：\", f\"{(out[4:] - ref[4:]).abs().max():.1e}\")\n```\n\n```\nオフセットが0のとき、3×3平均プーリングとの最大の差： 2.4e-07\nグループ0を5マス下へ移した後、5マス下の平均値との最大の差： 1.8e-07\nグループ1は影響を受けない。最大の差： 2.4e-07\n```\n\nオフセットが0で、softmaxの重みが均等なとき、DCNv3は3×3の平均そのものです。オフセットが動けば、同じ9個のサンプリング点が5マス先まで移動でき、しかも動くのはそのグループだけです。実際のモデルでは、オフセットと変調の重みは、3×3のdepthwise畳み込みに線形層をつないだもので入力から計算されるので、位置ごとに異なります。公式コードには純粋なPyTorchの版もありますが、コメントにはデバッグとテスト専用と明記されていて、学習ではCUDA演算子を使います。\n\nsoftmaxの項目は小さな変更に見えますが、二つのやり方の合計を出力して比べてみましょう。\n\n```python\nimport torch\n\ntorch.manual_seed(0)\nfor scale in (0.5, 2.0, 5.0):\n    logits = torch.randn(10000, 9) * scale        # 1万個の位置、各位置に9個のサンプリング点\n    s = torch.sigmoid(logits).sum(1)               # DCNv2：各点がそれぞれsigmoidを通る\n    t = torch.softmax(logits, 1).sum(1)            # DCNv3：9点まとめてsoftmaxを通る\n    print(f\"logitの標準偏差 {scale}：sigmoidの合計 {s.min():.2f}〜{s.max():.2f}、softmaxの合計 {t.min():.2f}〜{t.max():.2f}\")\n```\n\n```\nlogitの標準偏差 0.5：sigmoidの合計 3.07〜5.87、softmaxの合計 1.00〜1.00\nlogitの標準偏差 2.0：sigmoidの合計 0.95〜8.13、softmaxの合計 1.00〜1.00\nlogitの標準偏差 5.0：sigmoidの合計 0.33〜8.53、softmaxの合計 1.00〜1.00\n```\n\nsigmoidの合計は、位置によって最大で20数倍も違い、各位置の出力にそれぞれ違う倍率が掛かっているのと同じです。softmaxなら常に1です。この項目の影響がどれほど大きいかは、後のアブレーション実験でわかります。\n\n### ネットワークに積み上げる\n\n演算子ができたので、次はそれでどうネットワークを組むかです。\n\n[![InternImageのアーキテクチャ図。左側がメインの経路で、レッサーパンダの写真を入力し、stemを経て、stage 1からstage 4を順に通る。ステージのあいだはdownsamplingでつながり、特徴マップはH/4×W/4からH/32×W/32まで縮み、最後に分類、検出、セグメンテーションなどのタスクにつながる。右側の三つの枠には、stemがストライド2の3×3畳み込み2つにLNとGELUを加えたもの、downsamplingがストライド2の3×3畳み込みにLNを加えたものだと書かれている。stage iの基本ブロックはDCNv3、LN、FFN、LNからなり、残差接続が2か所ある。DCNv3の横にはオフセットΔpと変調の重みmが記されている。一番下には4つの積み上げ規則が並んでいる](/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png)](/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png)\n\n*原論文Figure 3。[**v4 PDFの4ページ**](https://arxiv.org/pdf/2211.05778v4#page=4)から抜粋、CC BY 4.0。*\n\n基本ブロックはTransformerによく似ています。もともと自己注意があった位置にDCNv3を置き、続いてGELUを使うFFNをつなぎます。二つの分岐の出力は、どちらもまずLNを通してから残差と足し合わせます。stemとダウンサンプリング層は畳み込みネットワークのやり方のままで、stemはストライド2の3×3畳み込みが2つ、ダウンサンプリングはストライド2の3×3畳み込みが1つです。\n\n4つのステージにはそれぞれチャネル数$C_i$、グループ数$G_i$、ブロック数$L_i$があり、合わせて12個のハイパーパラメータになります。これは多すぎます。著者らは4つの規則で、これを4個に絞り込みました。\n\n1. $C_i = 2^{i-1} C_1$、チャネル数はステージごとに倍になる。\n2. $G_i = C_i / C'$、グループあたりのチャネル数$C'$は固定。\n3. $L_1 = L_2 = L_4$。\n4. $L_1 \\le L_3$、3番目のステージが最も深い。\n\n後の二つは、ConvNeXtやSwinと同じ「AABA」型の積み方です。残る$C_1$、$C'$、$L_1$、$L_3$の4つの数について、著者らは3,000万パラメータ前後で30通りの組み合わせを探し、$(64, 16, 4, 18)$をInternImage-Tに選びました。\n\nさらに大きくする際には、EfficientNetの複合スケーリングを参考に、深さに$\\alpha^{\\phi}$、幅に$\\beta^{\\phi}$を掛け、$\\alpha\\beta^{1.99}\\approx 2$という制約を置きました。実験の結果、$\\alpha = 1.09$、$\\beta = 1.36$が最も良くなりました。最終的に6つのサイズができています。\n\n| モデル | $C_1$ | $C'$ | 各ステージのブロック数 | パラメータ数 |\n| --- | ---: | ---: | --- | ---: |\n| InternImage-T | 64 | 16 | 4, 4, 18, 4 | 30M |\n| InternImage-S | 80 | 16 | 4, 4, 21, 4 | 50M |\n| InternImage-B | 112 | 16 | 4, 4, 21, 4 | 97M |\n| InternImage-L | 160 | 16 | 5, 5, 22, 5 | 223M |\n| InternImage-XL | 192 | 16 | 5, 5, 24, 5 | 335M |\n| InternImage-H | 320 | 32 | 6, 6, 32, 6 | 1.08B |\n\n*表：原論文Table 1から抜粋。*\n\nTからXLまでのサイズは、比較しやすいようにConvNeXtにそろえてあります。Hは、10億パラメータを目指して別に作ったものです。\n\n## 考察\n\n### ImageNet\n\nまず一般的なサイズを見ます。T、S、BはImageNet-1Kだけで300エポック学習させ、入力は224×224です。\n\n| サイズ | Swin | ConvNeXt | SLaK | HorNet | InternImage |\n| --- | ---: | ---: | ---: | ---: | ---: |\n| T（約30M） | 81.3% | 82.1% | 82.5% | 83.0% | **83.5%** |\n| S（約50M） | 83.0% | 83.1% | 83.8% | 84.0% | **84.2%** |\n| B（約90M） | 83.5% | 83.8% | 84.0% | 84.3% | **84.9%** |\n\n*表：原論文Table 2から一部の列を抜粋。同じ行のモデルは、パラメータ数とFLOPsがほぼ同じです。*\n\n同じサイズなら、InternImageはどの行でも最高で、TはConvNeXt-Tより1.4ポイント、Bも1.1ポイント高くなっています。\n\n次に大きなモデルです。XLはまずImageNet-22Kで事前学習し、88.0%に達しました。HはM3I事前学習で4.27億枚の公開画像を使って学習しています。データはLAION-400M、YFCC-15M、CC12Mから来ていて、最終的に640×640の入力で89.6%を達成しました。最強のViTとハイブリッドアーキテクチャはおよそ90.5%〜90.9%で、JFTのような非公開のデータを使っています。差はおよそ1ポイントです。\n\n### 検出とセグメンテーション\n\n下流タスクでの差は、分類より大きくなります。COCOでMask R-CNNを12エポック学習させると、InternImage-Tのbox APは47.2、Swin-Tは42.7、ConvNeXt-Tは44.2で、それぞれ4.5と3.0上回ります。Cascade Mask R-CNNとマルチスケール学習で36エポックにすると、XLは56.2、ConvNeXt-XLは55.2です。ADE20KのセマンティックセグメンテーションではUperNetを使い、InternImage-Bは50.8 mIoU、ConvNeXt-Bは49.1、RepLKNet-31Bは49.9、SLaK-Bは50.2です。\n\n論文で最もよく引用されるのは、COCO test-devでの65.4 box APで、それまで最高だったFD-SwinV2-Gより1.2高く、パラメータは27%少なくなっています。この数字がどう得られたかは、触れておく価値があります。バックボーンはInternImage-Hで、まず4.27億枚の画像で事前学習します。さらに複合バックボーンの手法でパラメータを倍の21.8億にし、検出器にはDINOを使って、まずObjects365で26エポック、続いてCOCOで12エポック学習させます。ADE20Kの62.9 mIoUも、HにMask2Formerを組み合わせ、マルチスケールテストを加えたものです。使える手はすべて重ねてあり、この数字は、このバックボーンが大規模な学習に耐えられることを見せるデモンストレーションに近いものです。\n\n\n> [!TIP]\n> \n> DINO検出器は、こちらのノートで読めます。\n> \n> - **[[22.03] DINO：近くても、まだ遠い](/blog/papers/object-detection/dino-detr)**\n\n\n### アブレーション：softmaxの項目\n\nDCNv3の三つの変更を一つずつ外して、InternImage-Tで比べます。\n\n| 設定 | ImageNet top-1 | COCO box AP | COCO mask AP |\n| --- | ---: | ---: | ---: |\n| 完全なDCNv3 | 83.5% | 47.2 | 42.5 |\n| 重みを共有しない | 83.6% | 47.4 | 42.6 |\n| グループ化しない | 82.3% | 43.8 | 40.0 |\n| softmaxの代わりにsigmoid | **65.7%** | 38.7 | 35.6 |\n\n*表：原論文Table 6から抜粋。COCOはMask R-CNNを12エポック学習させています。*\n\n重みの共有は正解率にほとんど影響しませんが、共有しない版はパラメータが66.1%も多くなります。Hの規模まで大きくすると、重みの共有でパラメータの42.0%、GPUメモリの84.2%を節約できます。この項目は、モデルを大きくするためのものです。\n\nグループ化を外すと、ImageNetは1.2、COCOは3.4下がり、検出のほうが大きな影響を受けます。\n\nsoftmaxをsigmoidに戻すと、ImageNetは一気に65.7%まで落ち、18ポイント近く下がります。先ほど出力した合計の数行の影響が、ここではっきり表れています。\n\n著者らは3×3をより大きなサンプリング格子に替えることも試しています。5×5は83.6%で、パラメータは30Mから37Mに増えます。7×7ではかえって82.8%に下がり、パラメータは48Mです。サンプリング点は自分で動けるので、3×3で十分なのです。\n\n[![同じ羊の群れの写真が4枚並び、それぞれstage 1〜stage 4と記されている。青い星印は左の1頭の羊の体の上に固定されている。stage 1とstage 2では色とりどりのサンプリング点が星印の近くに密集し、横に拡大枠がある。stage 3とstage 4ではサンプリング点が写真全体に散らばり、ほかの羊の上や草地に落ちている。色の違いはグループの違いを表す](/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png)](/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png)\n\n*原論文Figure 5。[**v4 PDFの8ページ**](https://arxiv.org/pdf/2211.05778v4#page=8)から抜粋、CC BY 4.0。青い星印はクエリ点で、色ごとに異なるグループのサンプリング位置です。*\n\nサンプリング点の分布にも段階があります。最初の二つのステージではクエリ点の近くに密集していて、局所を見ています。3番目と4番目のステージになると、画像全体に散らばります。ViTは最初の層から大域的なので、この点は大きく異なります。\n\n### 代償\n\n最大の代償は速度です。著者らは付録で、A100を1枚使ってスループットを測っています。224×224ではバッチ256、800×800ではバッチ2です。\n\n| モデル | ImageNet top-1 | 224×224（枚／秒） | 800×800（枚／秒） |\n| --- | ---: | ---: | ---: |\n| ConvNeXt-B | 83.8% | 881 | 58 |\n| RepLKNet-B | 83.5% | 884 | 21 |\n| DAT-B | 84.0% | 661 | 24 |\n| InternImage-B（DCNv2） | — | 311 | 16 |\n| InternImage-B | **84.9%** | 775 | 54 |\n\n*表：原論文Table 11から抜粋。*\n\nDCNv3に替えると、スループットはDCNv2版の2.5〜3.4倍になります。ConvNeXt-Bと比べるとまだ少し遅く、224では12%、800では7%少なくなっています。一方、高解像度ではRepLKNet-Bの2.5倍で、大きなカーネルにとって大きな画像はかなりの負担です。著者らも結論で、DCN系の演算子の遅延は、速度を重視する下流タスクにとってまだ課題だと認めています。\n\nもう一つ見ておきたいのがデータ量です。著者らはImageNet-1Kから均等に1%、10%、全データを抽出し、それぞれ300エポック学習させました。\n\n| モデル | 1% | 10% | 100% |\n| --- | ---: | ---: | ---: |\n| ResNet-50 | **12.2%** | **57.5%** | 80.4% |\n| ConvNeXt-T | 8.4% | 52.6% | 82.1% |\n| Swin-T | 失敗 | 12.1% | 81.3% |\n| InternImage-T | 5.9% | 56.0% | **83.5%** |\n\n*表：原論文Table 12から抜粋。*\n\n著者らは、InternImage-Tは1%でも10%でも頑健だと述べています。ところが1%の列では、ResNet-50にもConvNeXt-Tにも負けていて、勝っているのは学習そのものに失敗したSwin-Tだけです。10%でもResNet-50には負けています。Swin-Tより少ないデータに強いのは確かですが、データが1%しかない場合は、帰納バイアスの強いResNet-50やConvNeXt-Tのほうがやはり良いのです。\n\n## 結論\n\n記録を塗り替えたあの数字は、確かに力業で出したものです。4.27億枚の画像、パラメータを倍にした複合バックボーン、Objects365での事前学習、そこにDINOを組み合わせて、ようやくCOCOの65.4になりました。\n\nところが一般的なサイズに戻し、パラメータもFLOPsもConvNeXtにそろえても、InternImageはImageNetで1ポイント以上高く、COCOのbox APも1.8〜3.0高くなっています。ここには頼れる力業がなく、効いているのはDCNv3そのものです。\n\n自分で動かしたいなら、まずあのカスタムCUDA演算子と仲良くならなければなりません。コンパイルも、デプロイも、TensorRTへのエクスポートも、どの関門でもまずそれを通る必要があります。\n\n最後に小さな余談を。この論文のアブレーション実験では、softmaxをsigmoidに戻しただけで、正解率は83.5%から65.7%に転落しました。1年あまり後、ほぼ同じ顔ぶれがDCNv4を発表しましたが、その二つの主な変更の一つが、softmaxを丸ごと取り除くことでした。しかも、そのほうが収束も速くなったのです。\n\n論文の鍵となる設計も、賞味期限は1年しかないことがあります。\n","imageSizes":{"/content/papers/assets/eb597a4ac9a7c2e5e9b05e8ff1c61a951adab71d5cc5a273796762d353a9a0e9.png":{"width":1012,"height":1179},"/content/papers/assets/902dfc93f6ae81a66758189ee04f89df167af4dc79a2eee9960400c444fd2515.png":{"width":1017,"height":1467},"/content/papers/assets/0e4e2959c920bda3aad3e121de44c615afd08bade1ea30c49dbe8f20bd801598.png":{"width":1012,"height":666}}}
