微小目标检测的FPN有效融合因子

摘要:基于FPN的检测器在一般物体检测方面取得了显著的进步,例如MS COCO和PASCAL VOC。然而,这些检测器在某些应用场景中会失败,例如微小物体检测。在本文中,我们认为FPN相邻层之间的自上而下的连接对微小物体的检测带来了双重影响,不仅是正面的。我们提出了一个新的概念,融合因子,来控制深层传递给浅层的信息,使FPN适应微小物体的检测。经过一系列的实验和分析,我们探索了如何通过统计方法来估计特定数据集的融合因子的有效值。估计值取决于分布在每个层中的目标数量。在微小物体检测数据集上进行综合实验,例如TinyPerson和Tiny CityPersons。我们的结果表明,当使用适当的融合因子配置FPN时,网络能够在微小目标检测数据集上实现显著的性能增益。将发布代码和模型。

论文地址:https://arxiv.org/pdf/2011.02298.pdf

代码地址:GitHub - ucas-vg/Effective-Fusion-Factor: Effective Fusion Factor in FPN for Tiny Object Detection(WACV2021)

1.前言

微小物体检测是计算机视觉领域的一个重要课题,具有广泛的应用,包括监视、驾驶辅助和快速海上救援。

基于FPN的检测器采用自顶向下和横向连接的方法融合多尺度特征,在常用的目标检测数据集如MS COCO[17]、PASCAL VOC[9]和CityPersons[34]上取得了很大的成功。然而,这些探测器在微小物体检测方面表现不佳,如TinyPerson[33]和tiny CityPersons[33]。一个直观的问题出现了:为什么目前基于FPN的探测器不适合检测微小物体,以及如何使其适应微小目标检测。

回答这个问题的动机源于FPN在分析微小目标检测实验结果时的一个有趣现象。如图1所示,随着深层向浅层传递信息的增加,表现出先增大后减小的现象。我们将融合因子定义为FPN中相邻两层融合特征时对更深层的加权系数。

图1所示:基于不同融合因子的TinyPerson和Tiny CityPersons的性能。y轴显示tiny 50在给定融合因子后性能有所改善。融合因子是FPN中相邻两层特征融合时对更深层的加权系数。

通过分析FPN的工作原理,进一步探讨了产生这种现象的原因。我们发现,由于相邻层的融合操作,FPN确实是多任务学习。具体来说,如果在FPN中省略了自上而下连接,每一层只需要专注于检测高度相关的目标,如浅层学习小目标,深层学习大目标。而在FPN中,由于受到其他层的间接损失的监督,几乎每一层都需要学习所有大小的物体,即使是深层也需要学习小物体。对于微小目标检测,需要考虑两个事实。第一个就是小目标在数据集中占据优势,第二个是数据集不是很大。因此,每一层不仅需要关注其相应的尺度对象,还需要获得其他层的帮助,以获得更多的训练样本。融合因子控制这两种需求的优先级,然后得到两者的平衡。传统的FPN对应的融合因子为1,不适用于微小目标的检测。为此,我们首先从几个方面探讨了如何明确学习FPN中的有效融合因子,以提高FPN在微小目标检测中的性能。采用统计方法对特定数据集的融合因子有效值进行估计,该方法依赖于分布到每一层的目标数量。其次,我们从两个方面进一步分析了融合因子是否可以隐式学习。最后,说明了在梯度反向传播中设计用于微小目标检测的α的合理性。大量实验结果表明,FPN融合因子可以显著提高常用FPN在微小目标检测中的性能。我们工作的主要贡献包括:

  1. 我们提出了一种新的概念——融合因子来描述FPN中相邻层的耦合度。
  2. 分析了融合因子对微小目标检测性能的影响,并进一步研究了如何设计有效的融合因子来提高检测性能。此外,我们还提供了详细的数学解释。
  3. 结果表明,通过对FPN设置适当的融合因子,可以显著提高微小目标检测的性能。

