Learning to Extract Semantic Structure from Documents Using Multimodal Fully Convolutional Neural Networks

一、Introduction

Document semantic structure extraction (DSSE)文档结构提取:其目标是将文档图像分割成感兴趣的区域,并识别每个区域的作用。其中分为两个步骤:

  1. page segmentation页面分割:是基于外观的,试图将文本区域与图形、表格和线段等区域区分开来。
  2. logical structure analysis逻辑结构分析:基于语义的,将每个区域划分为语义相关的类,如段落和标题。

1、Multimodal Fully Convolutional Network (MFCN)

Multimodal Fully Convolutional Network (MFCN)是一个多模态全卷机网络,识别基于外观和基于语义的类,主要是一个页面分割模型,同时在文本区域上形成细粒度识别[1]:文本区域根据其在文档中的语义功能被分配特定的标签。

本文**创新点**在于:简化了DSSE并更好地支持文档图像理解,文章采用MFCN模型在文档图像上以端到端、像素到像素的方式训练,大大超过了最先进的水平。它消除了设计复杂的启发式规则和提取手工制作的特性的需要。文章认为DSSE是一个逐像素分割问题:每个像素都标记为背景、图形和表格、段落、节标题、列表、标题等。

在很多情况下可以直观的识别章节标题或者大标题的区域,但是在某些情况下DSSE还是需要文本的语义信息来消除干扰,如下图的例子

( a )仅基于文本难以识别的例子。同名可以是标题、作者,也可以是图片说明。( b )仅基于视觉外观难以识别的例子。大字体中的文本可能被错误标注为节标题。带有破折号的文本可能被误标为列表。

所以单纯地使用视觉信息或者文本信息来分割文本可能造成分割出的内容不准确,所以需要两者互补来实现准确分割文档内容。因此,本文提出的改进后的MFCN旨在利用文档中的文本信息。为了将文本信息结合到基于CNN的架构中,我们构建了一个文本嵌入Map并将其提供给MFCN。更具体地说,我们嵌入每个句子,并将嵌入映射到文档中表示句子的相应像素

2、模型

下图为所提出的MFCN模型的架构。

该模型由四部分组成:①学习用特征表示层次结构的编码器;②输出分割掩膜的解码器;③用于无监督重建的辅助解码器;④融合视觉表示和文本表示的桥梁。其中助解码器只存在于训练过程中。对于文档图像,这可以通过现代OCR引擎完成。

训练全卷积网络的瓶颈之一是需要逐像素的地面真实数据。先前的文档理解数据集受到其小尺寸和缺乏细粒度语义标签(如节标题、列表或图和表标题)的限制。为了解决这些问题,文章提出了高效的合成文档生成过程,并使用它为我们的网络生成大规模预训练数据。首先,我们提出了两个无监督任务以更好地对真实文档进行泛化重建和一致性任务前者通过重建输入图像实现更好的表示学习,而后者使属于相同区域的像素具有相似的表示

  1. 文章提出了一个端到端的统一网络来解决文档语义结构提取问题。与前面的两步过程不同,我们同时识别基于外观的类和基于语义的类。
  2. MFCN网络支持关于图像和文档文本的监督训练,以及用于更好表示学习的无监督辅助训练。
  3. 提出了一个合成数据生成过程,并使用它来合成大规模数据集,以训练我们的深度MFCN模型的受监督部分。

二、Background

1、Page Segmentation

Page Segmentation页面分割是将页面划分成不同区域的方法,通常采用自顶向下[2]或自底向上[3]。但是这两种传统方法很难分割具有复杂布局的文档。

2、Logical Structure Analysis

Logical Structure Analysis逻辑结构被定义为文档中逻辑组件的层次结构,如节标题、段落和列表。早期的逻辑结构发现工作侧重于使用一套基于每个句子的位置、字体和文本的启发式规则。

3、Sem3antic Segmentation

Semantic Segmentation语义分割,最初提出的FCN模型有几个局限性,例如忽略小对象和由于固定感受野大小而误标记大对象。为了解决这个问题,Noh等人提出使用去池化,一种在上采样阶段重用池化位置的技术。皮涅罗等尝试使用跳跃连接来细化分割边界。文章采用了一个扩张块来解决上述感受也小的问题的问题

问:扩张块是什么?

