Non-local Neural Networks

paper题目:Non-local Neural Networks

paper是FAIR发表在CVPR 2018的工作

paper链接:地址

Abstract

卷积和循环操作都是一次处理一个局部邻域的构建块。本文将non-local操作呈现为用于捕获远程依赖关系的通用构建块。受计算机视觉中经典的非局部均值方法 [4] 的启发,本文的非局部操作将某个位置的响应计算为所有位置特征的加权和。这个构建块可以插入到许多计算机视觉架构中。在视频分类任务上,即使没有任何花里胡哨,非局部模型也可以在 Kinetics 和 Charades 数据集上竞争或超越当前的竞赛获胜者。在静态图像识别中,非局部模型改进了 COCO 任务套件的目标检测/分割和姿态估计。代码:链接。

1. Introduction

捕获长期依赖关系在深度神经网络中至关重要。对于顺序数据(例如,在语音、语言),循环操作是远程依赖建模的主要解决方案。对于图像数据,长距离依赖关系由卷积操作的深度堆栈形成的大感受野建模。

卷积和循环操作都在空间或时间上处理局部邻域;因此,只有在重复应用这些操作,通过数据逐步传播信号时,才能捕获远程依赖关系。重复局部操作有几个限制。首先,它在计算上效率低下。其次,它会导致优化困难。最后,这些挑战使得多跳依赖建模变得困难,例如,当需要在远距离位置之间来回传递消息时。

本文将非局部操作作为一种高效、简单和通用的组件,用于使用深度神经网络捕获远程依赖关系。提出的非局部操作是计算机视觉中经典非局部均值操作[4]的推广。直观地说,非局部操作将某个位置的响应计算为输入特征图中所有位置的特征的加权和(图 1)。这组位置可以是空间、时间或时空,这意味着我们的操作适用于图像、序列和视频问题。

图 1. 网络中的一个时空非局部操作,针对 Kinetics 中的视频分类进行了训练。位置xi\mathbf{x}_{i}xi​的响应是通过所有位置xj\mathbf{x}_{j}xj​的特征的加权平均值计算的(此处仅显示最高加权的特征)。在这个由本文的模型计算的示例中,请注意它如何将第一帧中的球与最后两帧中的球联系起来。图 3 中有更多示例。

使用非局部操作有几个优点: (a) 与循环和卷积操作的渐进行为相比,非局部操作通过计算任意两个位置之间的交互来直接捕获远程依赖关系,而不管它们的位置距离如何; (b) 正如在实验中所展示的,非局部操作是有效的,即使只有几层(例如 5 层)也能达到最佳效果; © 最后,非局部操作保持可变的输入大小,并且可以很容易地与其他操作(例如,卷积)相结合。

本文展示了非局部操作在视频分类应用中的有效性。在视频中,空间和时间的遥远像素之间会发生远程交互。作为基本单元的单个非局部块可以以前馈方式直接捕获这些时空依赖性。有了一些非局部块,非局部神经网络的架构在视频分类方面比 2D 和 3D 卷积网络 [48](包括膨胀变体 [7])更准确。此外,非局部神经网络在计算上比它们的 3D 卷积对应物更经济。在Kinetics和Charades数据集上提出了全面的消融研究。仅使用 RGB 并且没有任何花里胡哨(例如,光流、多尺度测试),本文方法在两个数据集上取得了与最新竞赛获胜者相当或更好的结果。

为了证明非局部操作的普遍性,本文进一步展示了 COCO 数据集上的目标检测/分割和姿态估计实验。在强大的 Mask R-CNN 基线 [19] 之上,非局部块可以以很小的额外计算成本提高所有三个任务的准确性。连同视频上的证据,这些图像实验表明非局部操作通常是有用的,并且可以成为设计深度神经网络的基本构建块。

2. Related Work

非局部图像处理。非局部均值 [4] 是一种经典的滤波算法,它计算图像中所有像素的加权均值。它允许远距离像素在基于切片外观相似性的位置对过滤响应做出贡献。这种非局部过滤思想后来发展为 BM3D(块匹配 3D)[10],它对一组相似但非局部的切片执行过滤。即使与深度神经网络相比,BM3D 也是可靠的图像去噪基线。块匹配与神经网络一起用于图像去噪。非局部匹配也是成功的纹理合成、超分辨率和修复算法的本质。