图2:下基于不同融合因子在不同数据集上的性能。y轴表示当给定一个融合因子时,性能有所改善。TinyPerson和Tiny CityPersons的性能随融合因子的不同而波动,而CityPersons、PASCAL VOC和MS COCO的性能相对稳定。

2.相关工作

2.1 检测使用的数据集

为了应对目标检测中的各种挑战,已报道了许多数据集。MS COCO[17]、PASCAL VOC[9]和ImageNet[1]用于一般目标检测。IVIS[12]也用于一般的目标检测;然而,它在图像中有一个长尾类别。有一些数据集应用于特定的检测任务。[4, 8, 31, 7, 6, 10, 34]是用于行人检测任务的场景丰富且标注良好的数据集。WiderFace[32]主要用于人脸检测,TinyNet[24]涉及远距离的遥感目标检测,TinyPerson[33]用于微小人物检测,其平均绝对尺寸接近18像素。在本文中,我们重点研究了微小人物检测,并使用TinyPerson和tiny CityPersons进行实验比较。

2.2 小目标检测

在检测小物体方面也进行了广泛的研究。[33]提出尺度匹配,将预处理数据集的目标尺度对齐到目标数据集,以可靠地表示微小目标特征。SNIP[25]和SNIPER[26]使用比例正则化策略,保证不同分辨率图像的目标大小在固定范围内。狙击手采用区域采样的方法,进一步提高训练效率。超分辨率(SR)用于恢复低分辨率物体的信息;因此,将其引入到小目标检测中。EFPN[5]构造了一个具有更多几何细节的特征层,通过SR. Noh等人设计用于小目标。[22]提出了一种利用高分辨率目标特征作为监督信号,匹配输入的相关接受域和目标特征的特征级超分辨率方法。Chen等人提出了一种反馈驱动的数据提供者来平衡小目标检测的损失。TridentNet[14]构建了不同接收域的并行多分支,生成了更多的小目标特征,提高了性能。上述方法在一定程度上提高了小目标检测的性能。

2.3 目标检测中的特征融合

在深层网络中,浅层通常缺乏抽象的语义信息,而具有丰富的几何细节。相反,深层恰好与浅层相反。FPN[15]采用自顶向下的方式将深层和浅层特征合并,构建特征金字塔。PANet[19]提出了一种自下而上的方法,利用浅层细节特征来帮助深层目标识别。Kong[13]提出了全局注意和局部重构的方法,将高级语义特征与低级表示相结合,重构特征金字塔。MHN[2]是一个多分支的高级语义网络,旨在解决不同特征映射合并时的语义缺口问题。在解决语义不一致问题的过程中,该方法显著提高了小尺度目标检测的性能。Nie[21]引入特征浓缩方案生成多尺度上下文特征,HRNet[27]通过重复交叉并行卷积进行多尺度融合增强特征表达,Libra-RCNN[23]利用所有特征层的融合结果减少特征图之间的不平衡。ASFF[18]通过自适应机制对不同阶段的特征权重进行再融合预测。SEPC[30]提出了金字塔卷积来提高相邻特征层的特征融合效率。NasFPN[11]利用AutoML技术探索了各层特征融合的最优组合方式。Tan[28]在BiFPN中提出了特征融合的可学习权值。这些方法从不同的角度进一步提高了特征融合的效果。但是,它们都忽略了特征融合受数据集规模分布的影响。

3.有效融合因子

影响微小人物检测的两个主要因素是下采样因子和相邻特征层间的融合比例。以往的研究对前一个因素进行了探索,得出的结论是下采样因子越低,性能越好,尽管计算复杂度会增加。但是,后一项被忽略了。

FPN以以下方式聚合相邻的特征层:

其中finner为通道匹配的1 × 1卷积运算,fupsample为分辨率匹配的2×上采样运算,flayer通常为特征处理的卷积运算,α为融合因子。传统检测器将α设为1。图4右边的黑色虚线框显示了这个过程。在实际应用中,如果FPN融合P2、P3、P4、P5、P6级特征,则有三个不同的α,分别代表相邻两层之间的融合因子,分别为、和。(因为P6是P5直接下采样产生的,所以P5和P6之间不存在融合因子)。通过设置不同的α值,调整融合时不同层次特征的比例。下面将对融合因子进行深入的研究和分析。

