{"notes":[{"id":"classic-cnns/stn","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"STN","subtitle":"変幻自在","author":"Z. Yuan","paperDate":"2015-06-05","publishedOn":"2025-11-27","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":null,"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.6ca7af44bd65.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":"text-recognition/rare","category":"text-recognition","legacyPath":"text-recognition/1603-rare","legacySlug":"1603-rare","legacyPaths":[],"title":"RARE","subtitle":"自動補正","author":"Z. Yuan","paperDate":"2016","publishedOn":"2024-10-08","paperTitle":"Robust Scene Text Recognition With Automatic Rectification","paperUrl":"https://openaccess.thecvf.com/content_cvpr_2016/html/Shi_Robust_Scene_Text_CVPR_2016_paper.html","bibliography":{"title":"Robust Scene Text Recognition With Automatic Rectification","authors":["Baoguang Shi","Xinggang Wang","Pengyuan Lyu","Cong Yao","Xiang Bai"],"url":"https://openaccess.thecvf.com/content_cvpr_2016/html/Shi_Robust_Scene_Text_CVPR_2016_paper.html","pdfUrl":"https://openaccess.thecvf.com/content_cvpr_2016/papers/Shi_Robust_Scene_Text_CVPR_2016_paper.pdf","codeUrl":null,"preprint":null,"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://openaccess.thecvf.com/content_cvpr_2016/html/Shi_Robust_Scene_Text_CVPR_2016_paper.html"},"citation":"@inproceedings{textrecognitionrare2016,\n  title = {{Robust Scene Text Recognition With Automatic Rectification}},\n  author = {Baoguang Shi and Xinggang Wang and Pengyuan Lyu and Cong Yao and Xiang Bai},\n  year = {2016},\n  booktitle = {CVPR},\n  url = {https://openaccess.thecvf.com/content_cvpr_2016/html/Shi_Robust_Scene_Text_CVPR_2016_paper.html}\n}\n","citationPath":"/content/papers/citations/text-recognition/rare.e993d8c6fce6.bib"},"thumbnail":{"src":"/content/papers/assets/ede56fcdf7e421a6d8418d322e7a516326d84123169b83be8f9badb72fbb994e.jpg","width":1224,"height":496},"locale":"ja","path":"/content/papers/ja/text-recognition/rare.3138a5b56f3e.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":3},{"id":"モデルの訓練","text":"モデルの訓練","depth":3},{"id":"評価指標","text":"評価指標","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"他の方法との比較","text":"他の方法との比較","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{"位相ネットワーク":"位置推定ネットワーク","メッシュジェネレーター":"グリッド生成器"},"guide":null,"relatedReading":[{"id":"text-recognition/sar","relation":"comparison","topic":"曲がった文字・不規則な文字の認識"},{"id":"text-recognition/dan","relation":"comparison","topic":"曲がった文字・不規則な文字の認識"}]}],"text":"傾いた手書き数字を畳み込みネットワークに見せても、たいていはちゃんと認識できます。\n\nこの許容範囲はどこから来るのでしょうか。一部は最大プーリングです。$2\\times2$の狭い範囲で最大値をとるので、特徴が1〜2マスずれても出力は変わりません。層を何層も重ねると、ネットワークは位置の変化をある程度許容できるようになります。\n\nただ、この許容は少しずつ積み重なってできたもので、範囲も固定されています。Google DeepMindのMax Jaderberg、Karen Simonyan、Andrew Zisserman、Koray Kavukcuogluは2015年6月にこの論文を公開し、のちにNIPS 2015で発表しました。彼らは、この画像をどう動かし、どう拡大縮小し、どう回転させれば最も認識しやすいかを、ネットワーク自身に決めさせようと考えました。\n\n## 問題の定義\n\n著者らはまず、最大プーリングの限界を指摘します。プーリングの範囲は$2\\times2$画素のように通常は小さいので、位置に対する不変性は、多くの層の畳み込みとプーリングで少しずつ積み上げるしかありません。中間層の特徴マップは、入力の大きな変換に対しては、実は不変ではありません。\n\n問題の根は、プーリングの仕組みが事前に決め打ちされていることです。どこで、どれだけの範囲をとるかは、入力がどんな姿かとは無関係です。\n\n著者らが求めたのは、別の種類のモジュールです。\n\n- **入力を見て変換を決める**：画像ごとに個別の変換が得られます。すべての画像に同じ処理をかけるのではありません。\n- **特徴マップ全体に作用する**：切り出し、拡大縮小、回転、さらには非剛体の変形もでき、局所的な範囲に縛られません。\n- **追加のアノテーションが要らない**：正しい回転角度やボックスを誰も教えず、最終的なタスクの損失だけから学びます。\n- **逆伝播でそのまま学習できる**：最適化の手順を変える必要がなく、既存の畳み込みネットワークに差し込めます。\n\nまず、結果がどんなものかを見てみましょう。\n\n[![MNISTの例が3行、各行4列。(a)は平行移動、拡大縮小、回転、またはノイズの付加を受けた手書き数字。(b)はモジュールが予測したサンプリング枠で、カラーの四辺形として元の画像に重ねて描かれている。(c)はサンプリング枠に従って変換され、まっすぐに直されて拡大された数字。(d)は後段の分類ネットワークの予測で、それぞれ7、5、6](/content/papers/assets/7b29191fd34e282fbd2d0fa901014f5770192cf1641d814b39b43a903817fb7f.png)](/content/papers/assets/7b29191fd34e282fbd2d0fa901014f5770192cf1641d814b39b43a903817fb7f.png)\n\n*原論文Figure 1。[**v3 PDFの2ページ**](https://arxiv.org/pdf/1506.02025v3#page=2)から抜粋。(a)変形したMNISTの入力、(b)モジュールが予測した変換、(c)変換後の結果、(d)後段の分類ネットワークの予測。ネットワーク全体はクラスラベルだけで学習しています。*\n\n特にわかりやすいのが3行目です。数字の6は小さく、まわりにノイズの点もあります。モジュールは自分で6の位置を囲み、切り出して拡大し、後段の分類ネットワークに渡します。最初から最後まで、6がどこにあるかを誰も教えていません。\n\n## 問題の解決\n\n### 三つの部品\n\n[![空間変換モジュールのアーキテクチャ。入力特徴マップUは二手に分かれる。一方はローカリゼーションネットワークに入って変換パラメータθを出力し、グリッド生成器がサンプリンググリッドT_θ(G)を計算する。もう一方はそのままサンプラーに送られ、サンプラーがグリッドに従ってUからサンプリングし、特徴マップVを出力する](/content/papers/assets/96a7134077ab04428f529111ff95e65d6863c038ad037e4d679cb1d2de57c0bb.png)](/content/papers/assets/96a7134077ab04428f529111ff95e65d6863c038ad037e4d679cb1d2de57c0bb.png)\n\n*原論文Figure 2。[**v3 PDFの3ページ**](https://arxiv.org/pdf/1506.02025v3#page=3)から抜粋。ローカリゼーションネットワーク、グリッド生成器、サンプラーを合わせたものが、一つの空間変換器です。*\n\nモジュール全体は、三つの部品が順につながってできています。\n\n1. **ローカリゼーションネットワーク**（localisation net）：特徴マップ$U$を読み込み、変換パラメータ$\\theta$を出力します。全結合ネットワークでも畳み込みネットワークでもよく、最後の層が回帰層で$\\theta$を出力しさえすれば構いません。\n2. **グリッド生成器**（grid generator）：$\\theta$を使ってサンプリング点の集合$\\mathcal{T}_\\theta(G)$を計算します。つまり「出力の各画素が、入力のどこから値を取ってくるか」です。\n3. **サンプラー**（sampler）：サンプリング点に従って$U$から値を取り、出力$V$を得ます。\n\n多チャネルの入力では、すべてのチャネルに同じ変換を使います。そうすることで、チャネル間の空間的な対応が崩れません。\n\nローカリゼーションネットワークに特別なところはなく、要点は後の2ステップにあります。小さな例で一通りたどってみましょう。\n\n### グリッド生成器：出力から逆にたどる\n\nまず、変換は2次元のアフィン変換だとします。必要なパラメータは6個だけです。\n\n$$\n\\begin{pmatrix} x_i^s \\\\ y_i^s \\end{pmatrix}\n= \\mathcal{T}_\\theta(G_i)\n= \\begin{bmatrix} \\theta_{11} & \\theta_{12} & \\theta_{13} \\\\ \\theta_{21} & \\theta_{22} & \\theta_{23} \\end{bmatrix}\n\\begin{pmatrix} x_i^t \\\\ y_i^t \\\\ 1 \\end{pmatrix}\n$$\n\n$(x_i^t, y_i^t)$は出力グリッド上の$i$番目の画素の座標で、上付きの$t$はtargetです。$(x_i^s, y_i^s)$は、その画素が値を取りに行く入力上の位置で、上付きの$s$はsourceです。\n\n向きに注意してください。式は**出力**の座標から**入力**の座標を計算しています。こうすれば出力のどの画素にも必ず取得元があり、穴があきません。コンピュータグラフィックスのテクスチャマッピングと同じやり方です。\n\n座標はどれも$[-1, 1]$に正規化されています。出力も入力も左上が$(-1, -1)$、右下が$(1, 1)$なので、同じ$\\theta$を特徴マップの大きさに関係なく使えます。\n\n出力が$3\\times3$で、入力の左上を2倍に拡大して見たいとします。$\\theta_{11}=\\theta_{22}=0.5$、$\\theta_{13}=\\theta_{23}=-0.5$とすればよいでしょう。\n\n```python\nimport torch\nimport torch.nn.functional as F\n\n# 出力は3×3の規則的なグリッド。座標は[-1, 1]に正規化\ntheta = torch.tensor([[[0.5, 0.0, -0.5],\n                       [0.0, 0.5, -0.5]]])          # 2倍に拡大して左上を見る\ngrid = F.affine_grid(theta, size=(1, 1, 3, 3), align_corners=True)\nprint(\"x_s：\\n\", grid[0, ..., 0])\nprint(\"y_s：\\n\", grid[0, ..., 1])\n```\n\n```text\nx_s：\n tensor([[-1.0000, -0.5000,  0.0000],\n        [-1.0000, -0.5000,  0.0000],\n        [-1.0000, -0.5000,  0.0000]])\ny_s：\n tensor([[-1.0000, -1.0000, -1.0000],\n        [-0.5000, -0.5000, -0.5000],\n        [ 0.0000,  0.0000,  0.0000]])\n```\n\n出力グリッドの$x^t$は$-1, 0, 1$で、0.5を掛けて0.5を引くと$x^s = -1, -0.5, 0$になります。出力の3画素は、入力の左半分からしか値を取りません。$y$方向も同じです。出力の$3\\times3$は、入力の左上4分の1に対応します。\n\n[![2組の模式図。(a)入力U上の緑のサンプリング点が整った規則的なグリッドに並び、出力Vと一対一に対応していて、出力は入力と同じ。(b)サンプリング点がアフィン変換で傾いた小さな平行四辺形になり、数字の一部だけを覆う。出力Vは、まっすぐに直されて拡大された数字](/content/papers/assets/89651828c63ac51ce8bd1efa4deffe57d50cca84735217ef8b2c9087b5b760c8.png)](/content/papers/assets/89651828c63ac51ce8bd1efa4deffe57d50cca84735217ef8b2c9087b5b760c8.png)\n\n*原論文Figure 3。[**v3 PDFの4ページ**](https://arxiv.org/pdf/1506.02025v3#page=4)から抜粋。(a)恒等変換：サンプリンググリッドは規則的なグリッドそのもの。(b)アフィン変換後のサンプリンググリッド。*\n\nこの図は同じことを絵にしたものです。(a)ではサンプリング点が規則的なグリッドに並び、出力は入力と同じです。(b)ではサンプリング点がアフィン変換で傾いた平行四辺形になって入力の一部だけを覆い、出力は切り出し、回転、拡大を受けた結果になります。\n\nアフィン変換の6個のパラメータで、切り出し、平行移動、回転、拡大縮小、せん断を表せます。左側の$2\\times2$部分行列の行列式の絶対値が1より小さいと、サンプリンググリッドは面積の小さい平行四辺形に縮み、一部を切り出すことになります。\n\n$\\mathcal{T}_\\theta$は別の形に替えることもできます。著者らはいくつか例を挙げています。切り出し、平行移動、等方的な拡大縮小だけを許すアテンション形式（パラメータは$s, t_x, t_y$の3個）、8個のパラメータを持つ平面射影変換、そして非剛体の変形ができる薄板スプライン（thin plate spline、TPS）です。唯一の条件は、$\\mathcal{T}_\\theta$がパラメータについて微分可能であることです。それによって、勾配がサンプリング点から$\\theta$へ戻れます。\n\n### サンプラー：格子点のあいだで値を取る\n\nサンプリング点がちょうど整数の格子点に乗ることはめったにないので、サンプラーには補間カーネルが必要です。著者らは一般的な形で書いたうえで、主に双線形補間を使います。\n\n$$\nV_i^c = \\sum_{n}^{H}\\sum_{m}^{W} U_{nm}^c\\,\\max\\!\\big(0,\\ 1-|x_i^s-m|\\big)\\,\\max\\!\\big(0,\\ 1-|y_i^s-n|\\big)\n$$\n\n各出力値は、サンプリング点に最も近い4画素の重み付き平均で、重みは距離で決まります。\n\n鍵は、この式が$U$についても、サンプリング座標$x_i^s$、$y_i^s$についても（劣）勾配を求められることです。勾配がサンプリング座標まで届けば、さらに$\\theta$へ戻り、最後にローカリゼーションネットワークへ届きます。\n\nちょうど格子点に乗らない$\\theta$に替えて、$5\\times5$の入力で試してみましょう。画素値は左上の0から右下の24までです。\n\n```python\nimport torch\nimport torch.nn.functional as F\n\nU = torch.arange(25, dtype=torch.float32).reshape(1, 1, 5, 5)   # 5×5の入力、値は0〜24\ntheta = torch.tensor([[[0.4, 0.0, -0.3],\n                       [0.0, 0.4, -0.3]]], requires_grad=True)\ngrid = F.affine_grid(theta, size=(1, 1, 3, 3), align_corners=True)\nprint(\"サンプリングのx座標（画素単位に換算）：\", [round(v, 2) for v in ((grid[0, 0, :, 0] + 1) * 2).tolist()])\n\nV = F.grid_sample(U, grid, mode=\"bilinear\", align_corners=True)\nprint(V[0, 0])\n\nV.sum().backward()               # 適当な損失を決めて、勾配がθまで戻るかを見る\nprint(theta.grad)\n```\n\n```text\nサンプリングのx座標（画素単位に換算）： [0.6, 1.4, 2.2]\ntensor([[ 3.6000,  4.4000,  5.2000],\n        [ 7.6000,  8.4000,  9.2000],\n        [11.6000, 12.4000, 13.2000]], grad_fn=<SelectBackward0>)\ntensor([[[ 0.,  0., 18.],\n         [ 0.,  0., 90.]]])\n```\n\nこの入力の値は「行 × 5 + 列」です。最初のサンプリング点は行0.6、列0.6の位置にあり、双線形補間で$0.6\\times5+0.6=3.6$が得られます。この点はどの整数格子点にも乗っておらず、値は周囲の4画素を距離に応じて混ぜ合わせたものです。\n\n勾配も$\\theta$まで戻ってきました。平行移動のパラメータ$\\theta_{13}$の勾配は18です。サンプリンググリッドを正規化座標で1単位右へ動かすと2画素動いたことになり、各サンプリング値が2ずつ増えるので、9個のサンプリング点を合わせて18です。$\\theta_{23}$は下へ動かすパラメータで、各点が10ずつ増え、合わせて90です。ほかの4個のパラメータの勾配はすべて0です。この入力は左右にも上下にも一様に増えていくので、グリッドを中心を基準に拡大縮小したり傾けたりすると、片側のサンプリング値が小さくなり、反対側が大きくなって、ちょうど打ち消し合います。\n\nこれが、モジュール全体をエンドツーエンドで学習できる理由です。出力$V$に対する損失の勾配は、サンプラーを通ってサンプリング座標に届き、グリッド生成器を通って$\\theta$に届き、最後にローカリゼーションネットワークの重みに入ります。正しい変換を誰かが与える必要はありません。\n\n\n> [!NOTE]\n> \n> 双線形補間は、点がちょうど格子点に乗っているときは微分できないので、劣勾配を使うしかありません。著者らは、実装ではすべての入力位置について実際に和をとる必要はなく、各サンプリング点の周囲4画素だけを見ればよいので、GPUで高速に計算できるとも述べています。\n\n\n### ネットワークに組み込む\n\nこのモジュールは、畳み込みネットワークのどの位置にも、いくつでも差し込めます。\n\n- **異なる深さに直列で置く**：深い層のモジュールはより抽象的な特徴を見ていて、ローカリゼーションネットワークも、どう変換すべきかを判断する情報をより多く持てます。\n- **並列に置く**：特徴マップの中に別々に扱いたい物体や部位がいくつかあるときは、モジュールを並列に置き、それぞれ1か所に注目させられます。著者らは限界にも触れています。純粋な順伝播型ネットワークでは、並列に置いたモジュールの数が、ネットワークが別々に扱える物体の数の上限になります。\n\n出力の大きさ$H'$、$W'$は入力と違ってもよいので、モジュールでついでにダウンサンプリングもできます。ただし、双線形のようにサポートの狭い補間カーネルでは、ダウンサンプリング時にエイリアシングが起きることがあります。\n\n## 考察\n\n### 変形したMNIST\n\n著者らはMNISTからいくつかの変形版を作りました。回転（R）、回転・平行移動・拡大縮小（RTS）、射影変換（P）、弾性変形（E）です。比較するのは、通常の全結合ネットワーク（FCN）、畳み込みネットワーク（CNN）、そして入力側に空間変換モジュールを加えた版（ST-FCN、ST-CNN）で、変換にはアフィン（Aff）、射影（Proj）、制御点16個のTPSを使います。どのモデルもパラメータ数はほぼ同じで、分類部分はいずれも重み層3層、CNNには最大プーリングが2層あります。\n\n| モデル | R | RTS | P | E |\n| --- | ---: | ---: | ---: | ---: |\n| FCN | 2.1 | 5.2 | 3.1 | 3.2 |\n| CNN | 1.2 | 0.8 | 1.5 | 1.4 |\n| ST-FCN、Aff | 1.2 | 0.8 | 1.5 | 2.7 |\n| ST-FCN、TPS | 1.1 | 0.8 | 1.4 | 2.4 |\n| ST-CNN、Aff | 0.7 | 0.5 | 0.8 | 1.2 |\n| ST-CNN、Proj | 0.8 | 0.6 | 0.8 | 1.3 |\n| ST-CNN、TPS | 0.7 | 0.5 | 0.8 | 1.1 |\n\n*表：原論文Table 1から誤り率（%）を抜粋。ST-FCNの射影変換版は省略しています。*\n\nどの変形でも、モジュールを加えたネットワークは対応するベースラインより良い成績です。最も興味深いのはRTSの列です。ST-FCNには畳み込みもプーリングも一つもないのに、誤り率は0.8%で、プーリングを2層持つCNNと同じです。著者らは、これは空間変換器が空間的な不変性を得るもう一つの方法であることを示していると考えています。ST-CNNはST-FCNよりさらに良く、プーリングがより多くの不変性を与え、畳み込みが局所構造をうまく扱えるためです。\n\n$60\\times60$で、数字が平行移動され、背景にノイズの点がある版では、差はさらに大きくなります。FCN 13.2%、CNN 3.5%、ST-FCN 2.0%、ST-CNN 1.7%です。\n\n三つの変換のうち、TPSが最も強力です。弾性変形した数字を標準に近い形に作り直すことができ、単純な回転のデータでも過学習しません。著者らはさらに、どのモデルも数字を直立した「標準」の姿勢、つまり学習データの平均的な姿勢に変換することを観察しています。\n\n### ストリートビューの番地\n\nSVHNは約20万枚の実際の番地プレートの写真で、各写真には1〜5個の数字があり、大きさや並び方が大きく変わります。タスクは数字列全体を認識することです。著者らのベースラインは隠れ層11層のモデルで、最後に独立した5つのsoftmaxが続き、それぞれ1桁分の数字を予測します。\n\nこのベースラインに、2種類の拡張を加えました。\n\n- **ST-CNN Single**：入力の直後にモジュールを1つ加えます。ローカリゼーションネットワークは4層の畳み込みネットワークです。\n- **ST-CNN Multi**：最初の4つの畳み込み層の前にそれぞれモジュールを加えます。ローカリゼーションネットワークはどれも、各層32ユニットの2層全結合ネットワークです。最初のモジュール以外が変換するのは特徴マップです。\n\nどのモジュールもアフィン変換と双線形サンプリングを使い、ローカリゼーションネットワークの回帰層は、すべて恒等変換を出力するように初期化します。\n\n| モデル | 64px | 128px |\n| --- | ---: | ---: |\n| Maxout CNN | 4.0 | — |\n| CNN（著者らのベースライン） | 4.0 | 5.6 |\n| DRAM* | 3.9 | 4.5 |\n| ST-CNN Single | 3.7 | 3.9 |\n| ST-CNN Multi | 3.6 | 3.9 |\n\n*表：原論文Table 2から系列誤り率（%）を抜粋。64pxは数字列を中心に切り出した$64\\times64$の画像、128pxはゆとりをもって切り出した、背景の多い$128\\times128$の画像です。DRAMはモデル平均とモンテカルロ平均を使っており、ほかはすべて単一モデル、1回の順伝播の結果です。*\n\n64pxでは、ST-CNN Multiが3.6%で当時の最高記録を出しました。背景の多い128pxでは、ベースラインのCNNは5.6%に悪化しますが、ST-CNNは3.9%を保っています。モジュールが数字のある領域を切り出して拡大するので、ネットワークの解像度と容量が数字に使われるのです。代償は大きくなく、ST-CNN Multiの順伝播と逆伝播を合わせた時間は、ベースラインのCNNより6%遅いだけです。\n\n### 鳥の細粒度分類\n\nCUB-200-2011には200種の鳥があり、学習画像は約6,000枚、テスト画像は約5,800枚です。鳥の大きさや向きはまちまちで、画像も鳥にぴったり合わせて切り出されてはいないので、種類を見分けるには細部のテクスチャや形を見る必要があります。\n\n著者らのベースラインはすでに強力です。ImageNetで事前学習し、batch normalizationを加えたInceptionネットワークを、CUBでファインチューニングすると82.3%に達し、それまでの最高の81.0%を上回ります。そこへ2個または4個のモジュールを並列に置き、アテンション形式の変換を入力画像に作用させます。各モジュールが切り出した領域は、それぞれのInceptionサブネットワークが記述し、最後に連結して分類します。ネットワーク全体はクラスラベルだけで学習します。\n\n| モデル | 正解率 |\n| --- | ---: |\n| CNN（ベースライン）、224px | 82.3% |\n| 2×ST-CNN、224px | 83.1% |\n| 2×ST-CNN、448px | 83.9% |\n| 4×ST-CNN、448px | 84.1% |\n\n*表：原論文Table 3から抜粋。*\n\nモジュール4個の版は84.1%で、ベースラインより1.8ポイント高くなりました。著者らは、ImageNetの学習セットとCUBのテストセットに22枚の重複（計5,794枚中）があることにも気づき、それらの画像を除くと84.0%になると報告しています。\n\nさらに面白いのは、モジュールが学んだ役割分担です。モジュール2個の版では、一つが鳥の頭の検出器になり、もう一つは鳥の胴体を見つめていました。従来の手法では、キーポイントのアノテーションを使って部位ごとの検出器を別に学習させる必要がありました。ここでは部位のアノテーションは一切なく、モジュールがデータから自力で部位を見つけ出しています。\n\n入力に448pxを使っても、計算量は増えません。モジュールが変換した出力は224pxにダウンサンプリングされてから、後段のネットワークに渡されるからです。\n\n## 結論\n\n空間変換器は、「この画像をどう見るか」までネットワークに学ばせます。ローカリゼーションネットワークが変換を予測し、グリッド生成器がサンプリング位置を計算し、微分可能な双線形サンプリングによって勾配が最後まで戻っていきます。モジュール全体に追加のアノテーションは要らず、損失関数を変える必要もありません。\n\n実験は変形したMNIST、実際の番地の写真、鳥の細粒度分類にわたり、どれも同じ条件のベースラインより良い成績でした。モジュールは何のヒントもないまま、数字をまっすぐに直し、番地の数字を切り出し、鳥の頭と胴体を分けて見ることを学びました。著者らはその限界も指摘しています。並列に置いたモジュールの数が別々に扱える物体の数を制限し、ダウンサンプリング時にはエイリアシングが起きることがあります。\n\n空間変換器は既存のネットワークにそのまま差し込め、損失関数を変える必要も、追加のアノテーションもありません。PyTorchには`affine_grid`と`grid_sample`が組み込まれていて、前の例もこの二つの関数で書いています。自分でつないでみるのも難しくありません。\n\n街の風景に写った看板の文字のように、データに傾きや透視による歪みが多いなら、まずネットワークの前に一つ置いて試してみるとよいでしょう。[RARE](/blog/papers/text-recognition/rare)は、まさにこの方法で文字認識を行っています。\n","imageSizes":{"/content/papers/assets/7b29191fd34e282fbd2d0fa901014f5770192cf1641d814b39b43a903817fb7f.png":{"width":480,"height":364},"/content/papers/assets/96a7134077ab04428f529111ff95e65d6863c038ad037e4d679cb1d2de57c0bb.png":{"width":832,"height":330},"/content/papers/assets/89651828c63ac51ce8bd1efa4deffe57d50cca84735217ef8b2c9087b5b760c8.png":{"width":820,"height":364}}}