图形模型。远程依赖可以通过图形模型来建模,例如条件随机场(CRF)。在深度神经网络的背景下,可以利用 CRF 对网络的语义分割预测进行后处理。 CRF 的迭代平均场推断可以转化为循环网络并进行训练。相比之下,本文的方法是用于计算非局部滤波的更简单的前馈块。与这些为分割而开发的方法不同,本文的通用组件用于分类和检测。这些方法和本文的方法也与一个更抽象的模型有关,称为图神经网络 [41]。

序列的前馈建模。最近出现了一种趋势,即使用前馈(即非循环)网络对语音和语言中的序列进行建模。在这些方法中,长期依赖被非常深的一维卷积贡献的大感受野捕获。这些前馈模型适用于并行化实现,并且比广泛使用的循环模型更有效。

自注意力。本文的工作与最近用于机器翻译的 self-attention方法有关。自注意力模块通过关注所有位置并在嵌入空间中获取它们的加权平均值来计算序列(例如,句子)中某个位置的响应。self-attention 可以被视为非局部均值 [4] 的一种形式,从这个意义上说,本文的工作将机器翻译的 self-attention 连接到更通用的非局部过滤类别适用于计算机视觉中的图像和视频问题的操作。

交互网络。交互网络 (IN)最近被提出用于对物理系统进行建模。它们对涉及成对交互的目标图进行操作。 Hoshen [24] 在多智能体预测建模的背景下提出了更有效的 Vertex Attention IN (VAIN)。另一个名为 Relation Networks [40] 的变体在其输入中的所有位置对的特征嵌入上计算一个函数。本文的方法还处理所有对,正如将解释的公式(1)中的(f(xi,xj)\left(f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)\right.(f(xi​,xj​)。虽然非局部网络与这些方法相关联,但实验表明,模型的非局部性与注意力/交互/关系的思想正交(例如,网络可以关注局部区域)是他们的经验成功的关键。非局部建模是图像处理的长期关键要素(例如,[12, 4]),在最近的计算机视觉神经网络中被很大程度上忽视了。

视频分类架构。视频分类的一个自然解决方案是将 CNN 用于图像的成功与 RNN 用于序列结合起来。相比之下,前馈模型是通过时空中的 3D 卷积 (C3D)实现的,并且可以通过“膨胀”预训练的 2D 滤波器来形成 3D 滤波器。除了对原始视频输入进行端到端建模外,还发现光流 和轨迹可能会有所帮助。光流和轨迹都是现成的模块,可能会发现长期的、非本地的依赖关系。视频架构的系统比较可以在 [7] 中找到。

3. Non-local Neural Networks

首先给出非局部操作的一般定义,然后提供它的几个具体实例。

3.1. Formulation


在非局部平均操作 [4] 之后,将深度神经网络中的通用非局部操作定义为:
yi=1C(x)∑∀jf(xi,xj)g(xj)(1)\mathbf{y}_{i}=\frac{1}{\mathcal{C}(\mathbf{x})} \sum_{\forall j} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) g\left(\mathbf{x}_{j}\right)(1) yi​=C(x)1​∀j∑​f(xi​,xj​)g(xj​)(1)

这里iii是要计算其响应的输出位置(空间、时间或时空)的索引,jjj是枚举所有可能位置的索引。x\mathbf{x}x是输入信号(图像、序列、视频;通常是它们的特征),y\mathbf{y}y是与x\mathbf{x}x大小相同的输出信号。成对函数fff计算iii和所有jjj之间的标量(表示关系,例如亲和性)。一元函数ggg计算位置jjj处的输入信号的表示。响应由因子C(x)\mathcal{C}(\mathbf{x})C(x)标准化。

公式(1)中的非局部行为是由于在操作中考虑了所有位置(∀j)(\forall j)(∀j)。作为比较,卷积运算将局部邻域中的加权输入求和(例如,i−1≤j≤i+1i-1 \leq j \leq i+1i−1≤j≤i+1在内核大小为 3 的一维情况下),并且在时间 i 的循环运算通常仅基于当前和最近的时间步长(例如,j=ij=ij=i或i−1i-1i−1.)。

非局部操作也不同于全连接(fcf_{c}fc​)层。公式(1)根据不同位置之间的关系计算响应,而fcf_{c}fc​使用学习的权重。换句话说,与非局部层不同,xj\mathbf{x}_{j}xj​和xi\mathbf{x}_{i}xi​之间的关系不是fcf_{c}fc​中输入数据的函数。此外,在公式(1)中的公式支持可变大小的输入,并在输出中保持相应的大小。相反,fcf_{c}fc​层需要固定大小的输入/输出,并且会丢失位置对应关系(例如,在位置iii从xi\mathbf{x}_{i}xi​到yi\mathbf{y}_{i}yi​的对应关系)。

非局部操作是一个灵活的构建块,可以很容易地与卷积/循环层一起使用。它可以添加到深度神经网络的早期部分,不像最后经常使用的fcf_{c}fc​层。这使得能够构建一个更丰富的层次结构,将非局部和局部信息结合起来。

3.2. Instantiations


接下来描述fff和ggg的几个版本。将通过实验(表 2a)表明非局部模型对这些选择不敏感,这表明通用的非局部行为是观察到改进的主要原因。

为简单起见,只考虑线性嵌入形式的ggg:g(xj)=Wgxjg\left(\mathbf{x}_{j}\right)=W_{g} \mathbf{x}_{j}g(xj​)=Wg​xj​,其中WgW_{g}Wg​是要学习的权重矩阵。这可以实现为,例如,空间中的1×11 \times 11×1卷积或时空中的1×1×11 \times 1 \times 11×1×1卷积。

接下来讨论成对函数fff的选择。

高斯。在非局部均值 [4] 和双边滤波器 [47] 之后,fff的自然选择是高斯函数。在本文中,考虑:
f(xi,xj)=exiTxj(2)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=e^{\mathbf{x}_{i}^{T} \mathbf{x}_{j}}(2) f(xi​,xj​)=exiT​xj​(2)
这里xiTxj\mathbf{x}_{i}^{T} \mathbf{x}_{j}xiT​xj​是点积相似度。 [4, 47] 中使用的欧几里德距离也适用,但点积在现代深度学习平台中更易于实现。归一化因子设置为C(x)=∑∀jf(xi,xj)\mathcal{C}(\mathbf{x})=\sum_{\forall j} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)C(x)=∑∀j​f(xi​,xj​)。