3.1 是什么影响了融合因子效果

为了探索如何获得有效α,我们首先研究了影响融合因子有效性的因素。我们假设数据集的四个属性影响α: 1)物体的绝对大小;2) 物体的相对大小;3)数据集的数据量;4)FPN中各层目标的分布。

首先,我们通过实验来评估融合因子对不同数据集的影响。实验结果在图2,不同的数据集在不同的融合因子下呈现出不同的趋势,如曲线峰值。跨尺度数据集CityPersons、VOC和COCO对α的变化不敏感,只有当α= 0时,对应没有特征融合。而在TinyPerson和Tiny CityPersons上,随着α的增加,性能先上升后下降,说明融合因子是影响性能的关键因素,且存在一个最优值范围。由于TinyPerson、Tiny CityPersons和CityPersons的收敛困难,本文不进行大于1.1的融合因子。

TinyPerson和Tiny CityPersons的共同特点是实例的平均绝对大小小于20像素,这给网络学习带来了很大的挑战。因此,我们调整了CityPersons和COCO中的图像大小,以获得不同的数据集(CityPersons中的图像分别缩小2倍和4倍,COCO中的图像分别缩小4倍和8倍)。如图3所示,当物体的绝对尺寸减小时,表现随α的变化趋势与TinyPerson相似。对于Tiny CityPersons和CityPersons,数据量和目标的相对大小完全相同;然而,随着融合因子的增加,性能发生了不同的变化。

图3:下基于不同融合因子的Tiny CityPerson数据集分别上采样×1、×2和Cityperson的性能。

FPN中每一层目标的分布将决定训练样本是否充足,这直接影响到每一层的特征表示。CityPersons与TinyPerson和Tiny CityPersons具有相似的FPN分层。虽然Tiny CityPersons是通过CityPersons的4次降采样得到的,但是FPN中的CityPersons的分层仍然与Tiny CityPersons相似,因为Tiny CityPersons的锚也减少了4次。具体来说,大量的微小物体集中在P2和P3层中,导致FPN深层的物体数量不足。然而,城市人对融合因素的表现趋势与“TinyPerson”和“Tiny citypeople”不同。

图4:我们方法的框架。左边的虚线框显示了NP的计算,其中1和0分别为正样本和负样本。图片来自TinyPerson。红框和红点表示锚框和锚点。为了简化,只显示一个带有锚点的锚点。黄色框和蓝色框分别为p3和p4层的ground-truth。右边的虚线框是原始FPN的框架。我们可以用统计方法得到有效融合因子α。

图5:基于不同融合因子的在MS COCO不同输入尺寸下的性能,展示了物体绝对尺寸的影响。自适应RetinaNet使用P2, P3, P4, P5, P6构建FPN。

因此,我们的结论是,物体的绝对大小而不是其他三个因素确切地影响聚变因子的有效性。

因此,下文给出了融合因子工作的原因和方法。α通过梯度反向传播中重新加权损失,决定了FPN中深层参与浅层学习的程度。数据集中的对象体积很小,这给FPN的各个层的学习带来了很多困难。因此,每一层的学习能力是不够的,而深层没有额外的能力来帮助浅层。换句话说,FPN中各层学习难度增加,α降低时,深层和浅层之间的供求关系发生了变化,说明各层应该更加关注这一层的学习。

图6:自注意力结构的网络。

3.2 如何获得有效融合因子

为了进一步探索如何得到有效的融合因子,我们设计了4种α,并在TinyPerson上进行了实验:1)一个蛮力解决方案,根据图1枚举α。2)一种可学习的方式,其中α设置为一个可学习参数,并通过损失函数优化。3)一种基于注意力的方法,其中α是由自注意模块产生的,如图6所示。4)基于统计的解决方案,利用数据集的统计信息来计算α,计算方法如下:

