{"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":"zh-hans","path":"/content/papers/zh-hans/classic-cnns/stn.a1cea8e55bb3.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":"zh-hans","path":"/content/papers/zh-hans/text-recognition/rare.f225f5649364.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$ 的小范围里取最大值，特征稍微移动一两格，输出不会变。叠了很多层之后，网络对位置的变化就有了一定的宽容。\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 示例，每行四列。(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第三行尤其清楚：数字 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定位网络没什么特别的，重点在后面两步。我们用一个小例子走一遍。\n\n### 网格生成器：从输出往回找\n\n先假设变换是二维的仿射变换，只需要 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$，我们想放大两倍、看输入的左上角，可以设 $\\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$，对应到输入左上角的四分之一。\n\n[![两组示意图。(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$ 也可以换成别的形式。作者举了几个例子：只允许裁剪、平移与等比缩放的注意力形式（3 个参数 $s, t_x, t_y$）；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每个输出值，是离采样点最近的四个像素的加权平均，权重由距离决定。\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$；它不在任何一个整数格点上，值是周围四个像素按距离混合出来的。\n\n梯度也传回了 $\\theta$。平移参数 $\\theta_{13}$ 的梯度是 18：采样网格往右移一个归一化单位，相当于移动两个像素，每个采样值增加 2，9 个采样点加起来就是 18。$\\theta_{23}$ 往下移，每格增加 10，加起来是 90。其他四个参数的梯度都是 0：这张输入在左右、上下方向都是均匀递增的，网格以中心为基准缩放或倾斜时，一侧的采样值变小、另一侧变大，正好抵消。\n\n这就是整个模块能端到端训练的原因：损失对输出 $V$ 的梯度，经过采样器到达采样坐标，再经过网格生成器到达 $\\theta$，最后进入定位网络的权重。不需要任何人提供正确的变换。\n\n\n> [!NOTE]\n> \n> 双线性插值在恰好落在格点上时不可微，只能用次梯度。作者也提到，实现上不需要真的对所有输入位置求和，只要看每个采样点周围的四个像素，所以在 GPU 上可以算得很快。\n\n\n### 放进网络里\n\n这个模块可以插在卷积网络的任何位置，插多少个都行：\n\n- **在不同深度串联**：深层的模块看到的是更抽象的特征，定位网络也有更多信息来判断该怎么变换。\n- **并行**：特征图中有好几个物体或部位要分别处理时，可以并行放几个模块，各自聚焦一处。作者也提到了局限：在纯前馈网络里，并行的模块数量就是网络能分别处理的物体数量上限。\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。所有模型的参数量差不多，分类部分都是三个权重层，CNN 有两层最大池化。\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%，和有两层池化的 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，各自预测一个位置上的数字。\n\n在这个基线上，他们做了两种扩展：\n\n- **ST-CNN Single**：在输入之后加一个模块，定位网络是四层的卷积网络。\n- **ST-CNN Multi**：在前四层卷积前各加一个模块，定位网络都是两层、每层 32 个单元的全连接网络；除了第一个，其余模块变换的都是特征图。\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 用了模型平均与蒙特卡洛平均，其他都是单个模型、单次前向。*\n\n在 64px 上，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 千张训练图像、5.8 千张测试图像；鸟的大小和朝向不一，图像也没有紧紧裁在鸟身上，要分辨种类，得看细部的纹理和形状。\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\n4 个模块的版本达到 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}}}
