[论文笔记] Learning Rich Features for Image Manipulation Detection

说在前面

个人心得:

  1. 第一次关注篡改检测,最常见的篡改方式是拼接、复制移动和删除。
  2. 本文提出一个双流Faster R-CNN,用于篡改区域的检测和类型识别。
  3. RGB和噪声双输入流,更好地利用一些潜在的特征。
  4. 利用双线性池化进行特征融合,效果不错

CVPR 2018,原文链接:http://arxiv.org/abs/1805.04953

一作开源源码:https://github.com/pengzhou1108/RGB-N

本文作于2020年10月14日。

摘要

Image manipulation detection is different from traditional semantic object detection because it pays more attention to tampering artifacts than to image content, which suggests that richer features need to be learned. We propose a two-stream Faster R-CNN network and train it end-to-end to detect the tampered regions given a manipulated image.

图像篡改检测不同于传统的语义对象检测,因为它更加关注篡改伪影而不是图像内容,这表明需要学习更丰富的特征。我们提出了双个输入流的Faster R-CNN网络,并对其进行端到端训练,以在给定图像的情况下检测被篡改的区域。

One ofthe two streams is an RGB stream whose purpose is to extract features from the RGB image input to find tampering artifacts like strong contrast difference, unnatural tampered boundaries, and so on. The other is a noise stream that leverages the noise features extracted from a steganalysis rich model filter layer to discover the noise inconsistency between authentic and tampered regions. We then fuse features from the two streams through a bilinear pooling layer to further incorporate spatial co-occurrence of these two modalities.

这两个输入流之一是RGB流,其目的是从RGB图像输入中提取特征,以发现篡改伪像,例如强烈的对比度差异、不自然的篡改边界等。另一个是噪声流,它利用从富含隐写分析的模型滤波器层中提取的噪声特征来发现真实区域和篡改区域之间的噪声不一致。然后,我们通过双线性池化层融合来自两个流的特征,以进一步合并这两种模式的空间共现。

Experiments on four standard image manipulation datasets demonstrate that our two-stream framework outperforms each individual stream, and also achieves state-of-the-art performance compared to alternative methods with robustness to resizing and compression.

在四个标准图像处理数据集上进行的实验表明,与对大小调整和压缩具有鲁棒性的替代方法相比,我们的两流框架胜过每个单独的流,并且还实现了最新的性能。

1. 引言

随着图像编辑技术和用户友好编辑软件的进步,低成本的篡改或操纵图像生成过程已变得广泛可用。在篡改技术中,剪接、复制移动和删除是最常见的篡改。图像剪接可从真实图像中复制区域并将其粘贴到其他图像,复制移动复制并粘贴同一图像中的区域,然后移除会从真实图像中消除区域,然后进行修补。有时,在这些篡改技术之后,将进行高斯平滑等后处理。这些篡改的示例如下图所示。即使进行了仔细的检查,人类仍然很难识别被篡改的区域。
结果,区分真实图像与篡改图像变得越来越具有挑战性。 针对该主题(图像取证)的新兴研究非常重要,因为它旨在防止攻击者将篡改的图像用于不道德的商业或政治目的。与旨在检测图像中不同类别的所有对象的当前对象检测网络相反,用于图像操纵检测的网络将旨在仅检测被篡改的区域(通常是对象)。我们研究如何通过探索RGB图像内容和图像噪声特征来采用对象检测网络来执行图像篡改检测。
图像取证的最新工作利用诸如局部噪声特征和“相机滤镜阵列”(CFA)模式之类的线索将图像中的特定面片或像素分类为是否受到篡改,并定位受篡改的区域。这些方法大多数都集中在一种篡改技术上。最近提出的基于LSTM的体系结构对篡改的补丁进行了分割,通过学习检测篡改边缘来显示对多种篡改技术的鲁棒性。在这里,我们提出了一种新颖的两流篡改检测框架,该框架不仅可以对视觉篡改伪像(例如,操纵边缘附近的篡改伪像)进行建模,还可以捕获局部噪声特征中的不一致之处。
更具体地说,我们在两流网络中采用Faster R-CNN,并进行端到端训练。下图总结了我们的方法。诸如Faster R-CNN之类的深度学习检测模型在检测各种规模的语义对象方面表现出良好的性能。区域候选网络(RPN)是Faster R-CNN中的组件,负责选择可能包含感兴趣对象的图像区域,并且可以适用于图像篡改检测。为了将篡改区域与真实区域区分开,我们利用RGB通道的特征来捕获线索,例如篡改边界上的视觉不一致以及篡改区域与真实区域之间的对比效果。第二个流分析图像中的局部噪声特征。
第二流的直觉是,当从一个图像(源)中删除一个对象并将其粘贴到另一个图像(目标)中时,源和目标图像之间的噪声特征不太可能匹配。如果用户随后压缩篡改的图像,则可以部分掩盖这些差异。为了利用这些特征,我们将RGB图像转换为噪声域,并使用局部噪声功能作为第二个流的输入。有很多方法可以从图像产生噪波特征。基于最近对用于篡改分类的隐写分析丰富模型(steganalysis rich model,SRM)的工作,我们选择SRM滤波器内核以产生噪声特征,并将其用作第二个Faster R-CNN网络的输入通道。
然后,针对每个感兴趣区域(RoI)将这两个流中的特征进行双线性池化,以基于两个流中的特征来检测篡改伪像,请参见上图。
先前的图像处理数据集仅包含数百个图像,不足以训练深度网络。为了克服这个问题,我们创建了一个基于COCO的综合篡改数据集以进行模型预训练,然后在不同的数据集上对该模型进行微调以进行测试。我们的方法在四个标准数据集上的实验结果证明了有希望的性能。
我们的贡献是两方面的。首先,我们展示如何以两流方式将Faster R-CNN框架应用于图像篡改检测。我们探索了两种模式,即RGB篡改伪影和局部噪声特征不一致,并对其进行双线性合并以识别篡改区域。其次,我们表明这两个流是互补的,可用于检测不同的篡改技术,与最新技术方法相比,可提高四个图像处理数据集的性能。