其中,和分别表示FPN网络Pi+1和Pi层上的目标数。四种方法的定量实验见表1。据此,我们总结出几个结论。

首先,蛮力搜索探索最佳α。然而,它包含了冗余计算,这限制了大规模应用。其次,所有非固定α设置都优于基线,其中α设为1,基于注意力的方法增加了不可忽略的计算量。

第三,只基于数据的方法可以获得与强力搜索相同的性能。

表1。基于不同的融合因子计算策略,研究了在TinyPerson上的性能。基线中的α默认设置为1。1 -α和3 -α分别用1个和3个可学习参数表示。Atten -α通过注意力机制获得。α-bf表示最优蛮力解。S-α的性能是通过带有S-α的RetinalNet得到的。MR(Miss Rate)越低,性能越好。

基于统计的方法称为S-α,根据FPN中相邻层间目标数的比例设置α,如式2所示。目标数从整个数据集中计算。我们基于微小目标检测中,每一层都很难捕获具有代表性的特征来完成检测任务,从而加剧了层与层之间的竞争这一事实设计了该公式。更具体地说,不同头部的所有层都需要共享参数来学习对应的检测任务所需的适当特征。不幸的是,有些层的训练样本可能比其他层少得多,导致在更新共享参数时,这些层的梯度与其他层相比处于劣势。因此,当较小或较大时,该方法设置一个较小的α来减少Pi层中检测任务产生的梯度,反之亦然,从而促使网络平等地学习每一层的检测任务。从而提高了微小物体的学习效率。

NP和α的统计过程如下:1)以欠条为原则,在一幅图像中选择ground-truth为正的欠条最大的锚。2)根据正锚和预先设定的每层锚的数量,计算每层的ground-truth数。3)对数据集中的每张图像重复步骤1和步骤2得到统计结果,然后根据Eq. 2计算α,如图4左虚线框所示。计算过程不涉及网络的前端传播,因为锚点是预定义的,并且ground-truth是由数据集提供的。详情见Alg. 1。

3.3 融合因子可以隐式学习吗?

在第3.2节中,有效α是通过外显学习来探索的。我们在这部分进一步讨论了融合因子是否可以隐式学习。

首先,分析了FPN的结构,找到了融合因子的等效实现。在传统的FPN (α = 1)中,将finneri的参数乘以σi−2,并将flayerii的参数除以σi−2,相当于保持finneri、flayerii固定,并设置α = σ。因此,传统的FPN具有隐式学习有效α的潜在能力。我们进一步研究了如何通过调整finneri参数的初始化来激活这种能力。我们进行了不同初始化finneri和flayeri实验和他们对应的系数相乘。表明不同的幂σ (α = 1)2,如图8所示。如表2所示,该设置未能在基准之上提升性能。我们进一步进行实验:设α为σ,保持上述finneri和flayeri初始配置,性能与未定义finneri和flayeri初始化时的性能相似,如表2所示,说明该策略失败。

其次,神经网络的学习是数据驱动的,而且Tiny CityPersons和TinyPerson对不同的α是敏感的。他们有相似的数据量,但不够大。在这种对抗机制的驱动下,我们分析了大数据集是否能够推动FPN隐式学习融合因子。具体地,设置不同的融合因子,并探索何时可以抵消融合因子的影响。我们对COCO100进行了验证性实验。在图5中,α引起的峰值现象很明显。然而,COCO是一个长尾数据集(不同类别的样本是不平衡的)。例如,人超过COCO的四分之一,其他类别相对少得多。因此,我们进一步探讨了α对具有不同数据量的不同类别的影响。如图7所示,当类别为人时,由α引起的峰值现象大大减弱。(我们在实验中设σ=0.5)当训练数据集足够大时,该网络具有潜在的融合因子学习能力。即使在COCO中,大部分类别也不能满足要求,导致最终性能对融合因子很敏感。