答:是空洞卷积[4]里的卷积

4、Unsupervised Learning

无监督学习的主要关注点是图像级别的分类和生成方法,而在文章中探索了这些方法在像素级语义分割中的潜力。

中心损失,是一种鼓励具有相同标签的数据样本具有相似的视觉表示的的损失函数

​ 问:什么是中心损失?

​ 答:就是一种loss function[5],可以让类内(同一种分类之间)的差异减少。

文章引入“类内一致性约束”。然而,每类损失的"中心"是由整个数据集的数据样本决定的,而在我们的例中,"中心"是由每幅图像中同一区域内的像素局部决定的。像素局部说的是相邻像素或者大片像素连起来分析的过程。

5、Language and Vision

论文工作的独特之处就在于**首次将文本潜入直接运用于分割任务中**。

三、Method

本文的方法使用专门的多模态全卷积网络对像素级分割进行监督训练,该网络使用文本嵌入图与视觉线索联合使用。本文的MFCN架构还支持两个无监督学习任务来改进学习到的文档表示:基于辅助解码器的重建任务在主解码器分支中评估的一致性任务以及超像素分割损失

3.1 MFCN

一些基于语义的类,如节标题和标题,通常占据相对较小的区域。此外,正确识别某些区域通常依赖于小的视觉线索,例如每个项目前面的小项目符号或数字来识别列表。

对于一些基于语义的类,例如通过每个目标前的数字认为这个目标要识别成一个列表的,通常需要使用这种低级特征来识别,但是在FCN中的池化操作就会丢弃这些低级特征,导致了FCN对小目标识别表现不佳。简单地将基于不同尺度特征的独立预测平均并不能提供令人满意的解决方案。低层表示受限于局部感受野,无法感知对象级语义信息;另一方面,由于CNN模型具有平移不变性,高层特征不一定与目标边界保持一致。我们提出了一种替代的方案:跳跃连接,如上中蓝色箭头所示,类似于独立工作Sharp Mask 中使用的跳跃连接(看这有一点像是resnet的删减版)。然而,它们在跳过连接后使用双线性上采样,而我们使用去池化来保留更多的空间信息。

为了解决FCN对小目标识别不佳的问题,需要更广泛的上下文信息来识别某些对象。举例来说,只看其中的一部分,往往很难区分一个列表和几个段落之间的区别,如下图所示,属于列表的一部分被分割为了段。所以单纯的图像信息是不够的,需要结合更多的上下文信息来实现更好的分隔效果。

为了正确地分割列表的右边部分,感受野必须足够大以捕获左边的列表。这里说的是上图的青色部分的右边的黄色区域是被错误分割的。受Inception架构和空洞卷积的启发,我们提出了空洞卷积块,如下图所示。每个扩张卷积块由5个3 × 3核大小的扩张卷积组成[4]。

3.2 Text Embedding Map

由于需要结合文本的信息,所以需要构建一个文本嵌入映射,将句子认为是传达一定语义的最小单位,用低维向量表示,句子嵌入的方式是通过对每个单词的平均嵌入来构建的。文本嵌入图的构成:对于句子区域内部的每个像素,我们使用相应的句子嵌入作为输入。属于同一句子的像素具有相同的嵌入,不属于任何句子的像素将会被零向量填充

利用skip-gram model,如下图所示,通过输入一个词的one-hot向量去预测一个N维的的向量,该向量是表示n个对预测这个词有用的词,其中w(t)对应的是输入的单词的词向量,w(i)是输入的词向量相邻的词向量

其中T是序列的长度,C是上下文窗口的大小。更一般的来说,是通过给定一组单词序列,通过上下文窗口大小来寻找这一组单词序列中对预测这一个词的平均概率,要求最大化下面的对数概率

通过softmax的定义式来计算给定输入词wi时输出wo的概率,注意这里是输入的词不是词向量
其中vw是输入的N维词向量,v’w是输出的N维词向量

3.3 Unsupervised Tasks

由于合成文档所提供的数据在布局上是有限的 ,所以定义了两个无监督损失函数,利用真实文档进行鼓励和表示学习。

3.3.1 Reconstruction Task重构任务[6]

通过Consistency Task重构的方式提高监督任务的性能(帮助模型更好的学习图像特征),在原本分割解码器的地方添加第二个解码器,记做Drec,并在中间特征出定义一个重构损失。
这个辅助解码器只在训练阶段起效果。