嵌入式高斯。高斯函数的一个简单扩展是计算嵌入空间中的相似度。在本文中,考虑:
f(xi,xj)=eθ(xi)Tϕ(xj)(3)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=e^{\theta\left(\mathbf{x}_{i}\right)^{T} \phi\left(\mathbf{x}_{j}\right)} (3) f(xi​,xj​)=eθ(xi​)Tϕ(xj​)(3)
这里θ(xi)=Wθxi\theta\left(\mathbf{x}_{i}\right)=W_{\theta} \mathbf{x}_{i}θ(xi​)=Wθ​xi​和ϕ(xj)=Wϕxj\phi\left(\mathbf{x}_{j}\right)=W_{\phi} \mathbf{x}_{j}ϕ(xj​)=Wϕ​xj​是两个嵌入。如上所述,设置C(x)=∑∀jf(xi,xj)\mathcal{C}(\mathbf{x})=\sum_{\forall j} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)C(x)=∑∀j​f(xi​,xj​)。

注意到,最近提出的用于机器翻译的自注意力模块 [49] 是嵌入式高斯版本中非局部操作的一个特例。这可以从以下事实看出:对于给定的iii,1C(x)f(xi,xj)\frac{1}{\mathcal{C}(\mathbf{x})} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)C(x)1​f(xi​,xj​)成为沿维度jjj的 softmax 计算。所以有y=softmax⁡(xTWθTWϕx)g(x)\mathbf{y}=\operatorname{softmax}\left(\mathbf{x}^{T} W_{\theta}^{T} W_{\phi} \mathbf{x}\right) g(\mathbf{x})y=softmax(xTWθT​Wϕ​x)g(x),这是 [49] 中的自注意力形式。因此,本文的工作通过将这种最近的自注意力模型与非局部方法的经典计算机视觉方法相关联来提供洞察力,并将 [49] 中的顺序自注意力网络扩展到通用空间/时空非用于计算机视觉中的图像/视频识别的局部网络。