2. 相关工作

图像取证研究包括多种方法来检测篡改图像中的低级篡改伪影,包括双重JPEG压缩、CFA颜色阵列分析和局部噪声分析。具体而言,Bianchi等人提出了一种概率模型来估计不同区域的DCT系数和量化因子。基于CFA的方法在假设篡改区域会干扰这些模式的情况下,分析由相机内部滤镜模式引入的低级统计信息。Goljan等人提出了一种高斯混合模型(GMM)来对CFA当前区域(真实区域)和CFA不存在区域(篡改区域)进行分类。
最近,基于局部噪声特征的方法,例如隐写分析丰富模型(SRM),在图像取证任务中表现出了令人瞩目的性能。这些方法从相邻像素提取局部噪声特征,捕获篡改区域和真实区域之间的不一致。 Cozzolino等人探索并证明了SRM功能在区分篡改和真实区域方面的性能。它们还通过将量化和截断操作与卷积神经网络(CNN)结合在一起来组合SRM功能,以执行篡改定位。Rao等人使用SRM过滤器内核作为CNN的初始化,以提高检测精度。这些方法大多数都集中在特定的篡改伪影上,并且仅限于特定的篡改技术。我们还使用这些SRM过滤器内核提取低级噪声,将其用作Faster R-CNN网络的输入,并学习捕获噪声特征中的篡改痕迹。此外,并行训练RGB并行流以对中高级视觉篡改伪像建模。
随着深度学习技术在各种计算机视觉和图像处理任务中的成功应用,许多最新技术还采用了深度学习来解决图像篡改检测问题。Chen等人在CNN之前添加了一个低通滤波器层,以检测中值滤波篡改技术。Bayar等人将低通滤波器层更改为自适应内核层,以了解在篡改区域中使用的滤波内核。除了滤波学习之外,Zhang等人还提出了一种堆叠式自动编码器,以学习用于图像篡改检测的上下文特征。Cozzolino等人将此问题视为异常检测任务,并使用基于提取特征的自动编码器来区分难以重构为篡改区域的那些区域。Salloum等人使用全卷积网络(FCN)框架直接预测给定图像的篡改蒙版。他们还学习了边界蒙版,以指导FCN查看被篡改的边缘,这有助于他们在各种图像处理数据集中实现更好的性能。Bappy等人提出了一种基于LSTM的网络,该网络被应用于小图像补丁,以在篡改补丁和图像补丁之间的边界上找到篡改伪像。他们联合使用像素级别分割来训练该网络,以提高性能并在不同的篡改技术下显示结果。但是,仅关注附近的边界在不同情况下只能提供有限的成功,例如,移除整个对象可能不会留下边界证据以进行检测。取而代之的是,我们使用全局视觉篡改技术以及局部噪声特征来建模更丰富的篡改工艺。我们使用基于Faster R-CNN的两流网络来学习丰富的图像处理检测功能。该网络显示了对拼接、复制和删除的鲁棒性。此外,该网络使我们能够对可疑的篡改技术进行分类。