al是编码器中第i层的激活,l从1开始,a0是输入的图像,(那么对于前馈卷积网络来说aI就是CIHIWI的特征图),辅助解码器Drec就会试图重建特征图的层次结构;然后通过重建后的aI’与原本的特征图al求损失,这样可以让模型学习到更多内容。

这里的重构任务的目的应该是让模型对图像信息的学习更为清晰,其效果类似bert的文本mask,应该是类似于layoutLMv2和v3的图片遮盖一类的操作

3.3.2 Consistency Task一致性任务

这里文中说对于PDF文件来说可以通过分析渲染命令(说的应该是生成PDF的时候用的指令吧),找到对应的bounding box,虽然不知道这些bounding box的标签,但是提供了文档中哪些部分属于相同对象,因此不应该分割成不同的片段。

p(i,j)是在大小为CHW的特征图中第(i,j)位置的激活,下标b是某一个bounding box的区域,并且每个矩形区域的大小是Hb*Wb。
这个loss公式的意思应该是说pb计算出来的是特征图中每个值的总和求平均(也就是这个bounding box内特征图的被激活的总和),那么loss就是在计算特征值中每个被激活与总值的差值,就相当于是在计算这个点是是否你该落在这个区域内。

(这个loss公式我看的其实不是很懂,我猜是这样的)

上述的一致性损失可以通过提督下降来进行优化微调,左式就是微调后的结果

化简的结果,这个一致性损失和原本的分割损失一起在主解码器分枝里起作用。

四、Synthetic Document Data合成数据集

文中的MFCN模型需要更多更细粒度的分割(也需要更多的分割标签类型(文本、图形、表格)),要逐像素标注,对于公开的数据集本文并不适用。
文中从创建了一个符合要求的数据生成引擎,可以用来生成大规模的、按像素标注的文档:第一种是对从网络上抓取的数据进行自动化随机布局。以及相关的工作有点像是在做匹配或者对齐的工作,来更好的实现数据生成引擎的功能。

为了进一步增加生成的文档布局的复杂性,论文收集并标记了271个具有各种复杂布局的文档。然后,我们将每个元素随机替换为如上所述生成的独立段落、图、表、标题、章节标题或列表。这算是一种数据增强的方法。

上图就是合成文档、原始分割和可选后处理后的结果。分段标签颜色为:figure,table,section heading,caption,list和paragraph。

五、Implementation Details

辅助解码器只存在于训练阶段。所有卷积层的核大小均为3 × 3,步长为1。池化(在编码器中)和去池化(在解码器中)的内核大小为2 × 2。我们在每次卷积之后和所有非线性函数之前采用批归一化。

对于合成文档,每个像素的分类损失和无监督损失在反向传播时都有其效果对于真实文档,只有无监督损失会起效果。

其中会将词转为128维的向量。

5.1 Post-processing后处理

一个可选的后处理步骤,用来作为段掩码的清理策略。

对于PDF格式的文档,通过分析PDF格式的到一组候选边界框来寻找元素框(应该就是上文说的那个什么结构代码来分析PDF)然后通过计算属于同一框的像素的平均类概率来细化分割掩码(这里说的应该就是之前那个pij那个对整个特征图中的一个激活来计算),然后为这些像素分配最有可能的标签 。

六、实验

  1. SectLabel数据集是用于页面分割的数据集,更加基于外观的区域,是一些杂志和技术文章的70个抽样页面构成。
  2. DSSE-200数据集是本文提出的新数据集,该数据集同时提供了基于外观和基于语义的标签,其包含了200页杂志和学术论文。其中的页面区域分类从图、表、节、标题、列表、段落中分配标签。
  3. ICDAR2015数据集是两年一次的IC-DAR页面分割竞赛[8]中使用的数据集,更侧重于基于外观的区域。

用像素交并比(IoU)来衡量性能,是语义分割任务的标准

6.1 Ablation Experiment on Model Architecture

上表为DSSE-200数据集上的消融实验。每个模型的结构都以卷积层的扩展、上采样的方式和跳跃连接的使用为特征。报告IoU分数(%)。在不同网络架构的有效性,这些结果不包含文本信息或无监督学习任务,论文实验的目的是找到最佳的基底架构,用于后续实验。Model5在视觉信息上的效果最好。