尽管与 [49] 有关系,但注意力行为(由于 softmax)在本文研究的应用程序中并不是必不可少的。为了说明这一点,接下来描述了非局部操作的两个替代版本。

点积。fff可以定义为点积相似度:
f(xi,xj)=θ(xi)Tϕ(xj)(4)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\theta\left(\mathbf{x}_{i}\right)^{T} \phi\left(\mathbf{x}_{j}\right) (4) f(xi​,xj​)=θ(xi​)Tϕ(xj​)(4)
这里采用嵌入式版本。在这种情况下,将归一化因子设置为C(x)=N\mathcal{C}(\mathbf{x})=NC(x)=N,其中NNN是x\mathbf{x}x中的位置数,而不是fff的总和,因为它简化了梯度计算。像这样的标准化是必要的,因为输入可以具有可变大小。

点积和嵌入式高斯版本之间的主要区别在于 softmax 的存在,它起到了激活函数的作用。

级联。级联被关系网络[40]中的成对函数用于视觉推理。本文还评估fff的级联形式:
f(xi,xj)=ReLU⁡(wfT[θ(xi),ϕ(xj)])(5)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\operatorname{ReLU}\left(\mathbf{w}_{f}^{T}\left[\theta\left(\mathbf{x}_{i}\right), \phi\left(\mathbf{x}_{j}\right)\right]\right) (5) f(xi​,xj​)=ReLU(wfT​[θ(xi​),ϕ(xj​)])(5)
这里[⋅,⋅][\cdot, \cdot][⋅,⋅]表示级联,wf\mathbf{w}_{f}wf​是将级联向量投影到标量的权重向量。如上所述,设置C(x)=N\mathcal{C}(\mathbf{x})=NC(x)=N。在这种情况下,在fff中采用ReLU。

上述几个变体展示了通用的非局部操作的灵活性。作者相信替代版本是可能的,并且可能会改善结果。

3.3. Non-local Block


我们将公式(1)中的非局部操作包装到一个非局部块中,该块可以合并到许多现有架构中。将非局部块定义为:
zi=Wzyi+xi(6)\mathbf{z}_{i}=W_{z} \mathbf{y}_{i}+\mathbf{x}_{i}(6) zi​=Wz​yi​+xi​(6)
其中yi\mathbf{y}_{i}yi​在公式(1)中给出,“+xi+\mathbf{x}_{i}+xi​”表示残差连接。残差连接允许我们在任何预训练模型中插入一个新的非局部块,而不会破坏其初始行为(例如,如果WzW_{z}Wz​初始化为零)。图 2 显示了一个示例非局部块。公式 (2)、(3) 或 (4) 中的成对计算可以通过矩阵乘法简单地完成,如图 2 所示;公式 (5) 中的连接版本很简单。

非局部块的成对计算在用于高级子采样特征映射时是轻量级的。例如,图 2 中的典型值为 T = 4、H = W = 14 或 7。通过矩阵乘法完成的成对计算与标准网络中的典型卷积层相当。进一步采用以下实现,使其更高效。

图 2. 时空非局部块。特征图显示为其张量的形状,例如,对于 1024 个通道,T×H×W×1024T \times H \times W \times 1024T×H×W×1024(注意时会进行适当的整形)。 “⊗\otimes⊗”表示矩阵乘法,“⊕\oplus⊕”表示逐元素求和。对每一行执行 softmax 操作。蓝色框表示1×1×11 \times 1 \times 11×1×1卷积。在这里,展示了嵌入式高斯版本,瓶颈为 512 个通道。普通高斯版本可以通过去除θ\thetaθ和ϕ\phiϕ来完成,点积版本可以通过将 softmax 替换为1/N1 / N1/N缩放来完成。