3. 所提出的方法

我们采用了一个多任务框架,该框架同时执行篡改分类和边界框回归。在RGB流(上图的顶部流)中提供RGB图像,在噪声流(上图的底部流)中提供SRM图像。我们在全连接的层之前通过双线性池化融合两个流,以进行篡改分类。RPN使用RGB流来定位篡改区域。

3.1 RGB输入流

RGB流是单个Faster R-CNN网络,用于边界框回归和篡改分类。我们使用ResNet 101网络从输入的RGB图像中学习特征。ResNet的最后一个卷积层的输出功能用于篡改分类。RGB流中的RPN网络利用这些特征为边界框回归提出RoI。形式上,RPN网络的损失函数定义为
这个和Faster R-CNN的RPN是一样的。请注意,与传统的对象检测(RPN网络搜索可能是对象的区域)不同,我们的RPN网络搜索可能被篡改的区域。候选区域可能不一定是对象,例如,在移除篡改过程中的情况。

3.2 噪声输入流

RGB通道不足以解决所有不同的篡改情况。尤其是,经过精心后期处理以隐藏拼接边界并减少对比度差异的篡改图像对于RGB流而言是具有挑战性的。
因此,我们利用图像的局部噪声分布来提供其他证据。与RGB流相反,噪声流旨在更加关注噪声,而不是语义图像内容。这是新颖的,尽管当前的深度学习模型可以很好地表示RGB图像内容的层次结构特征,但深度学习的先前工作尚未研究过从检测中的噪声分布中学习。受图像取证在SRM特征方面的最新进展启发,我们使用SRM过滤器从RGB图像中提取局部噪声特征(上图中的示例)作为噪声流的输入。
在我们的设置中,噪声是通过像素值与仅通过内插相邻像素的值而产生的该像素值的估计之间的残差来建模的。从30个基本滤波器开始,再加上非线性运算(例如,滤波后附近输出的最大值和最小值),SRM功能将收集基本噪声特征。SRM量化并截断这些滤波器的输出,并提取附近的共现信息作为最终特征。从该过程获得的特征可以被视为局部噪声描述符。我们发现,仅使用3个内核即可获得不错的性能,而应用所有30个内核并不会显着提高性能。因此,我们选择3个内核,其权重如下所示,并将其直接输入经过3通道输入训练的预训练网络中。我们将噪声流中SRM滤波器层的内核大小定义为5×5×3。SRM层的输出通道大小为3。
上上的第三列显示了SRM层之后得到的噪声特征图。很明显,它们强调了局部噪声而不是图像内容,并明确揭示了可能在RGB通道中不可见的篡改伪像。我们直接将噪声特征用作噪声流网络的输入。噪声流的主干卷积网络架构与RGB流相同。噪声流与RGB流共享相同的RoI池层。对于边界框回归,我们仅使用RGB通道,因为根据我们的实验,RGB特征比RPN网络的噪声特征表现更好。

3.3 双线性池化

最后,我们将RGB流与噪声流结合在一起进行篡改检测。在各种融合方法中,我们对两个流的特征都应用了双线性池化。首先针对细粒度分类提出的双线性池化将双流合并在两流CNN网络中,同时保留空间信息以提高检测置信度。我们的双线性池化层的输出为
,其中
是RGB流的RoI特征,
是噪声流的RoI特征。在池化之前,求和池化会压缩空间特征。然后,在转发到全连接的层之前,应用带符号的平方根
和L2规范化。
为了节省内存并在不降低性能的情况下加快训练速度,我们使用紧凑的双线性池化(一种实现方式)。
经过全连接和softmax层后,我们获得了RoI区域的预测类别。我们将交叉熵损失用于篡改分类,将smooth L1损失用于边界框回归。 总损失函数为:
其中
表示总损失。
表示RPN网络中的RPN loss。
表示最终的交叉熵分类损失,它基于RGB和噪声流中的双线性池特征。
表示最终的边界框回归损失。
是RGB和噪声流的RoI特征。所有项的总和为总损失函数。