表2:TinyPerson上σ-幂初始化检测结果

图7:在COCO100中有6587个时钟实例,268030个人实例和886284个实例。

图8:FPN的结构。

3.4 融合因子的数学解释

我们从梯度传播的角度讨论α的数学基础。在不考虑损耗一般性的前提下,以和C4为例,分析了FPN中融合因子对主干网参数优化的影响。C4层的梯度可以用式3表示,具体推导过程见附录:

其中losspi为与第i层相对应的分类和回归损失。

Eq. 3表示需要C4学习的任务有两种:深层物体检测(P4, P5)和浅层物体检测(P2, P3)。c4在应用较大的时,会学到更多用于浅层检测任务的信息,而丢失更多用于深层检测任务的信息,反之亦然。此外,深与浅是相对的。p4为p3的深层,P5为浅层。

对于较大的对象数据集,如COCO800,对象的信息非常丰富,甚至检测头也学习了很多高度相关的信息。如果我们放弃部分信息用于深层检测(应用小),最终性能几乎不会降低,如果我们保留它们(应用大),性能也不会有很大的提高。因此,的设置对这类数据集的敏感性较低。数据集目标越大,α设置越不敏感。换句话说,在较大范围内的性能基本相同。分析结果与图5一致。

对于微小目标数据集的检测,信息量较少,这决定了每一层可以学习到的信息量较少。因此,放弃任何信息都是危险的。因此,无论是深层还是浅层的检测任务都希望C4能够保留更多对他们有益的信息,即希望获得C4的梯度比更大。p2、p3的检测任务希望越大,P4、p5希望越小。最后,最优性能在于妥协值。偏离这个值越大,性能越差,因为它过于倾向于深层任务或浅层任务,更容易丢失另一个任务的重要信息。

表3:TinyPerson上MRS的比较。

表4。TinyPerson上AP的比较。

4.实验

实验设置:该代码基于Tinybenmark[33]。如果没有特别的语句,我们选择ImageNet上预先训练好的ResNet-50作为骨干,选择retinalnet作为检测器。初始学习率设为0.005,在第6阶和第10阶时分别降低10倍和100倍。锚定尺寸设置为(8,16,32,64,128),高宽比设置为(0.5,1.0,2)。由于TinyPerson中部分图像对象密集(大于200),我们选择对象少于200的图像进行训练和测试。在数据增强方面,我们的实验只采用了水平翻转。

评价标准:根据Tinybenmark[33],我们主要使用平均精度(Average Precision, AP)和缺失率(Miss Rate, MR)进行评估。AP是各种目标检测任务中广泛使用的指标,它反映了检测结果的查准率和查全率。由于TinyPerson是一个行人数据集,所以也使用MR作为评价标准。欠条的阈值分别设置为0.25,0.5和0.75。Tinybenmark[33]进一步将tiny[2,20]划分为3个子区间:tiny1[2,8], tiny2[8,12], tiny3[12,20]。在本文中,我们更多关注的是能否找到目标,而不是定位精度;因此,我们选择IoU = 0.5作为评价的主要阈值。

4.1在TinyPerson数据集上实验

TinyPerson中人物的平均绝对大小为18像素。TinyPerson中人物的长宽比变化很大。此外,人的多样性更加复杂,使得检测更加困难。TinyPerson分别包含794和816张用于训练和推理的图像。TinyPerson中的大多数图像都很大,导致GPU内存不足。因此,在训练和推理过程中,将原始图像分割成重叠的子图像。

4.1.1和其他SOTA检测器的比较