非局部块的实现。将Wg,WθW_{g}, W_{\theta}Wg​,Wθ​和WϕW_{\phi}Wϕ​表示的通道数设置为x\mathrm{x}x中通道数的一半。这遵循了 [21] 的瓶颈设计,并将块的计算量减少了大约一半。等式(6)中的权重矩阵WzW_{z}Wz​计算yi\mathbf{y}_{i}yi​上的位置嵌入,将通道数与x\mathrm{x}x的通道数匹配。请参见图 2。

可以使用二次采样技巧来进一步减少计算量。将公式(1)修改为:yi=\mathbf{y}_{i}=yi​= 1C(x^)∑∀jf(xi,x^j)g(x^j)\frac{1}{\mathcal{C}(\hat{\mathbf{x}})} \sum_{\forall j} f\left(\mathbf{x}_{i}, \hat{\mathbf{x}}_{j}\right) g\left(\hat{\mathbf{x}}_{j}\right)C(x^)1​∑∀j​f(xi​,x^j​)g(x^j​),其中x^\hat{\mathbf{x}}x^是x\mathrm{x}x的子采样版本(例如,通过池化)。在空间域中执行此操作,可以将成对计算量减少 1/4。这个技巧不会改变非局部行为,只会使计算变得更稀疏。这可以通过在图 2 中的ϕ\phiϕ和ggg之后添加一个最大池化层来完成。

参考文献

[4] A. Buades, B. Coll, and J.-M. Morel. A non-local algorithm for image denoising. In Computer Vision and Pattern Recognition (CVPR), 2005. 1, 2, 3

[7] J. Carreira and A. Zisserman. Quo vadis, action recognition? a new model and the kinetics dataset. In Computer Vision and Pattern Recognition (CVPR), 2017. 1, 2, 4, 6, 7, 8

[10] K. Dabov, A. Foi, V . Katkovnik, and K. Egiazarian. Image denoising by sparse 3-d transform-domain collaborative filtering. Transactions on Image Processing (TIP), 2007. 2

[12] A. A. Efros and T. K. Leung. Texture synthesis by nonparametric sampling. In International Conference on Computer Vision (ICCV), 1999. 2

[19] K. He, G. Gkioxari, P . Doll´ar, and R. Girshick. Mask R-CNN. In International Conference on Computer Vision (ICCV), 2017. 2, 8

[21] K. He, X. Zhang, S. Ren, and J. Sun. Deep residual learning for image recognition. In Computer Vision and Pattern Recognition (CVPR), 2016. 1, 4, 5

[24] Y . Hoshen. Multi-agent predictive modeling with attentional commnets. In Neural Information Processing Systems (NIPS), 2017. 2

[40] A. Santoro, D. Raposo, D. G. Barrett, M. Malinowski, R. Pascanu, P . Battaglia, and T. Lillicrap. A simple neural network module for relational reasoning. In Neural Information Processing Systems (NIPS), 2017. 2, 3

[41] F. Scarselli, M. Gori, A. C. Tsoi, M. Hagenbuchner, and G. Monfardini. The graph neural network model. IEEE Transactions on Neural Networks, 2009. 2

[47] C. Tomasi and R. Manduchi. Bilateral filtering for gray and color images. In International Conference on Computer Vision (ICCV), 1998. 3

[48] D. Tran, L. Bourdev, R. Fergus, L. Torresani, and M. Paluri. Learning spatiotemporal features with 3d convolutional networks. In International Conference on Computer Vision (ICCV), 2015. 1, 2, 4

[49] A. V aswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N. Gomez, L. Kaiser, and I. Polosukhin. Attention is all you need. In Neural Information Processing Systems (NIPS), 2017. 2, 3, 6