3.4 实施细节

所提出的网络是端到端的训练。调整输入图像以及提取的噪声特征的大小,使较短的长度等于600像素。使用四个锚定标尺,大小分别为
,长宽比为1:2、1:1和2:1。RoI池化后,RGB和噪声流的特征尺寸均为7×7×1024。紧凑型双线性池化的输出特征大小设置为16384。RPN候选的批处理大小,用于培训时为64,用于测试为300。
图像翻转用于数据增强。RPN正样本(潜在篡改区域)的IoU阈值为0.7,而负样本(真实区域)的IoU阈值为0.3。学习率最初设置为0.001,然后在40K后降低为0.0001。 我们将模型训练110k次。在测试时,应用标准NMS来减少候选的重叠区域的冗余。NMS阈值设置为0.2。

4. 实验

我们在四个标准图像处理数据集上展示了我们的两流网络,并将结果与最新方法进行了比较。我们还比较了不同的数据扩充,并测量了我们的方法对大小调整和JPEG压缩的鲁棒性。

4.1 预训练模型

当前的标准数据集没有足够的数据来进行深度神经网络训练。为了在这些数据集上测试我们的网络,我们在合成数据集上对模型进行了预训练。我们使用来自COCO的图像和注释自动创建合成数据集。我们使用分割注释从COCO中随机选择对象,然后将其复制并粘贴到其他图像。将训练(90%)和测试集(10%)分开,以确保在训练和测试集中都不会出现相同的背景和被篡改的对象。最后,我们创建42K篡改和真实的图像对。我们将发布此数据集以供研究使用。我们模型的输出是带有置信度得分的边界框,该置信度得分指示检测到的区域是否已被篡改。
为了在RoI中包括一些真实区域以便更好地进行比较,我们在训练过程中将默认边界框稍微扩大了20个像素,以便RGB流和噪声流都了解到篡改区域与真实区域之间的不一致。
我们在此综合数据集上端对端训练模型。Faster R-CNN中使用的ResNet 101在ImageNet上进行了预训训。我们使用AP进行评估,其度量标准与COCO检测评估相同。我们将两流网络的结果与下标中的每个流进行比较。该表显示,我们的两个流网络的性能要优于每个单个流。同样,使用噪声特征作为RPN和RPN使用这两种特征的RGB-N、RGB-N之间的比较表明,RGB特征比噪声特征更适合于生成区域候选。

4.2 标准数据集上的测试

  • NIST16是一个具有挑战性的数据集,其中包含所有三种篡改技术。此数据集中的操作经过后处理以隐藏可见痕迹。他们还提供了真实的防篡改蒙版以供评估。
  • CASIA提供各种对象的拼接和复制移动图像。仔细选择被篡改的区域,并应用一些后期处理,例如滤波和模糊处理。通过对篡改图像和原始图像之间的差异进行阈值处理来获得真实的蒙版。我们使用CASIA 2.0进行训练,并使用CASIA 1.0进行测试。
  • COVER是一个相对较小的数据集,专注于复制移动。它覆盖了与粘贴区域相似的对象,以隐藏篡改伪影,并提供了GT mask。
  • 哥伦比亚数据集专注于基于未压缩图像的拼接,并提供了GT mask。

以下是标准数据集的数量和划分。

评估指标:我们使用像素水平F1得分和接收器工作特性曲线下面积(AUC)作为我们的性能比较评估指标。F1分数是用于图像篡改检测的像素级别评估指标。我们改变不同的阈值,并使用最高的F1分数作为每个图像的最终分数,遵循相同的方法。我们将置信度得分分配给检测到的边界框中的每个像素,以进行像素级AUC评估。