我们将所提出的S-α探测器的性能与TinyPerson[33]上的最新方法进行了比较。由于体积极小,SOTA探测器的性能明显下降,如表3和表4所示。使用P2、P3、P4、P5、p6构建FPN,并将锚的大小调整为[8、16、32、64、128]的FreeAnchor banking和RetinaNet†是改良版。改进后RetinalNet被用于后续的实验。正样本和负样本的不平衡在TinyPerson数据集非常严重。两级探测器的性能优于单级探测器。在不增加网络参数的情况下,添加S-α的快速RCNN的APtiny 50和MRtiny 50的性能分别提高了1.04%和0.28%。结果表明,基于FPN的改进对两级探测器是有益的。S-α视网膜网的性能优于SM/MSM[33]之外的其他探测器。SM/MSM需要通过COCO和TinyPerson的尺度匹配对COCO进行预训练,然后对TinyPerson进行微调,而具有S-α的RetinaNet仅基于ImageNet上的预训练模型。采用S-α的RetinaNet在不增加新的网络参数的情况下也能取得相当的性能。SM/MSM (SOTA方法)和S-α是互补的,见表4和表3。结合S-α的RetinaNet+SM获得了新的SOTA, APtiny 50和MRtiny 50比RetinaNet+SM分别提高了4.08%和1.87%。

4.1.2不同骨架网络的比较

表5所示:TinyPerson上具有不同骨干的目标检测结果。

用RetinaNet S-α处理APtiny 50的性能,如表5所示,用ResNet-50和ResNet-101处理APtiny 50的性能分别提高了1.78%和1%。与ResNet-50相比,ResNet-101在微小人检测方面没有更好的性能,这可能是由于其微小的绝对尺寸所致。在图像大小固定的情况下,微小目标主要分布在FPN的p2和p3,而深层的训练样本较少。ResNet-101相对于ResNet-50多出的51个区块位于ResNet的第4阶段,该阶段太深,无法帮助微小目标识别,但增加了计算负担。

4.2用其他小量数据集实验

表6所示。Tiny CityPersons目标检测结果。

表7。COCO100上的对象检测结果。

在Tiny CityPersons和COCO100上,以Resnet-50为骨干的S-α的RetinaNet也得到了改进,如表6和表7所示,bf代表了通过蛮力求解的最优解。结果表明,S-α的RetinaNet在其他小数据集上仍然有效,其效果与蛮力算法的最佳结果相同

 5.结论

本文从融合因子影响微小目标检测性能这一现象中得到启发,分析了融合因子影响性能的原因,并探讨了如何估计有效的融合因子,为微小目标检测提供最佳的积极影响。我们从FPN中梯度传播的角度对上述说法进行了进一步的数学解释。结果表明,通过调整FPN相邻层的融合因子,可以自适应地推动浅层集中学习微小目标,从而提高微小目标检测的效率。此外,通过配置不同的实验条件,包括不同的检测器、不同的骨干和不同的数据集,大量的实验证明了我们的方法的有效性。在未来,我们将扩展我们的方法到其他规模的数据集和其他困难的目标检测任务,如遮挡或截断。

Effective Fusion Factor in FPN for Tiny Object Detection的更多相关文章

  1. 『计算机视觉』FPN:feature pyramid networks for object detection

    对用卷积神经网络进行目标检测方法的一种改进,通过提取多尺度的特征信息进行融合,进而提高目标检测的精度,特别是在小物体检测上的精度.FPN是ResNet或DenseNet等通用特征提取网络的附加组件,可 ...

  2. Feature Pyramid Networks for Object Detection比较FPN、UNet、Conv-Deconv

    https://vitalab.github.io/deep-learning/2017/04/04/feature-pyramid-network.html Feature Pyramid Netw ...

  3. 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)

    论文源址:https://arxiv.org/abs/1612.03144 代码:https://github.com/jwyang/fpn.pytorch 摘要 特征金字塔是用于不同尺寸目标检测中的 ...

  4. 【Network Architecture】Feature Pyramid Networks for Object Detection(FPN)论文解析(转)

    目录 0. 前言 1. 博客一 2.. 博客二 0. 前言   这篇论文提出了一种新的特征融合方式来解决多尺度问题, 感觉挺有创新性的, 如果需要与其他网络进行拼接,还是需要再回到原文看一下细节.这里 ...

  5. 三维目标检测论文阅读:Deep Continuous Fusion for Multi-Sensor 3D Object Detection

    题目:Deep Continuous Fusion for Multi-Sensor 3D Object Detection 来自:Uber: Ming Liang Note: 没有代码,主要看思想吧 ...

  6. (转)Awesome Object Detection

    Awesome Object Detection 2018-08-10 09:30:40 This blog is copied from: https://github.com/amusi/awes ...

  7. 关于目标检测 Object detection

    NO1.目标检测 (分类+定位) 目标检测(Object Detection)是图像分类的延伸,除了分类任务,还要给定多个检测目标的坐标位置.      NO2.目标检测的发展 R-CNN是最早基于C ...

  8. Viola–Jones object detection framework--Rapid Object Detection using a Boosted Cascade of Simple Features中文翻译 及 matlab实现(见文末链接)

    ACCEPTED CONFERENCE ON COMPUTER VISION AND PATTERN RECOGNITION 2001 Rapid Object Detection using a B ...

  9. 深度学习笔记(十)Augmentation for small object detection(翻译)

    一. abstract 这些年来,目标检测取得了令人瞩目的成就.尽管改进很大,但对于小目标和大目标的检测性能差异还是蛮大的.我们在 MS COCO 数据集上分析了如今一个比较先进的算法,Mask-RC ...