(CVPR-2018)Non-local Neural Networks相关推荐

  1. 点云 3D 目标检测 - VoxelNet(CVPR 2018)

    点云 3D 目标检测 - VoxelNet(CVPR 2018) 摘要 1. 引言 1.1 相关工作 1.2 贡献 2. VoxelNet 2.1 VoxelNet架构 2.1.1 特征学习网络 2. ...

  2. [Relation Network]Realtion Networks for Object Detection (CVPR. 2018)

    文章目录 1. Motivation 2. Contribution 3. Object Relation Moudle 4. Relation Networks For Object Detecti ...

  3. 【论文简述及翻译】PWC-Net: CNNs for Optical Flow Using Pyramid, Warping, and Cost Volume(CVPR 2018)

    一.论文简述 1. 第一作者:Deqing 2. 发表年份:2018 3. 发表期刊:CVPR 4. 关键词:光流估计.端到端训练.代价体.金字塔 5. 探索动机:大多数性能最好的方法都采用能量最小化 ...

  4. 【论文简述及翻译】Learning for Disparity Estimation through Feature Constancy(CVPR 2018)

    一.论文简述 1. 第一作者:Zhengfa Liang.Yiliu Feng 2. 发表年份:2018 3. 发表期刊:CVPR 4. 关键词:CNN.端到端训练.视差改进.特征恒量.视差估计 5. ...

  5. 【论文简述及翻译】PSMNet:Pyramid Stereo Matching Network(CVPR 2018)

    一.论文简述 1. 第一作者:Jia-Ren Chang 2. 发表年份:2018 3. 发表期刊:CVPR 4. 关键词:端到端训练.连接体.空间金字塔池化.堆叠沙漏的3D CNN.回归 5. 探索 ...

  6. A Common Framework for Interactive Texture Transfer(CVPR 2018)学习笔记

    (转自AI 科技)本文是北京大学门怡芳基于其 CVPR spotlight 论文为 AI 科技评论提供的独家稿件. 原文链接:https://www.sohu.com/a/260324342_6518 ...

  7. Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet? (CVPR 2018)

  8. 点云 3D 分割 - SqueezeSeg(ICRA 2018)

    点云 3D 分割 - SqueezeSeg: Convolutional Neural Nets with Recurrent CRF for Real-Time Road-Object Segmen ...

  9. nuScenes 数据集(CVPR 2020)

    nuScenes 数据集(CVPR 2020) 摘要 1. 引言 1.1 贡献 1.2 相关数据集 2. nuScenes数据集 3. 任务和指标 3.1 检测 3.2 跟踪 4. 实验 4.1 基线 ...

  10. 点云 3D 目标检测 - PointPillars(CVPR 2019)

    点云 3D 目标检测 - PointPillars(CVPR 2019) 摘要 1. 导言 1.1 相关工作 1.1.1 使用CNNs进行目标检测 1.1.2 激光雷达点云中的目标检测 1.2 贡献 ...

最新文章

  1. 【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作
  2. jeesite的junit,数据没有插入?
  3. java pdf转为png_java-使用icepdf实现pdf转换成png
  4. Shell else if mysql_linux shell中 if else以及大于、小于、等于逻辑表达式介绍
  5. 科学网—语音识别技术发展史
  6. 接口XMPPConnection
  7. Python爬虫周记之案例篇——基金净值Selenium动态爬虫
  8. Delphi程序结构
  9. 爬虫单个ip代理设置_代理IP是怎么帮助爬虫持续工作的
  10. ArcGIS批量使用以表格显示分区统计工具
  11. HIVE 面试题总结
  12. 一切成功源于积累——20140928 认识货币——加元
  13. wine linux 目录,linux中wine的安装及使用
  14. 网页设计作业 酒店公寓网站设计——高级酒店公寓网页(4页) HTML+CSS+JavaScript 旅游主题度假酒店
  15. React基础-React中发送Ajax请求以及Mock数据
  16. 红米手机TWRP读不了刷机包成功解决记录
  17. Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
  18. 2022年「博客之星」参赛博主:顽石九变
  19. go redis incr的使用
  20. 关于DateTime.Now.Ticks

热门文章

  1. The bean sellergoods.FeignClientSpecification could not be registered. A bean with that name has a
  2. linux查询系统版本信息命令,命令查询windowsLinux系统版本信息
  3. PHPUnit 入门
  4. DGL dist sampling OP
  5. 每一个梦想都要让它长上翅膀
  6. 输出的字体全部变成繁体字
  7. 什么是PaaS? 平台即服务的解释
  8. Android图文混排
  9. leetcode174.地下城游戏
  10. 理论篇:关注点分离(Separation of concerns, SoC)