{"notes":[{"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":"classic-cnns/stn","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"STN","subtitle":"変幻自在","author":"Z. Yuan","paperDate":"2015-06-05","publishedOn":"2023-10-25","world":"external/stn","paperTitle":"Spatial Transformer Networks","paperUrl":"https://arxiv.org/abs/1506.02025","bibliography":{"title":"Spatial Transformer Networks","authors":["Max Jaderberg","Karen Simonyan","Andrew Zisserman","Koray Kavukcuoglu"],"url":"https://arxiv.org/abs/1506.02025","pdfUrl":"https://arxiv.org/pdf/1506.02025v3","codeUrl":null,"preprint":{"id":"1506.02025","submittedOn":"2015-06-05","url":"https://arxiv.org/abs/1506.02025"},"publication":{"venue":"NeurIPS","year":2015,"kind":"conference","url":"https://papers.nips.cc/paper_files/paper/2015/hash/33ceb07bf4eeb3da587e268d663aba1a-Abstract.html"},"citation":"@misc{classiccnnsstn2015,\n  title = {{Spatial Transformer Networks}},\n  author = {Max Jaderberg and Karen Simonyan and Andrew Zisserman and Koray Kavukcuoglu},\n  year = {2015},\n  eprint = {1506.02025},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1506.02025}\n}\n","citationPath":"/content/papers/citations/classic-cnns/stn.e823b15c17eb.bib"},"thumbnail":{"src":"/content/papers/assets/7b29191fd34e282fbd2d0fa901014f5770192cf1641d814b39b43a903817fb7f.png","width":480,"height":364},"locale":"ja","path":"/content/papers/ja/classic-cnns/stn.c40bd13e88ba.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"三つの部品","text":"三つの部品","depth":3},{"id":"グリッド生成器出力から逆にたどる","text":"グリッド生成器：出力から逆にたどる","depth":3},{"id":"サンプラー格子点のあいだで値を取る","text":"サンプラー：格子点のあいだで値を取る","depth":3},{"id":"ネットワークに組み込む","text":"ネットワークに組み込む","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"変形したmnist","text":"変形したMNIST","depth":3},{"id":"ストリートビューの番地","text":"ストリートビューの番地","depth":3},{"id":"鳥の細粒度分類","text":"鳥の細粒度分類","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"text-recognition/rare","relation":"referenced","topic":""}]},{"id":"object-detection/deformable-detr","category":"object-detection","legacyPath":"object-detection/2010-deformable-detr","legacySlug":"2010-deformable-detr","legacyPaths":[],"title":"Deformable DETR","subtitle":"可変形な注意力メカニズム","author":"Z. Yuan","paperDate":"2020-10-08","publishedOn":"2024-09-20","paperTitle":"Deformable DETR: Deformable Transformers for End-to-End Object Detection","paperUrl":"https://arxiv.org/abs/2010.04159","bibliography":{"title":"Deformable DETR: Deformable Transformers for End-to-End Object Detection","authors":["Xizhou Zhu","Weijie Su","Lewei Lu","Bin Li","Xiaogang Wang","Jifeng Dai"],"url":"https://arxiv.org/abs/2010.04159","pdfUrl":"https://arxiv.org/pdf/2010.04159","codeUrl":null,"preprint":{"id":"2010.04159","submittedOn":"2020-10-08","url":"https://arxiv.org/abs/2010.04159"},"publication":{"venue":"ICLR","year":2021,"kind":"conference","url":"https://arxiv.org/abs/2010.04159"},"citation":"@misc{objectdetectiondeformabledetr2020,\n  title = {{Deformable DETR: Deformable Transformers for End-to-End Object Detection}},\n  author = {Xizhou Zhu and Weijie Su and Lewei Lu and Bin Li and Xiaogang Wang and Jifeng Dai},\n  year = {2020},\n  eprint = {2010.04159},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2010.04159}\n}\n","citationPath":"/content/papers/citations/object-detection/deformable-detr.df721a30472e.bib"},"thumbnail":{"src":"/content/papers/assets/36edfc5595a85c73fcdc9a4bbb9e1ca512e1f100676eb7c37203d71c84905c05.jpg","width":1224,"height":752},"locale":"ja","path":"/content/papers/ja/object-detection/deformable-detr.357715629c52.md","headings":[{"id":"問題定義","text":"問題定義","depth":2},{"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":"議論","text":"議論","depth":2},{"id":"detr-との比較","text":"DETR との比較","depth":3},{"id":"アブレーション実験","text":"アブレーション実験","depth":3},{"id":"sota-との比較","text":"SOTA との比較","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"object-detection/detr","relation":"background","topic":"集合予測と Attention による検出"},{"id":"object-detection/h-detr","relation":"next","topic":"集合予測と Attention による検出"},{"id":"object-detection/smca-detr","relation":"comparison","topic":"Transformer 検出器の収束を速める"}]}],"text":"同じ写真の中でも、近くの犬は大きく、遠くの犬は小さく写ります。同じ猫でも、座ったり、寝そべったり、伸びをしたりします。認識モデルが対処しなければならないのは、クラスだけでなく、こうした幾何学的な変化でもあります。\n\n畳み込みネットワークがこれに対処する方法は、主にデータ頼みです。学習時に画像を反転、拡大縮小、クロップして、ネットワークに十分多くの姿を見せ、十分大きなモデルでそれらを覚えさせます。ところが、ネットワーク自体の構造は固定されています。$3\\times3$畳み込みはいつも正方形の格子の上でサンプリングし、プーリングはいつも決まった比率で縮小し、RoI poolingはいつも候補ボックスを決まった格子に切り分けます。\n\n2017年3月、Microsoft Research AsiaのJifeng Daiらがこの論文を公開しました。彼らは、畳み込みのサンプリング位置が自分で動けるようにしようと考えました。\n\n## 問題の定義\n\n### 固定された格子\n\n著者らは、幾何学的な変化への従来の対処法は二つあると指摘します。一つはデータ拡張で、学習データに十分多様な変化を含めること。もう一つは、SIFTやスライディングウィンドウによる検出のように、変化に影響されにくい特徴やアルゴリズムを設計することです。\n\nどちらのやり方にも、どんな変化が起こるかを事前に知っているという同じ前提があります。データ拡張では、どう回転させ、どう縮めるかを先に決めておく必要がありますし、手作業で設計した不変特徴は、複雑すぎる変化には作れません。新しいタスクで想定していなかった変化が出てくると、これらの方法はお手上げです。\n\n畳み込みネットワークにも同じ問題があり、その原因は固定された構造にあります。著者らは二つの例を挙げています。\n\n1. **同じ層の受容野はどれも同じ大きさ**。上位層の特徴は意味を持ち、位置によって大きさも形も違う物体に対応しうるのに、受容野はまったく同じです。セマンティックセグメンテーションのように精密な位置特定が必要なタスクでは、受容野が物体に合わせて調整されることが望まれます。\n2. **検出は今も四角いボックスで特徴を取る**。当時の物体検出手法は、どれも最後は矩形の候補ボックスの中で特徴を取り出していました。人や動物のように形が一定しない物体では、ボックスの大半が背景です。\n\n### ネットワークに変形を学ばせる試みはすでにあった\n\nネットワーク自身に幾何学変換を学ばせる手法としては、以前からSTNがありました。アフィン行列のような大域的な変換パラメータを1組予測し、特徴マップ全体をそれに合わせてゆがめます。\n\n\n> [!TIP]\n> \n> STNについては私たちのノートを参照してください。\n> \n> - **[[15.06] STN：変幻自在](/blog/papers/classic-cnns/stn)**\n\n\nSTNは特徴マップ全体に同じ変換をかけ、計算量が大きく、変換パラメータも学習しにくく、当時の成功例は主に小規模な画像分類でした。検出やセグメンテーションの画像には多くの物体があり、それぞれ大きさも姿勢も違うので、大域的な変換1つではとても対応しきれません。\n\n畳み込みのサンプリング点一つひとつを、位置ごとに、目の前の内容に応じてそれぞれ動かすことはできないでしょうか？\n\n## 問題の解決\n\n### 畳み込みの二つのステップ\n\nまず、通常の畳み込みをはっきり書いておきます。著者らは2D畳み込みを二つのステップに分けます。まず入力特徴マップ上で規則的な格子$\\mathcal{R}$に従ってサンプリングし、次に取り出した値に重みを掛けて合計します。\n\n$3\\times3$畳み込みの格子は次のとおりです。\n\n$$\n\\mathcal{R}=\\{(-1,-1),(-1,0),\\ldots,(0,1),(1,1)\\},\n$$\n\n全部で9点です。出力特徴マップ上の各位置$\\mathbf{p}_0$は、次のように計算されます。\n\n$$\n\\mathbf{y}(\\mathbf{p}_0)=\\sum_{\\mathbf{p}_n\\in\\mathcal{R}}\\mathbf{w}(\\mathbf{p}_n)\\cdot\\mathbf{x}(\\mathbf{p}_0+\\mathbf{p}_n).\n$$\n\n$\\mathbf{p}_n$は格子上の9点を順にたどります。この式はどのチャネルでも同じなので、以降は2Dの空間位置だけを考えます。\n\n### 各点にオフセットを加える\n\n変形可能畳み込みが変えるのは一か所だけで、格子上の各点にオフセット$\\Delta\\mathbf{p}_n$を加えます。\n\n$$\n\\mathbf{y}(\\mathbf{p}_0)=\\sum_{\\mathbf{p}_n\\in\\mathcal{R}}\\mathbf{w}(\\mathbf{p}_n)\\cdot\\mathbf{x}(\\mathbf{p}_0+\\mathbf{p}_n+\\Delta\\mathbf{p}_n).\n$$\n\n重み$\\mathbf{w}$は変わらず、変わるのはどこから値を取るかです。\n\n[![3x3畳み込みのサンプリング位置を示す4つの図で、背景は破線の格子。(a)緑の9点が規則的な3x3の正方形に並ぶ。(b)薄い緑の元の位置が、それぞれ薄い青の矢印で濃い青の新しい位置へ押し出され、方向も距離もばらばら。(c)9点が中心から等しい比率で外側へ押し出され、拡大した正方形になる。(d)9点全体がある角度だけ回転している](/content/papers/assets/45479d40b2beb8096d042f56871e08317e36ffc2be1857a325732d436b36da0f.png)](/content/papers/assets/45479d40b2beb8096d042f56871e08317e36ffc2be1857a325732d436b36da0f.png)\n\n*原論文Figure 1。[**v3 PDFの2ページ**](https://arxiv.org/pdf/1703.06211v3#page=2)から抜粋。(a)通常の畳み込みの規則的なサンプリング格子。(b)変形可能畳み込みで、各点にオフセットが加わります。(c)(d)は(b)の特殊な場合で、それぞれ拡大縮小と回転に対応します。*\n\n(a)は通常の畳み込みです。(b)では9点がそれぞれ新しい位置へ押し出され、方向も距離もばらばらです。(c)と(d)は(b)の特殊な場合です。(c)はすべての点が中心から外へ押し出されていて、カーネルを拡大したのと同じです。(d)はすべての点が中心のまわりを一緒に回っていて、回転と同じです。つまり、拡大縮小、縦横比、回転といった変換は、どれも「各点がそれぞれずれる」ことの中に含まれています。\n\n### 小数の位置からどう値を取るか\n\nオフセットは学習で得られるので、ふつうはちょうど整数にはならず、サンプリング点は格子点のあいだに落ちます。著者らは双線形補間で値を取ります。\n\n$$\n\\mathbf{x}(\\mathbf{p})=\\sum_{\\mathbf{q}}G(\\mathbf{q},\\mathbf{p})\\cdot\\mathbf{x}(\\mathbf{q}),\\qquad\nG(\\mathbf{q},\\mathbf{p})=g(q_x,p_x)\\cdot g(q_y,p_y),\\qquad g(a,b)=\\max(0,1-|a-b|).\n$$\n\n$\\mathbf{q}$は特徴マップ上のすべての整数位置をたどりますが、$g$が0でないのは距離が1未満のときだけなので、実際に重みを持つのは最も近い4点だけです。$5\\times5$の特徴マップで一度計算してみましょう。中心位置は$\\mathbf{p}_0=(2,2)$、格子上の右上の点は$\\mathbf{p}_n=(-1,1)$で、学習されたオフセットを$(0.25,0.5)$とします。\n\n```python\nimport torch\n\nx = torch.arange(25.).reshape(5, 5)                # 5×5の特徴マップ。値はちょうど0から24\nprint(x)\n\ndef g(a, b):\n    return max(0.0, 1 - abs(a - b))\n\ndef sample(x, py, px):\n    \"\"\"式(3)、(4)：すべての整数位置qで重み付けするが、重みが0でないのは最も近い4点だけ\"\"\"\n    total = 0.0\n    for qy in range(x.shape[0]):\n        for qx in range(x.shape[1]):\n            w = g(qy, py) * g(qx, px)\n            if w > 0:\n                print(f\"  q=({qy},{qx}) 値 {x[qy, qx].item():4.1f} 重み {w:.3f}\")\n                total += w * x[qy, qx].item()\n    return total\n\np0, pn, dp = (2, 2), (-1, 1), (0.25, 0.5)           # 中心位置、格子上の右上、学習されたオフセット\npy, px = p0[0] + pn[0] + dp[0], p0[1] + pn[1] + dp[1]\nprint(f\"サンプリング位置 p0 + pn + Δpn = ({py}, {px})\")\nprint(\"補間の結果：\", sample(x, py, px))\n```\n\n```text\ntensor([[ 0.,  1.,  2.,  3.,  4.],\n        [ 5.,  6.,  7.,  8.,  9.],\n        [10., 11., 12., 13., 14.],\n        [15., 16., 17., 18., 19.],\n        [20., 21., 22., 23., 24.]])\nサンプリング位置 p0 + pn + Δpn = (1.25, 3.5)\n  q=(1,3) 値  8.0 重み 0.375\n  q=(1,4) 値  9.0 重み 0.375\n  q=(2,3) 値 13.0 重み 0.125\n  q=(2,4) 値 14.0 重み 0.125\n補間の結果： 9.75\n```\n\n元の右上の点は$(1,3)$にあり、値は8です。オフセットを加えると$(1.25,3.5)$に落ち、4つの近傍が距離に応じて重みを分け合い、4つの重みの合計は1になります。この特徴マップの値はちょうど$5\\times\\text{行}+\\text{列}$なので、代入すると$5\\times1.25+3.5=9.75$となり、補間の結果と一致します。\n\n補間は連続なので、出力は$\\Delta\\mathbf{p}_n$について微分でき、勾配はオフセットまでそのまま伝わります。\n\n### オフセットはどこから来るのか\n\n[![変形可能畳み込みの模式図。左はinput feature mapで、3x3のサンプリング枠が1組描かれている。緑の矢印が入力をconvに送り、チャネル数2Nのoffset fieldを生成し、そこからこの位置のoffsetsを取り出す。offsetsは向きの異なる3x3個の小さな矢印として描かれている。offsetsは下のdeformable convolutionへ送られ、入力特徴マップ上の変形したサンプリング位置が、青い破線で右のoutput feature map上の1点につながっている](/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png)](/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png)\n\n*原論文Figure 2。[**v3 PDFの2ページ**](https://arxiv.org/pdf/1703.06211v3#page=2)から抜粋。$3\\times3$の変形可能畳み込みです。*\n\nオフセットは、別の畳み込み層が**同じ入力特徴マップ**から計算します。図の上にある緑の経路です。この畳み込みのカーネルサイズとdilationは主畳み込みと同じで、出力されるoffset fieldは空間サイズが入力と同じ、チャネル数は$2N$です。$3\\times3$畳み込みには$N=9$個のサンプリング点があり、各点に$(\\Delta y,\\Delta x)$の2つの数が必要なので、18チャネルになります。\n\n言い換えると、特徴マップ上の各位置がそれぞれ9個のオフセットを1組持ち、そのオフセットはその位置の周辺の内容を見て計算されます。これが、著者らの言うlocal、dense、adaptiveです。\n\ntorchvisionの`deform_conv2d`で、完全な層を1つ組んでみましょう。\n\n```python\nimport torch\nimport torch.nn as nn\nfrom torchvision.ops import deform_conv2d\n\nclass DeformableConv(nn.Module):\n    def __init__(self, cin, cout, k=3):\n        super().__init__()\n        self.weight = nn.Parameter(torch.randn(cout, cin, k, k) * 0.01)\n        # オフセットを予測する畳み込み：主畳み込みと同じ3×3で、2N = 18チャネルを出力し、0で初期化する\n        self.offset = nn.Conv2d(cin, 2 * k * k, k, padding=k // 2)\n        nn.init.zeros_(self.offset.weight)\n        nn.init.zeros_(self.offset.bias)\n\n    def forward(self, x):\n        offset = self.offset(x)                        # [B, 18, H, W]：各出力位置に9組の(Δy, Δx)\n        print(\"オフセットの形状：\", tuple(offset.shape))\n        return deform_conv2d(x, offset, self.weight, padding=1)\n\nm = DeformableConv(256, 256)\ny = m(torch.randn(2, 256, 38, 38))\nprint(\"出力の形状：\", tuple(y.shape))\nprint(f\"主畳み込みのパラメータ{m.weight.numel():,}、オフセット畳み込みのパラメータ{sum(p.numel() for p in m.offset.parameters()):,}\")\n```\n\n```text\nオフセットの形状： (2, 18, 38, 38)\n出力の形状： (2, 256, 38, 38)\n主畳み込みのパラメータ589,824、オフセット畳み込みのパラメータ41,490\n```\n\nオフセット畳み込みで増えるパラメータは、主畳み込みの7%ほどです。その重みは0で初期化されるので、学習の始めはオフセットがすべて0で、層全体は通常の畳み込みと同じです。オフセット畳み込みの学習率はほかの層の$\\beta$倍で、デフォルトは$\\beta=1$です。主畳み込みの重みとオフセットは学習中に一緒に学ばれ、追加のアノテーションは一切要りません。\n\n### 二つの特殊な場合\n\nFigure 1(c)のような等比の拡大は、実は膨張畳み込みそのものです。二つの特殊な場合を直接確かめてみましょう。\n\n```python\nimport torch\nimport torch.nn.functional as F\nfrom torchvision.ops import deform_conv2d\n\ntorch.manual_seed(0)\nx = torch.randn(1, 8, 7, 7)\nw = torch.randn(16, 8, 3, 3)\n\n# 1. オフセットがすべて0：通常の3×3畳み込みと同じ\noffset = torch.zeros(1, 2 * 9, 7, 7)                # 9個のサンプリング点、各点に(Δy, Δx)\ndiff = (deform_conv2d(x, offset, w, padding=1) - F.conv2d(x, w, padding=1)).abs().max()\nprint(\"オフセットが0のとき、通常の畳み込みとの差：\", diff.item())\n\n# 2. 各サンプリング点を1マス外へ押し出す：dilation=2の膨張畳み込みと同じ\ngrid = [(i, j) for i in (-1, 0, 1) for j in (-1, 0, 1)]\noffset = torch.tensor([v for i, j in grid for v in (i, j)], dtype=torch.float32)\noffset = offset.view(1, 18, 1, 1).expand(1, 18, 7, 7)\ndiff = (deform_conv2d(x, offset, w, padding=1) - F.conv2d(x, w, padding=2, dilation=2)).abs().max()\nprint(\"オフセットが格子座標と等しいとき、dilation=2との差：\", diff.item())\n```\n\n```text\nオフセットが0のとき、通常の畳み込みとの差： 0.0\nオフセットが格子座標と等しいとき、dilation=2との差： 0.0\n```\n\n二つ目の例では、格子上の点$(i,j)$にオフセット$(i,j)$を加えると$(2i,2j)$に移り、ちょうどdilationが2の膨張畳み込みになります。膨張畳み込みの拡大率は事前に固定しなければなりませんが、変形可能畳み込みでは各位置でネットワーク自身が決めます。\n\n### 変形可能RoI pooling\n\n同じ考え方は、検出のRoI poolingにも使われます。RoI poolingは候補ボックスを$k\\times k$個のマスに切り分け、各マスで平均をとって、固定サイズの特徴を出力します。変形可能RoI poolingは各マスにオフセットを加え、マスが物体のほうへ動けるようにします。\n\nオフセットの求め方は少し違います。著者らはまず通常のRoI poolingを1回行い、全結合層を1層つないで「正規化された」オフセット$\\Delta\\hat{\\mathbf{p}}_{ij}$を出力し、それに候補ボックスの幅と高さを掛けて実際のオフセットに変換します。\n\n$$\n\\Delta\\mathbf{p}_{ij}=\\gamma\\cdot\\Delta\\hat{\\mathbf{p}}_{ij}\\circ(w,h),\\qquad \\gamma=0.1.\n$$\n\n幅と高さを掛けるのは、オフセットの学習が候補ボックスの大きさに左右されないようにするためです。R-FCNが使うposition-sensitive RoI poolingにも対応する変形可能版があり、そこではオフセットを畳み込み層が画像全体に対して計算します。\n\n### ネットワークに組み込む\n\n著者らは変形可能畳み込みを、ImageNetで事前学習済みの二つのバックボーンに組み込みました。ResNet-101と、特徴の位置ずれの問題を修正したAligned-Inception-ResNetです。当時の一般的なやり方と同じく、最後のステージ（conv5）のストライドを2から1に変え、畳み込みをdilation 2にして、出力特徴マップの解像度を1/32から1/16に上げています。\n\n変形可能畳み込みに置き換えるのはconv5の最後の数層の$3\\times3$畳み込みだけで、デフォルトは最後の3層です。バックボーンの後ろには4種類のタスク用ネットワークを付けます。セマンティックセグメンテーションのDeepLab、1段階だけのclass-aware RPN、そして2段階検出のFaster R-CNNとR-FCNです。後の二つは、RoI poolingも変形可能版に置き換えられます。\n\n## 考察\n\nセマンティックセグメンテーションにはPASCAL VOCとCityscapesを使い、指標はmIoUです。検出にはPASCAL VOCとCOCOを使い、指標はmAPです。\n\n### 受容野は本当に物体に合わせて変わる\n\n[![2層の畳み込みの受容野を示す図で、背景は小さな羊と大きな羊が写ったグレースケール写真。3枚の層が重ねて描かれている。(a)standard convolution：上の層の小さな羊と大きな羊の上に点が1つずつあり、下の2層で対応するサンプリング点はどちらも決まった大きさの正方形。(b)deformable convolution：同じ2つの点について、小さな羊の側のサンプリング点は小さな羊の上に集まり、大きな羊の側のサンプリング点は大きく広がって羊全体を覆っている](/content/papers/assets/e05ab32de27fdd8551794ded9ab71fafae0ea423979ef7250f9e7d31cedf1534.png)](/content/papers/assets/e05ab32de27fdd8551794ded9ab71fafae0ea423979ef7250f9e7d31cedf1534.png)\n\n*原論文Figure 5。[**v3 PDFの4ページ**](https://arxiv.org/pdf/1703.06211v3#page=4)から抜粋。2層の通常の畳み込み(a)と2層の変形可能畳み込み(b)の受容野です。*\n\n最上層の1点から下へたどると、2層の$3\\times3$畳み込みを経て、最下層の一群のサンプリング点に対応します。(a)は通常の畳み込みで、点が小さな羊の上にあっても大きな羊の上にあっても、サンプリング範囲は同じ大きさの正方形です。(b)の変形可能畳み込みでは、小さな羊の上の点は小さな羊だけを見て、大きな羊の上の点は羊全体に広がっています。\n\nこれは模式図ですが、著者らは別に定量化もしています。effective dilationという指標を定義し、1つのカーネル内で隣り合うサンプリング点どうしの平均距離としました。おおまかに受容野の大きさとみなせます。続いて、3層の変形可能畳み込みを持つR-FCNをVOC 2007テストセットで実行し、カーネルの中心がどの種類の物体の上にあるかで分けて集計しました。\n\n| 層 | 小物体 | 中物体 | 大物体 | 背景 |\n| --- | ---: | ---: | ---: | ---: |\n| res5c | 5.3 ± 3.3 | 5.8 ± 3.5 | 8.4 ± 4.5 | 6.2 ± 3.0 |\n| res5b | 2.5 ± 1.3 | 3.1 ± 1.5 | 5.1 ± 2.5 | 3.2 ± 1.2 |\n| res5a | 2.2 ± 1.2 | 2.9 ± 1.3 | 4.2 ± 1.6 | 3.1 ± 1.1 |\n\n*表：原論文Table 2から抜粋。effective dilationの平均と標準偏差です。物体はボックスの面積で小・中・大の3つに分け、境界は$96^2$と$224^2$ピクセルです。*\n\n3つの層のどれにも同じ傾向が見られ、物体が大きいほどサンプリング点は広く散らばります。背景の値は中物体と大物体のあいだにあり、著者らは、背景を見分けるにも比較的大きな受容野が必要だと考えています。\n\n### 何層置き換えるか\n\n| 変形可能畳み込みの層数 | DeepLab（Cityscapes） | class-aware RPN | Faster R-CNN | R-FCN |\n| --- | ---: | ---: | ---: | ---: |\n| 0（基準） | 70.4 | 44.9 | 62.1 | 61.8 |\n| 1 | 73.5 | 54.4 | 63.8 | 63.0 |\n| 2 | 74.4 | 56.3 | 63.3 | 63.8 |\n| 3（デフォルト） | **75.2** | 57.2 | 63.3 | 64.7 |\n| 6 | 75.1 | **57.7** | **64.0** | **65.4** |\n\n*表：原論文Table 1から抜粋。ResNet-101です。DeepLabはCityscapesのmIoU、3つの検出器はVOC 2007テストセットのmAP@0.7です。*\n\n最後の1層を置き換えるだけで、DeepLabは3ポイント、class-aware RPNは10ポイント近く改善します。この二つの手法にはRoI poolingがなく、結果を畳み込み特徴から直接計算するので、それが最も恩恵を受けた理由なのかもしれません。DeepLabは3層で頭打ちになり、検出器は6層でもまだ改善しているので、著者らは3層を各タスクの折衷としています。\n\n### 膨張畳み込みと比べる\n\n膨張畳み込みが特殊な場合なのだとしたら、dilationを直接大きくしても同じ効果が得られるのではないでしょうか？\n\n| 設定 | DeepLab（VOC / Cityscapes） | class-aware RPN | Faster R-CNN | R-FCN |\n| --- | ---: | ---: | ---: | ---: |\n| 膨張畳み込み（2,2,2）、デフォルト | 69.7 / 70.4 | 68.0 / 44.9 | 78.1 / 62.1 | 80.0 / 61.8 |\n| 膨張畳み込み（4,4,4） | 73.1 / 71.9 | 72.8 / 53.1 | 78.6 / 63.1 | 80.5 / 63.0 |\n| 膨張畳み込み（6,6,6） | 73.6 / 72.7 | 73.6 / 55.2 | 78.5 / 62.3 | 80.2 / 63.5 |\n| 膨張畳み込み（8,8,8） | 73.2 / 72.4 | 73.2 / 55.1 | 77.8 / 61.8 | 80.3 / 63.2 |\n| 変形可能畳み込み | **75.3 / 75.2** | **74.5 / 57.2** | 78.6 / 63.3 | 81.4 / 64.7 |\n| 変形可能RoI pooling | – | – | 78.3 / 66.6 | 81.2 / 65.0 |\n| 両方を使用 | – | – | **79.3 / 66.9** | **82.6 / 68.5** |\n\n*表：原論文Table 3から抜粋。ResNet-101です。DeepLabはmIoU、検出器はVOC 2007テストセットのmAP@0.5 / mAP@0.7です。括弧内は最後の3層の$3\\times3$畳み込みのdilationです。*\n\ndilationを大きくすると、どのタスクも良くなります。デフォルトの受容野がもともと小さすぎたということです。ただ、最適なdilationはタスクによって違い、DeepLabは6、Faster R-CNNは4で、すべてに合う値は一つもありません。変形可能畳み込みは、どのタスクでも最良のdilationに劣らず、しかもタスクごとに調整する必要がありません。\n\n変形可能RoI poolingは単独で使うだけで、二つの検出器のmAP@0.7をかなり押し上げます。このより厳しい指標は、ボックスがより正確であることを求めます。二つのモジュールを両方使うと、R-FCNは80.0 / 61.8から82.6 / 68.5に向上します。\n\n### 代償\n\n| 手法 | パラメータ | ネットワークの順伝播（秒） | 全体の実行（秒） |\n| --- | ---: | ---: | ---: |\n| DeepLab（Cityscapes） | 46.0M | 0.610 | 0.650 |\n| 変形可能モジュールを追加 | 46.1M | 0.656 | 0.696 |\n| Faster R-CNN | 58.3M | 0.147 | 0.190 |\n| 変形可能モジュールを追加 | 59.9M | 0.192 | 0.234 |\n| R-FCN | 47.1M | 0.143 | 0.170 |\n| 変形可能モジュールを追加 | 49.5M | 0.169 | 0.193 |\n\n*表：原論文Table 4から3組を抜粋。ResNet-101で、Intel E5-2650 v2 CPUとNVIDIA K40 GPUを使用しています。全体の実行時間には、画像のリサイズやNMSなどの後処理が含まれます。*\n\n増えるパラメータは最大でも2.4Mだけなので、著者らは、改善はモデルが大きくなったことによるものではなく、幾何学変換をモデル化する能力から来ていると考えています。時間については、DeepLabは7%ほど増えるだけですが、Faster R-CNNの順伝播時間は0.147秒から0.192秒になり、3割増えています。\n\nもう一つの代償はデプロイにあります。変形可能畳み込みは標準的な畳み込みではないので、初期にはtorchvisionの`deform_conv2d`をONNXにエクスポートするのにも、[サードパーティのパッケージ](https://pypi.org/project/deform-conv2d-onnx-exporter/)で通常の演算に分解する必要があり、速度にも影響が出ました。\n\n### COCO\n\n最後に、COCO test-devで全体的に比較します。指標はmAP@[0.5:0.95]です。\n\n| 手法 | バックボーン | 通常 | 変形可能 |\n| --- | --- | ---: | ---: |\n| class-aware RPN | ResNet-101 | 23.2 | 25.8 |\n| Faster R-CNN | ResNet-101 | 29.4 | 33.1 |\n| R-FCN | ResNet-101 | 30.8 | 34.5 |\n| Faster R-CNN | Aligned-Inception-ResNet | 30.8 | 34.1 |\n| R-FCN | Aligned-Inception-ResNet | 32.9 | 36.1 |\n| R-FCN、マルチスケールテストとボックス平均 | Aligned-Inception-ResNet | 35.5 | **37.5** |\n\n*表：原論文Table 5から抜粋。*\n\nResNet-101では、3つの手法がそれぞれ相対的に11%、13%、12%向上しています。より強いバックボーンに替えても、マルチスケールテストのような工夫を加えても、改善は残ります。物体の大きさ別に分けて絶対値で見ると、最も伸びたのは中・大物体で、たとえばFaster R-CNNの大物体のmAPは47.1から51.2に、小物体は9.0から11.6に上がっています。\n\n## 結論\n\n変形可能畳み込みは、畳み込みのサンプリング点一つひとつに、学習で得たオフセットを加えます。変更はごく小さく、パラメータは数パーセント増えるだけですが、受容野が物体の大きさや形に合わせて変わるようになり、セグメンテーションでも検出でも安定して改善します。とりわけ、ボックスの正確さを求めるmAP@0.7で効果があります。\n\n自分のネットワークで試したいなら、torchvisionの`deform_conv2d`に、0で初期化したオフセット畳み込みを1つ加えるだけです。デプロイのほうはそう気楽にはいきません。標準的な畳み込みではないので、推論フレームワークが対応しているとは限らないのです。サンプリング点が八艘飛びを身につけた以上、デプロイ担当のエンジニアも一緒に稽古しなければならないかもしれません。\n\nこの考え方は、その後も大きく広がっていきました。v2はサンプリング点に変調の重みを加え、InternImageはv3で大規模モデルのバックボーンを作り、[Deformable DETR](/blog/papers/object-detection/deformable-detr)はそれを注意機構に持ち込みました。この先のノートでも、また何度か出会うことになるでしょう。\n","imageSizes":{"/content/papers/assets/45479d40b2beb8096d042f56871e08317e36ffc2be1857a325732d436b36da0f.png":{"width":988,"height":316},"/content/papers/assets/942dcd98b1119ce95e8a9a24b84ed42b780d062caafa004c66f75640c4e2584a.png":{"width":987,"height":633},"/content/papers/assets/e05ab32de27fdd8551794ded9ab71fafae0ea423979ef7250f9e7d31cedf1534.png":{"width":1000,"height":571}}}