6.2 Adding Textual Information

上表为DSSE-200(D)和使用文本嵌入图的合成数据集(S)上的IoU分数(%)。在合成数据集上,我们进一步研究了在构建文本嵌入图时使用提取文本与真实文本的效果。

文章采用最佳架构Model5作为我们的视觉模型,并通过桥接模块合并文本嵌入图。该组合模型根据合成文档进行了调整。如上表所示,使用文本也可以提高文本类的性能。

文章依赖现有的OCR引擎来提取文本,但对于低质量的扫描文档,它们并不总是可靠的。为了定量分析使用提取文本的效果,比较了使用提取文本与真实文本的性能。比较是在合成数据集(200张图像)的子集上进行的,因为地面真相文本自然可用。如上图所示,使用真实文本可以显著提高平均IoU(6.4%),这表明了合并文本信息的有效性。使用OCR提取的文本效果不佳,但仍能提高2.6%。优于DSSE-200数据集0.3%的改进;所以将此归因于合成数据不像DSSE-200那样复杂,因此提取文本变得更容易。

6.3 Unsupervised Learning Tasks

上表为在DSSE-200数据集上使用不同训练对象时,IoU得分(%)。cls:像素级分类任务,rec:重建任务,cons:一致性任务。

文章研究了所提出的两个无监督学习任务(Reconstruction Task重建和Consistency Task一致性任务)如何在训练过程中补充像素分类。采用最佳模型,只改变训练目标。然后,模型以半监督的方式进行微调。结果如上表所示。添加重建任务将平均IoU略微提高0.6%,而添加一致性任务将提高1.9%。这些结果证明了利用区域信息是有益的。将这两项任务结合起来,平均IoU为75.9%。

6.4 Comparisons with Prior Art

ICDAR2015数据集上页面分割的IoU分数(%)。为了进行比较,仅显示非文本、文本和图形的IoU分数。论文模型也可以进行细粒度预测。

ICDAR2015数据集的比较(上表)。先前的逐像素页面分割模型通常解决二进制分割问题,不会对细粒度类进行预测。为了公平比较,将最后一层的输出通道数更改为3(背景、图形和文本),并对最后一层进行微调。论文的双值MFCN模型在非文本(背景和图形)、文本和图形区域的IoU得分分别为94.5%、91.0%和77.1%,优于其他模型。

SectLabel数据集上的F1分数。注意,我们的模型还可以识别非文本类,如图和表。

SectLabel数据集的比较(上表)。Luong等人[36]首先使用Omnipage定位和识别文本行,然后预测每行的基于语义的标签。报告了每个班级的F1成绩。为了公平比较,我们使用相同的一组文本行边界框,并使用平均像素预测作为每个文本行的标签。我们的模型在章节标题(0.919 VS 0.916)、标题(0.893 VS 0.781)和列表(0.793 VS 0.712)方面获得了更好的F1分数,同时能够识别,图和表。

相关知识

1.细粒度识别

细粒度识别是一种人工智能技术,用于在给定的数据集中识别和分类具有细微差别的对象或事件。通常,这些对象或事件在外观上非常相似,但在细节方面存在微小的变化或差异。

例如,在图像识别中,细粒度识别可以用于识别不同品种的狗或鸟类。这些物种在外观上可能非常相似,但具有微小的差异,例如羽毛颜色、尾巴形状或面部特征。细粒度识别可以识别这些微小差异,并将它们分类到正确的物种中。

在自然语言处理中,细粒度识别可以用于识别具有细微语义差异的词语或短语。例如,情感分析中,细粒度识别可以用于区分具有微小情感差异的词语,例如“好”和“很好”,并将它们分类到正确的情感类别中。

2.自顶向下

自顶向下设计方法是指先将页面分割成较大的区域,然后再将这些区域进一步细分为更小的组件。自顶向下的方法迭代地将页面拆分为列、块、文本行和单词。

3.自底向上

自底向上设计方法是指先将页面分割成较小的组件,然后再将这些组件逐步组合成更大的区域。这种方法通常从细节出发,着眼于页面的各个组件和交互细节。自底向上的方法首先基于局部特征(白/黑像素或连通分支)检测单词,然后依次将单词分组为文本行和段落。然而,这类方法存在连通成分识别和分组耗时的问题。