基线模型

  1. ELA:一种错误级别分析方法,旨在通过不同的JPEG压缩质量来查找篡改区域和真实区域之间的压缩错误差异。
  2. NOI1:一种基于噪声不一致的方法,使用高通小波系数来建模局部噪声。
  3. CFA1:一种CFA模式估计方法,该方法使用附近的像素近似相机滤镜阵列模式,然后为每个像素产生篡改概率。
  4. MFCN:一个基于多任务边缘增强FCN的网络,使用边缘二进制掩码和使用篡改区域掩码的篡改区域共同检测篡改边缘。
  5. J-LSTM:一个基于LSTM的网络联合训练补丁级别篡改边缘分类和像素级别篡改区域分割。
  6. RGB Net:一个以RGB图像作为输入的Faster R-CNN网络。即我们的RGB Faster R-CNN流。
  7. Noise Net:单个Faster R-CNN网络,其噪声特征图作为输入从SRM滤波器层获得。RPN网络在这种情况下使用噪声特征。
  8. Late Fusion:直接融合结合了所有检测到的RGB Net和噪声Net的边界框。来自两流的重叠检测区域的置信度得分设置为最大。 9. RGB-N:RGB流和噪声流的双线性池,用于篡改分类,RGB流用于边界框回归。 即我们的完整模型。

数据增强:我们在下表中比较了不同的数据增强方法。与没有增强相比,图像翻转可提高性能,而其他增强方法(如JPEG压缩和噪声)则几乎没有改善。

JPEG的鲁棒性和调整大小的攻击:我们测试了我们方法的鲁棒性,并与下表中的3种方法(可使用其代码)进行了比较。我们的方法对这些攻击更鲁棒,并且胜过其他方法。

4.3 篡改技术检测

我们网络的丰富功能表示使其能够区分不同的篡改技术。我们探索篡改技术检测并分析所有三种篡改技术的检测性能。NIST16包含用于所有三种篡改技术的标签,从而可以进行多类图像处理检测。我们将操纵分类的类别更改为拼接、移除和复制移动,以便为每个类别学习不同的视觉篡改伪影和噪声特征。下表显示了每种篡改类别的性能。
结果表明,拼接是使用我们的方法检测到的最简单的篡改技术。这是因为拼接很可能同时产生RGB伪影,例如不自然的边缘、对比度差异以及噪声伪影。去除检测性能也优于复制移动,因为去除过程后的修补对噪声特征有很大影响。复制移动是我们提出的方法中最困难的篡改技术。解释是,一方面,复制的区域来自同一张图像,这产生了相似的噪声分布,使我们的噪声流变得混乱。另一方面,两个区域通常具有相同的对比度。而且,理想地,该技术将需要将两个对象彼此比较(即,它将需要同时查找和比较两个RoI),而当前方法则不行。 因此,我们的RGB流缺少区分这两个区域的证据。

4.4 定性结果

我们在下图中显示了一些定性结果,用于比较两类图像处理检测中的RGB、噪声和RGB-N网络。图像选自COVER、Columbia和CASIA 1.0。下图提供了一个示例,即使单个数据流之一发生故障,我们的两个数据流网络也能产生良好的性能(第一行和第二行)。
下图显示了RGB-N网络对使用NIST16的篡改技术检测任务的结果。如图所示,我们的网络针对不同的篡改技术会产生准确的结果。

5. 总结

我们提出了一种同时使用RGB流和噪声流的新型网络,以学习用于图像操纵检测的丰富特征。我们通过根据隐写分析文献改编的SRM滤波器层提取噪声特征,这使我们的模型能够捕获篡改区域与真实区域之间的噪声不一致。我们探索了从RGB查找篡改区域和图像的噪声特征的补充作用。毫不奇怪,两个流的融合导致性能提高。在标准数据集上进行的实验表明,我们的方法不仅可以检测篡改伪像,而且可以区分各种篡改技术。将来将探索更多特征,包括JPEG压缩。