随机推荐

  1. ThinkPHP5 Apache / IIs环境下 URL重写

    thinkPHP5新版本 隐藏index.php隐藏index.php 都写好了 public 隐藏 独立主机可以直接把根目录指向public下 虚拟主机可以把public下的index.php放到根 ...

  2. Jmeter和Postman做接口测试的区别,孰优孰劣?

    区别1:用例组织方式 不同的目录结构与组织方式代表不同工具的测试思想,学习一个测试工具应该首先了解其组织方式. Jmeter的组织方式相对比较扁平,它首先没有WorkSpace(工作空间)的概念,直接 ...

  3. JAVA8 lambda表达式权威教程!

    Java 8新特性----Stream流 jdk8是Java 语言开发的一个主要版本,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等等.今天就重点介 ...

  4. 如何解决 shell 脚本重复执行的问题

    在开发过程中,经常会使用shell脚本去完成定时备份的任务,普遍的做法是通过系统的定时任务定时执行备份脚本 设想这样一种场景,本次备份时间到了,自动执行备份脚本,如果备份比较耗时的话,会一直持续到下一 ...

  5. char值不能直接用作数组下标

    #include <stdio.h> //用 char 的值作为数组下标(例如,统计字符串中每个字符出现的次数),要考虑到 //char 可能是负数.有的人考虑到了,先强制转型为 unsi ...

  6. Jenkins 基础篇 - Server 配置

    我们使用 Jenkins 部署服务之前要先配置我们的目标服务器,配置目标服务器也很简单,就是将服务器的 IP.账号密码或者账号密钥配置在 Jenkins中.在演示服务器配置之前我们要先知道 Linux ...

  7. jekyll-admin的搭建和使用

    通过jekyll搭建好了自己的博客.写博客成为了日常,经过一段时间的摸索,发现jekyll-admin是个好东西,它是博客的后台管理系统,可以方便的管理和编写自己的博客 安装 运行命令gem inst ...

  8. JAVA基础——运算符号

    运算符(java) 算数运算符:+,-,*,/,%(取余),++,-- 赋值运算符:= 关系运算符:<, >, >= ,<= ,== , != 逻辑运算符:&& ...

  9. [bug] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    问题 原因不明,按参考文章中的做法,加了空格,clean后解决 参考 http://www.qishunwang.net/news_show_7922.aspx https://www.cnblogs ...

  10. 转圈 箭头 ⟳ 10227 27F3 刷新 HTML常用的特殊符号总结

    HTML常用的特殊符号总结 2014年9月12日 57621次浏览 html中经常会用到一些特殊符号,例如箭头,雪花,心形等等,这些符号就不用css样式或者图片来写了,直接用html特殊符号可以实现. ...