4.空洞卷积

空洞卷积神经网络。空洞卷积神经网络是一种卷积神经网络的变体,它通过在卷积操作中引入稀疏内核或滤波器,从而扩大了感受野,增加了网络的感受野和有效感受野。这种网络结构被广泛应用于语义分割和目标检测等计算机视觉任务中,以获得更准确和更稳定的结果。

普通卷积操作如下图所示

空洞(膨胀卷积)卷积如下图所示

假设以一个变量d来衡量空洞卷积的扩张系数,则加入空洞之后的实际卷积核尺寸与原始卷积核尺寸之间的关系:K = K + (k-1)(d-1)

其中k为原始卷积核大小,d为卷积扩张率(dilation rate),K为经过扩展后实际卷积核大小。除此之外,空洞卷积的卷积方式跟常规卷积一样。我们用一个扩展率d来表示卷积核扩张的程度。比如说d=1,2,4的时候卷积核核感受野如下图所示:

在这张图像中,3×3 的红点表示经过卷积后,输出图像是 3×3 像素。尽管所有这三个扩张卷积的输出都是同一尺寸,但模型观察到的感受野有很大的不同。当d=1,原始卷积核size为3 * 3,就是常规卷积。d=2时,加入空洞之后的卷积核:size=3+(3-1) * (2-1)=5,对应的感受野可计算为:(2 ^(d+2))-1=7。d=3时,卷积核size可以变化到3+(3-1)(4-1)=9,感受野则增长到 (2 ^(d+2))-1=15。有趣的是,与这些操作相关的参数的数量是相等的。我们「观察」更大的感受野不会有额外的成本。因此,扩张卷积可用于廉价地增大输出单元的感受野,而不会增大其核大小,这在多个扩张卷积彼此堆叠时尤其有效。

(参考于Mr.Jk.Zhang)

5.Center loss

最近在看人脸表情识别论文的时候,看到了有用中心损失函数(Cemter Loss),中心损失它仅仅用来减少类内(比如说同一表情)的差异,而不能有效增大类间(比如说不同表情)的差异性。如下图所示:

上图中,图(a)表示softmax loss学习到的特征描述 。图(b)表示softmax loss + center loss 学习到的特征描述,他能把同一表情的样本之间的距离拉近一些,使其相似性变大,尽量的往样本中心靠拢,但可以看出他没有把不同表情之间的样本距离拉大。

它的定义是这样的:

类中心c:每一个样本的特征需要通过一个好的网络到达特征层获得,这样计算完后所有样本的特征的平均值为类中心c,而好的网络需要是在有类中心加入的情况下才能得到…

优化过程:

没法直接获得c,所以将其放到网络里自己生成,在每一个batch里更新center.即随机初始化center,而后每一个batch里计算当前数据与center的距离,而后将这个梯度形式的距离加到center上.类似于参数修正.同样的类似于梯度下降法,这里再增加一个scale度量a,使得center不会抖动.

(来源mjiansun)

6.重构任务

图像的重构任务是指通过对输入图像进行处理,以产生更好的图像输出。图像重构任务可以分为多种类型,包括但不限于以下几种:

  1. 图像去噪:消除图像中的噪声,以产生更清晰的图像输出。去噪技术可以使用传统的滤波算法,如均值滤波和高斯滤波,也可以使用深度学习算法,如卷积神经网络(CNN)。
  2. 图像增强:提高图像的质量和可视性,以产生更好的视觉效果。增强技术可以使用传统的直方图均衡化算法,也可以使用深度学习算法,如生成对抗网络(GAN)。
  3. 图像超分辨率:提高低分辨率图像的质量,以产生更高分辨率的图像输出。超分辨率技术可以使用传统的插值算法,如双线性插值和双三次插值,也可以使用深度学习算法,如超分辨率CNN(SRCNN)和残差网络(ResNet)。
  4. 图像修复:恢复损坏或缺失的图像信息,以产生更完整的图像输出。修复技术可以使用传统的插值算法,如基于模板的修复算法,也可以使用深度学习算法,如生成式对抗网络(GAN)和变分自编码器(VAE)。