图像内复制粘贴篡改取证matlab_[论文笔记] 篡改检测:RGB-N相关推荐

  1. 【论文笔记】NTU RGB+D

    NTU RGB+D 论文链接 NTU RGB + D优势: 更多的动作类 每个动作类更多的样本 类内变换(姿势,环境条件,交互对象,演员年龄,-) 更多的摄影机视角 更多的摄影机到对象距离 使用的Ki ...

  2. CMD窗口--解决无法复制粘贴文字的办法

    打开CMD 假如我们要复制其中的一些东西,我们会在窗口中右键点击,然后选择标记,选中我们想要复制的东西,然后进行Ctrl + C复制粘贴,就完成了. 但是这个有个弊端,就是只允许我们在CMD窗口之内进 ...

  3. 竟有内鬼!北理工硕士生「复制粘贴」论文,旷视研究员最新声明

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|AI算法与图像处理 [导读]过了半个多月,北理工硕士公然抄 ...

  4. 诺奖得主涉嫌学术造假!30多篇论文被曝P图、复制粘贴,牵扯中科大教授等多国学者

    大数据文摘出品 近日,著名学术打假网站Pubpeer又曝光了一起严重学术造假,并且这一事件的主角还是2019年诺贝尔奖生理学或医学奖得主--格雷格・塞门扎(Gregg L. Semenza). 截至今 ...

  5. 知云文献翻译打不开_有了这个英文文献翻译助手,SCI论文阅读不用再复制粘贴...

    上一次给大家推荐SCI翻译神器后,大家的反响很强烈,看来大家对于英文写作都有一样的烦恼.身为科研工作者,SCI论文的写作确实是一座压垮很多人的大山.不过别怕,困难总会克服的. 大家平时在阅读英文文献时 ...

  6. NeurIPS 2020 | AI编程:如何从复制粘贴走向推理合成(文末附论文及代码)

    编者按:AI 编程是人们对人工智能的一大期望,现在的 AI 编程技术虽然已经惠及了许多不会编程的普通用户,但还远没有达到满足人们预期的程度,一大痛点在于:现有 AI 只会进行机械地记忆与复制粘贴,难以 ...

  7. android textview 复制粘贴,android app 内 实现文本复制粘贴功能

    如果有一天我后悔了自己的决定,希望一切都还来得及. 在app内实现复制粘贴功能,主要分为两种情况.一种是点击按钮,复制指定的文本.一种是长按文本调用系统的复制功能. (一)主要用于复制一些序列号,邀请 ...

  8. linux内如何复制粘贴文本

    linux内如何复制粘贴文本 在终端中使用键盘快捷键进行复制粘贴 为什么 Linux 终端不使用"通用"的 Ctrl+C 和 Ctrl+V 在终端中使用键盘快捷键进行复制粘贴 在 ...

  9. win10与内置ubuntu之间复制粘贴操作

    cmd窗口执行bash后得到的命令窗与在xshell不同,通过shift+v无法黏贴,并且在输入界面鼠标右键无法使用.后来发现鼠标右键可以在对话框的标题上点击,弹出的菜单上面 ==> Edit( ...

最新文章

  1. 黑客零基础入门 | 网络安全
  2. 【转】mysql-status和variables区别
  3. numpy(3)-numpy.random.random() ,random_sample()连续均匀分布
  4. NeurIPS 2019 | 用于弱监督图像语义分割的新型损失函数
  5. XCTF-MISC-新手区-gif
  6. 银行招聘笔试中行测和综合知识复习心得
  7. Windows2008|2003超出最大连接数
  8. html日期选择器小日历样式,9 款样式华丽的 jQuery 日期选择和日历控件
  9. Qt实现 员工培训管理系统
  10. MapReduce的C#实现及单元测试(试验)
  11. UE4对接腾讯GME语音服务(实时语音一)
  12. conda使用清华镜像安装pytorch
  13. java资源文件路径_Java 中获取资源(文件)的路径问题总结
  14. Ubuntu应用---官方完美安装typora (.md文件编辑器)
  15. SOLID原理的详细信息。
  16. 第一章 ArcGIS Pro python高级脚本教程介绍
  17. python -m json.tool的使用
  18. css–sprit_高级CSS –类已用完–通过使用结构化格式标签避免类
  19. python gui是什么_python的gui是什么
  20. Sourcetree 无法打开

热门文章

  1. leetcode 448. 找到所有数组中消失的数字(Java版)
  2. 面试必会系列 - 5.3 LVS负载均衡
  3. 【Python Flask】使用Ajax向后台提交数据(拼接url方式)
  4. PAT1004 成绩排名【vector sort排序、string的使用】
  5. HTML中引入CSS的三种方式——响应式Web系列学习笔记
  6. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第三章 课后答案
  7. 最全!最完整的递归下降分析法代码!!! (实验报告,代码)
  8. Win7 路由上网DNS服务器ping不通的解决方法
  9. Android 判断应用 第一次启动
  10. log4j2 pattern 行号_Springboot整合log4j2日志全解总结