Extract Semantic Structure from Documents Using Multimodal Fully Convolutional Neural Networks阅读笔记相关推荐

  1. 人群分割--Fully Convolutional Neural Networks for Crowd Segmentation

    Fully Convolutional Neural Networks for Crowd Segmentation https://arxiv.org/abs/1411.4464 这里设计了一个全卷 ...

  2. [论文翻译]V-Net:Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation

    论文下载: 地址 V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation V-Net: ...

  3. 论文解读(一)V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation

    发表:Computer Vision and Pattern Recognition 数据集: MRI volumes depicting prostate前列腺核磁共振成像 目标函数:基于Dice系 ...

  4. 论文阅读笔记:Retinal vessel segmentation based on Fully Convolutional Neural Networks

    基于全卷积神经网络的视网膜血管分割 关键词:全卷积神经网络.平稳小波变换.视网膜眼底图像.血管分割.深度学习 摘要 本文提出了一种新的方法,将平稳小波变换提供的多尺度分析与多尺度全卷积神经网络相结合, ...

  5. Fully Convolutional Adaptation Networks for Semantic Segmentation

    参考  论文解析之<Fully Convolutional Adaptation Networks for Semantic Segmentation> - 云+社区 - 腾讯云 论文网址 ...

  6. 神经网络压缩(6):Exploring the Regularity of Sparse Structure in Convolutional Neural Networks

    Exploring the Regularity of Sparse Structure in Convolutional Neural Networks 方法介绍 目的: 探索稀疏性和预测精度之间的 ...

  7. 【论文阅读笔记】Automatic Liver and Lesion Segmentation in CT Using Cascaded Fully Convolutional Neural Net

    本文提出一种从腹部CT片中自动分割肝脏和肝脏病变的方法. 使用的数据集为3DIRCADb dataSets:http://ircad.fr/research/3d-ircadb-01 使用的神经网络库 ...

  8. Exploring the Regularity of Sparse Structure in Convolutional Neural Networks(在卷积神经网络中探索稀疏结构的规律性)

    作者提出 基于论文Learning both weights and connections for efficient neural network修剪的方法在保留精度以及实现更高的压缩率方面确实很 ...

  9. Few-Shot Semantic Segmentation with Democratic Attention Networks阅读笔记

    摘要 DAN机制可以激活更多的目标像素点,在support和query图像间构建一个稳固的关系. 介绍 目前大部分的小样本分割方法都是基于prototype来进行.这类方法用了一个两分支的编解码结构, ...

最新文章

  1. 性能评估指标(Precision, Recall, Accuracy, F1-measure)
  2. guns开源项目数据库切换为oracle
  3. 2021北京高考英语口试成绩查询,2021北京高考英语口语怎么考?2021英语增加口语考试是全国?...
  4. map怎么转化dto_阿里面试题:为什么Map桶中个数超过8才转为红黑树
  5. HDU 4109 Instrction Arrangement
  6. 宝塔定时任务执行php源码任务_Linux at命令详解:定时执行任务
  7. VS2019注释整段代码
  8. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()
  9. SpringBoot集成Shiro前后端分离使用redis做缓存
  10. python网络编程100例_python网络编程
  11. flask报错 ValueError: Circular reference detected 问题解决
  12. 获取服务器响应失效,从Web服务器获取响应时出现问题
  13. IT项目管理规范模板及IT软件招投标模板(共367份,488M)
  14. 微信支付之Native扫码支付功能
  15. 图论·并查集·题解【Cow at Large G·atlarge】
  16. 坐拥深圳7栋房,月收租60万!房东却选择开出租……
  17. 你有一份七夕赚钱指南等待签收
  18. 仿盛大服务器列表不显示,大刀护卫不见了,传奇GEE引擎服务端大刀没了
  19. 如何根据ACPI规范来获取I/O APIC控制寄存器的地址
  20. 2020北京公积金查看与提取

热门文章

  1. AutoSAR软件组件开发的两类工作流程(Matlab/Simulink)
  2. 典型屌丝脸如何打造“爆款”创业?
  3. 269_长按加号减号快速加减
  4. Excel功能的强大
  5. 解决文件夹隐藏属性无法取消的办法
  6. WPF 控件专题 Border控件详解
  7. 【硬件相关】网卡bond配置
  8. SpringBoot - 数据库操作之 JdbcTemplate 多数据源配置
  9. Rotating Sentences
  10. WPF之ListView使用WrapPanel