Abstract

针对目标检测边框选取和抑制问题,本文提出了一个可以替代NMS的新方法。该方法 Confluence 不依赖于边框的置信度得分来选取最佳边框,它也不需要 IOU 来去掉错误的候选框。它使用曼哈顿距离,在 cluster 内,选择距离其它所有边框最接近的边框,去掉高度融合的相邻边框。因此,Confluence 是一种新的边框选择与抑制方法,因为它的基础原理与NMS等方法本质上不一样。Confluence 在MS COCO 和 PASCAL VOC 2007 数据集上,通过 RetinaNet、YOLOv3 和 Mask R-CNN 进行了实验。使用的评价标准为 0.50:0.950.50:0.950.50:0.95,Confluence 的 mAP 和召回率都超过了 NMS。对于每个检测算法,mAP 都提升了 0.3−0.7%0.3-0.7\%0.3−0.7%,召回率提升了1.4−2.5%1.4-2.5\%1.4−2.5%。本文给出了 NMS 和 Confluence 的原理比较,大量的数据分析也支撑了其量化结果。而且,对于不同的 mAP 阈值,灵敏度分析实验也显示了 Confluence 要比 NMS 更鲁棒。

1. Introduction

计算机视觉领域的一个主要研究方向就是目标检测。它的应用场景非常广泛,如视频监控、自动驾驶和机器人、监控家畜和野生动物、图像视频分析等等。自从2009年 ImageNet 出现,深度学习目标检测器一直处于研究的前沿,取得了以前方法难以企及的准确率和召回率。

基于深度卷积神经网络的目标检测器包括 RetinaNet、Faster R-CNN 和 Mask R-CNN 输出不同大小和尺度的候选框。然后通过分类网络给每个候选框赋予类别置信度。通过候选框回归优化定位效果。它们大多会收敛到相同的区域 ROI,尤其是当目标检测器对某个物体非常自信。这会造成大量候选框在兴趣区域附近聚集,如图1所示。

YOLOv3 基于一个不同的模式。它没有使用不同大小和尺度的滑动窗,而是将图片划分为不同的区域,然后给每个区域分配类别置信度得分。低置信度的区域会被去掉,高置信度的区域会产生边框,然后通过NMS来选择最佳的边框。


图1. 上:RetinaNet 的输出结果。左下:Confluence 输出。右下:Greedy NMS 输出。Confluence 通过深度卷积网络返回一组兴趣区域的边框。它通过 confluence 选择优于极大值的边框。注意 NMS 返回的次优边框的置信度是 96.4%96.4\%96.4%(女人和男孩),而 Confluence 返回的两个最佳边框的置信度分别是85.9%85.9\%85.9%(女人)和88.2%88.2\%88.2%(男孩)。尽管它们的得分没那么高,但是它们都被找到了,它们都位于密集边框重叠的区域。也要注意到,Greedy NMS 抑制了一个正样本(女孩),因为它与男人的边框重叠了。然而,Confluence 找到了每个目标的边框。

然后 NMS 通过选取代表每个目标的最佳边框来优化检测结构,同时抑制 false positives。该过程中,正样本不会被去掉。图1展示了这一步的必要性。图中画出了 RetinaNet 的输出结果,NMS 之前与之后的输出。NMS 通常被认为是该问题最有效的解决方法,在 SOTA 目标检测器中经常使用,包括 RetinaNet-ResNet50、YOLOv3、Mask R-CNN、Faster R-CNN和 R-FCN。

2. Related Work

五十年来,NMS 在计算机视觉领域发挥重要作用,许多任务都依赖于 NMS,如目标检测、人脸识别、关键点检测和边缘检测。尽管 NMS 在单阶段和双阶段检测器中都发挥作用,但由于它依赖于硬编码、IOU阈值任意、置信度极大值得分,它的性能可能会有所降低。各种版本的 NMS 都尝试去满足现有的目标检测器。在人脸检测任务,通过 IOU 阈值,边框会被划分为 clusters。IOU 本质上是计算两个边框的重叠面积与并集面积的比值。然后通过 Cluster 内每个边框的平均坐标来选择最佳边框。该方法在 [19] 人体检测任务中做了调整,得到了我们心中熟知的 Greedy NMS。Greedy NMS 首先根据候选边框的置信度得分来排序,从最高到最低,提升其准确率。它选择最高置信度得分的边框,然后抑制高于某IOU阈值的其它所有边框。不断重复这个过程,直到候选框集合内是空的了。这个方法要优于其它的 NMS 变体,因为它的平均精度要更高。它至今仍是许多目标检测的常用办法。

但是,由于它依赖于 IOU 和置信度得分,Greedy NMS 也会遭遇其它 NMS 的问题。最近,随着基于深度卷积网络的目标检测器的出现,NMS 的问题就愈发暴露了。在高度遮挡区域,false positives 被保留了下来,而正样本被移除了,这阻碍了许多计算机视觉任务的发展,比如人群检测,也不利于计算机视觉应用在安全极其关键的领域,比如汽车的嵌入式摄像头中。

因此,研究人员致力于改进 NMS 的性能,提出各种替代方案。这些改进和替代方案一般可以分为聚类、空间共现、霍夫变换和端到端学习的方法。

A. ‘Soft’ NMS

Soft NMS 是 NMS 的改进版本,提升了其表现。它没有抑制高度重叠的边框,而是降低其置信度得分。与 Greedy NMS 相似,边框会根据置信度得分排序。然后选择最高置信度的边框(M)。与 Greedy NMS 不同,与 M 重叠的边框并不会马上被抑制,而是降低其置信度得分。[36] 则延续了该工作,引入了变动 variable voting。通过调整 M 的位置,定位置信度得到提升。给予置信度高、重叠度高的边框更高的权重。同样,与 M 的 IOU 较低的边框则会得到较低的权重。尽管该方法提升了 mAP,它仍然高度依赖于 IOU,需要额外的超参数来控制 variable voting。

B. Clustering 方法

Greedy NMS 的改进版本和替代版本都依赖于 IOU,将某兴趣区域附近的边框 clusters 融合起来。但是这些方法的提升都不一致,且都依赖于 IOU。[22] 提出了一个聚集方法,用于人体检测。高于某IOU阈值的边框会被融合起来,去除 false positives,这样一个目标只返回一个预测框。该过程会通过线性回归得到增强,每个目标的边框 cluster 会计算出一个得分。但是,该方法严重依赖 IOU和2D关键点标注信息,因此计算成本很高。相反,本文方法只处理目标检测器返回的信息,不依赖 IOU。

另一个与NMS不同,但也依赖IOU的方法就是[20]。基于信息传递,就是亲和传播聚类(APC),通过非监督聚类方法来计算两个边框之间的重叠度。APC 将同类别的候选边框根据它们的 IOU 进行分组。然后,它会选出每个 cluster 的代表,将该代表返回作为最终的检测结果。该方法在目标类别检测上表现不错,[23] 将其用于多类别检测。[23] 解决了大规模、多类别目标检测的问题。但是它主要作用在跨类边框,而非类内边框上。

它利用相似度方法聚类语义相似的目标,提升性能。再次,该方法依赖于 IOU。它解决的问题也不同,优化类别标签而非给定类别最佳边框的选择。

NMS 另一个替代方案就是 [38],它是累计而非抑制边框,提升其检测置信度。最高得分的边框会被融合起来,产生一个高置信度的边框。如果一个边框高度连贯,即它与其它边框的IOU很高,它的置信度得分也会增高。低置信度的边框与低连贯性的边框会被分成 false positives,然后去除掉。该方法据称要比 Greedy NMS 更鲁棒,但是它仍然依赖一个任意的 IOU 阈值,来选择最终的预测边框。这就降低了它对边框大小的鲁棒性,增加计算成本。

C. 空间共现

[24]和[25]都用到了共现来去除 false positives。使用语义和图像信息来选择最佳边框。[25]使用学习到的统计信息来表示空间-物体相互关系,基于目标在图像给定位置出现的概率来调节IOU阈值。这些方法都使用了 NMS,需要空间共现和上下文队列来增加或降低IOU阈值。该方法是对 NMS 的调整,而非替代。

该思想在[26]中被用于密集人群检测,基于人群密度估计来抑制边框。对于行人检测,[27]和[28]中也有相似的观点。相反,本文算法不依赖于图像信息或语义,无需人为调整来适应高遮挡环境。本文方法利用目标检测器返回的目标内边框的自然连贯性来解决遮挡问题。

D. 霍夫变换方法

另一些方法想要通过霍夫 voting 来绕过NMS。[29] 使用了一个基于霍夫 voting 的检测框架。[30] 解决了基于霍夫 voting 的 NMS 的缺陷,在行人检测设定中,通过一个概率框架绕过了多峰识别,据称提升了准确率。该方法也用在了 [31] 中,避免了过度依赖IOU阈值。但是,与 Greedy NMS 相比,这些方法的性能都不怎么样。本文方法没有依赖图像信息或标注信息。

E. 端到端学习

另一些方法如[10]和[32] 则在训练过程中集成了 NMS。[10] 提出了 GNet,该神经网络利用相邻边框间信息传递的概念,基于边框间的“谈判”来学习边框表示的变化,决定出哪个边框可以代表该目标。尽管该方法只用到了边框和得分作为输入,它仍然很复杂,需要大量的训练数据。相反,本文方法不需要任何训练,可以轻易地融入目前使用了NMS的系统中,无需结构上的变动。

[33] 也绕过了 NMS,基于图像内容的解码,产生一组稀疏的检测结果集合,声称召回率有提升,在遮挡问题上更加有效。但是,我们仍然需要额外的后处理,去除相邻预测边界上的 false positives。[34] 在行人检测中,也用到了一个基于学习的框架。该方法用到了一个决策点过程,结合预测得分来最优地选择检测结果。通过与其它检测结果的相似度来对检测建模。高得分、低概率的检测会作为最终的检测结果。[35] 中,NMS 的输出用于提升网络的训练。尽管这些方法在概念上要比其端到端的本质简单,避免了后处理过程,但是它们的表现仍与传统NMS方法相近。

F. NMS 攻击

最近的研究发现, NMS 面对 IOU 攻击时很脆弱。[21] 提出了一个对抗攻击的例子,造成 NMS 在端到端目标检测器中的绝对失效。它通过操纵边框重叠的维度,使得 NMS 无法过滤掉冗余的边框。该攻击造成平均精度降到了0,false positives 率升到了 99.9%99.9\%99.9%。这些攻击对于许多自动驾驶设备几乎是灭顶之灾,它们都依赖于 NMS。本文算法则对这类攻击免疫,因为根本不需要 IOU 或边框的大小。

3. 方法

作者称这个方法为 Confluence(合并)。该方法的名称来自于检测器输出的目标边框的合并。Confluence 没有将过多的候选框当作一个问题,而是将之视为找出最佳边框的钥匙。它会找出与其它边框融合程度最高的边框,即在 cluster 内,最能代表与其它边框共同重叠度的边框。

Confluence 是一个两阶段算法,保留最佳边框,去除 false positives。受接近度的启发,该方法通过置信度加权曼哈顿距离来保留最佳边框,从而评估边框的一致性。第二个阶段则会去除所有与保留边框相重叠的边框。

A. 曼哈顿距离

曼哈顿距离(MHMHMH)或者 L1L_1L1​ 范数是两个点在垂直和水平距离的和。u=(x1,y1)u=(x_1, y_1)u=(x1​,y1​)和v=(x2,y2)v=(x_2, y_2)v=(x2​,y2​) 的 MH 可以表示为:

MH(u,v)=∣(x1−x2)∣+∣(y1−y2)∣MH_{(u,v)} = |(x_1 - x_2)| + |(y_1 - y_2)|MH(u,v)​=∣(x1​−x2​)∣+∣(y1​−y2​)∣

它可以返回大量的高置信度检测结果,在图像兴趣区域周围形成具有一致性的边框 clusters。

作者提出两个边框之间的相似度PPP可以用左上角点u=(x1,y1),v=(x2,y2)u=(x_1,y_1), v=(x_2,y_2)u=(x1​,y1​),v=(x2​,y2​)和右下角点m=(p1,q1),n=(p2,q2)m=(p_1,q_1),n=(p_2,q_2)m=(p1​,q1​),n=(p2​,q2​)的 MH 的和来表示:

P(u,v,m,n)=MH(u,v)+MH(m,n)P_{(u,v,m,n)} = MH_{(u,v)} + MH_{(m,n)}P(u,v,m,n)​=MH(u,v)​+MH(m,n)​

图2展示了相似度距离。


P(u,v,m,n)=∣x1−p1∣+∣x2−p2∣+∣y1−q1∣+∣y2−q2∣P_{(u,v,m,n)} = |x_1-p_1| + |x_2-p_2|+|y_1-q_1| + |y_2-q_2|P(u,v,m,n)​=∣x1​−p1​∣+∣x2​−p2​∣+∣y1​−q1​∣+∣y2​−q2​∣

图2. 坐标为x1,y1,x2,y2x_1,y_1,x_2,y_2x1​,y1​,x2​,y2​的检测与p1,q1,p2,q2p_1,q_1,p_2,q_2p1​,q1​,p2​,q2​检测的相似度计算

P值小就表示高度重叠的边框,而P值大则表示不属于同一个目标,它们可能重叠,也可能不重叠。因此,如果要度量给定边框P与其它每个的边框,我们就要计算它与每个边框的相似度。如果重叠边框非常密集的话,该计算过程会有非常多的比较操作。

所以,如果在某边框附近有一个密集重叠的边框 cluster,则其 P 值会很低;反之,边框没有被重叠边框 cluster 包围,则会被列为 outlier。这为目标检测器对给定位置是否存在目标的置信度提供了一种度量。基于此,如果一个边框 b 的 cluster 内 P 值最低,则说明它是该目标置信度最高的检测结果。

本文方法解决了 NMS 及其替代方法的问题,比如得分最高的边框是次优的,而较低得分的边框反而是最优的,NMS 会返回次优的边框,如图1所示。然而,P 度量对于那些和其它边框重叠最多的边框更有利,使之更鲁棒。

B. 归一化

前文叙述的方法对于相似大小的边框很有效。但是实际中,物体及对应边框的大小是不同的。这就给通过一个置信度加权P来决定边框保留或去除带来了问题。因为在去除大的 false positives 和保留小的正样本之间应该平衡。

为了解决该问题,本文使用了一个归一化算法,将边框坐标缩放到0和1之间,而保留它们彼此间的关联。该算法将每个坐标(xi,yi)(x_i,y_i)(xi​,yi​)变换为:

X={x1,x2,p1,p2}X=\{x_1,x_2,p_1,p_2\}X={x1​,x2​,p1​,p2​}
Y={y1,y2,q1,q2}Y=\{y_1,y_2,q_1,q_2\}Y={y1​,y2​,q1​,q2​}

norm(xi,yi)=(xi−min⁡(X)max⁡(X)−min⁡(X),yi−min⁡(Y)max⁡(Y)−min⁡(Y))norm(x_i,y_i) = (\frac{x_i - \min(X)}{\max(X)-\min(X)}, \frac{y_i - \min(Y)}{\max(Y)-\min(Y)})norm(xi​,yi​)=(max(X)−min(X)xi​−min(X)​,max(Y)−min(Y)yi​−min(Y)​)

归一化操作使得目标内和目标间的边框可以比较,任意两个大的目标内边框可以和任意两个小的目标间边框比较,如图3所示。

图3中,两个大边框表示同一个物体。而两个小边框则是两个不同的物体。但是,当我们计算 P 的时候,会得到相同的值。

这给相同目标或不同目标的边框区分就带来个问题。归一化就可以解决这个问题,保留边框间的重叠关系,确保任意两个边框间的关系可以被比较。例如,在对图3中的每对边框应用等式3,同属于大的目标内边框的坐标就可以由u(10,2),v(20,10),m(9,3),n(19,11)u(10,2),v(20,10),m(9,3),n(19,11)u(10,2),v(20,10),m(9,3),n(19,11)变换为u(0.091,0),v(1,0.889),m(0,0.111),n(0.909,1)u(0.091,0),v(1,0.889),m(0,0.111),n(0.909,1)u(0.091,0),v(1,0.889),m(0,0.111),n(0.909,1)。当使用等式2时,它返回的结果为0.404。同样地,同属于小的目标间的边框可以通过归一化来做变换,从a(2,4),b(3,6),c(3,5),d(4,7)a(2,4),b(3,6),c(3,5),d(4,7)a(2,4),b(3,6),c(3,5),d(4,7) 变换为a(0,0),b(0.5,0.667),c(0.5,0.333),d(1,1)a(0,0),b(0.5,0.667),c(0.5,0.333),d(1,1)a(0,0),b(0.5,0.667),c(0.5,0.333),d(1,1)。使用等式2,返回值为1.666。因此,归一化使得目标内和目标间的边框可以区分开来。

C. Intra-cluster retention and removal

因为所有的坐标对都被归一到了0和1之间,任意两个相交的边框之间的近似度都小于2。因此,如果任意2个边框的 P 值小于2,我们就可假设它们属于同一个 cluster,指向同一个目标或多个高密度目标。一旦 clusters 找到了,通过升序排列 P 值,就可找到最佳的 intra-cluster 边框。选取第nnn个位置上,近似度最小的边框作为最重叠的边框,将其保留。

对 P 值 intra-cluster 的梯度做分析后,我们就可选择最重叠的边框。对 P 值做可视化,就可以看到目标内和目标间边框的差异,因为 cluster 会呈现出blob的样子,如图4、5所示。每个水平的 blob 表示一个物体。Confluence 会选择给定 blob 内最能代表其它边框的边框。它在一定的数值范围内选择边框,该数值范围的梯度趋近0。在高密度的图上,该关系很清晰,不同的物体会用不同的blob表示。

当最重叠的边框被选中后,所有近似度低于某阈值的 intra-cluster 边框就会被去除。不断地重复该过程,直到所有的边框都处理完。

D. 置信度得分加权

NMS 使用目标检测器返回的单个置信度得分作为最优边框选取的手段。但是,Confluence 既考虑置信度得分 ccc,也会考虑它与相邻边框的 P 值,来评估给定边框b是否最优。将 b 的 P 值除以它的置信度得分,就可以得到加权近似度 WP:

WP(u,v,m,n)=P(u,v,m,n)cWP_{(u,v,m,n)} = \frac{P_{(u,v,m,n)}}{c}WP(u,v,m,n)​=cP(u,v,m,n)​​

因为ccc的值位于0.05和1之间,这就有利于高置信度的边框,人为地降低 WP 的值(注意,不会考虑那些置信度低于0.05的边框)。相反,低置信度边框的WP值会更大。这就增加了高置信度边框被选中的可能,因为WP值越小,越有可能被选中。

该算法基于一个原则,一个强大的分类器可以通过一组弱分类器的和构建。每个单独的WP值都是一个弱分类器,但把它们组合起来,我们就可以得到一个强大的边框分类工具,边框要么是高置信度的,通过较高的重叠度判别;要么是低置信度的,通过边框与其它边框的疏远距离判别。本质上,这提供了一个目标检测器置信度的投票机制,到底哪个边框能最好地代表其它的边框。表1的结果表明,这是一个可靠的方式,准确地识别正样本,而降低 false positives,从而达到最佳的 mAP 和召回率。

E. 实现

用 Python 实现了 Confluence 算法。算法1 列出了其伪代码。代码在Github上有提供。Confluence 的主要步骤如下:

  1. 算法1,第一行:变量 BF,SF,CFB_F,S_F,C_FBF​,SF​,CF​用于储存边框、对应置信度和标签,会被返回并画在图像上。
  2. 算法1,第二行:算法依次遍历每个类别,这样可以处理多类别目标检测。对于每个类别,它会选取nnn个边框,每个代表一个物体。
  3. 算法1,第四行:变量bs,ssb_s,s_sbs​,ss​用于暂时储存边框和它们的对应得分,该类最优的边框会被选中。
  4. 算法1,第五行:变量optimalConfluenceoptimalConfluenceoptimalConfluence被初始化为图像的大小。
  5. 算法1,第六行到第十八行:算法然后遍历所有的边框bib_ibi​,将每个边框和集合BBB里其它的边框做比较。
  6. 算法1,第九行到第十行:坐标间的关系被归一化,然后是近似度计算。
  7. 算法1,第十一行:如前所述,如果近似度计算结果小于2,边框就是分离的,会被看作为不同的物体。该条件限制了bib_ibi​的 P 的值要小于2。
  8. 算法1,第十二到十六行:收敛到最小置信度加权 confluence 值上,就可选出最佳的边框。
  9. 算法1,第十九行到二十行:一旦最佳边框选中,它就会加入到BFB_FBF​集合,作为检测结果返回,以及它们的类别和置信度分数,然后从B,SB,SB,S中移除。
  10. 算法1,第二十一行到二十四行:随后,BBB中所有与最佳边框的近似度小于MDM_DMD​的边框,都会被移除。
  11. 步骤3-10 会递归地进行,直到所有的边框被处理完毕。

Confluence 的计算复杂度是O(N)O(N)O(N),其中NNN是输入边框的集合大小。这是因为归一化近似度得分的计算。由于每个边框都要计算它和其它边框的近似度,Confluence 的整体算法复杂度就是O(N2)O(N^2)O(N2),这和Greedy NMS相同。由于递归会带来边框集合变小,计算时间就不明显了。

Confluence: A Robust Non-IoU Alternative toNon-Maxima Suppression in Object Detection 论文学习相关推荐

  1. Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记

    1 摘要 传统的基于文本行的文档去扭曲方法在处理复杂布局和/或非常少的文本行时会出现问题.当图像中没有对齐的文本行时,这通常意味着照片.图形和/或表格占据了输入的大部分.因此,对于健壮的文档去扭曲变形 ...

  2. Robust and Efficient Quadrotor Trajectory Generation for Fast Autonomous Flight (论文学习)

    快速自主飞行中鲁棒高效的四旋翼轨迹生成 摘要 在本文中,我们提出了一种有效且鲁棒的3D环境中的四旋翼运功规划系统.我们在离散化的控制空间中,采用动态路径搜索方法寻找安全,动态可行,时间最短的初始轨迹. ...

  3. Class-Aware Robust Adversarial Training for Object Detection论文阅读笔记

    针对目标检测的类感知对抗训练 2021年的CVPR,哥伦比亚大学和中心研究院合作的工作. 摘要:    目的通过对抗训练增强目标检测的鲁棒性,对于一张给定的图像,本文提出的方法产生一个通用的对抗性攻击 ...

  4. 对比学习系列论文SimROD(二): A Simple Adaptation Method for Robust Object Detection

    0.Abstract 0.1逐句翻译 This paper presents a Simple and effective unsupervised adaptation method for Rob ...

  5. LiDAR Snowfall Simulation for Robust 3D Object Detection

    LiDAR Snowfall Simulation for Robust 3D Object Detection 物理模拟的创新(关注)点: 考虑激光束反射受到角度遮挡的影响 考虑雪天的路面反射影响 ...

  6. 点云 3D 天气数据增强 - LiDAR Snowfall Simulation for Robust 3D Object Detection (CVPR 2022)

    点云 3D 天气数据增强 - LiDAR Snowfall Simulation for Robust 3D Object Detection - 用于鲁棒3D目标检测的激光雷达降雪模拟(CVPR 2 ...

  7. Object Detection中的IOU

    重叠度(IOU,intersection over union,边框的交集): 目标检测是定位出待检测目标的边界框bounding box,就像图片中一样,不仅需要定位出车辆的边界框bounding ...

  8. 目标识别(object detection)中的 IoU(Intersection over Union)

    首先直观上来看 IoU 的计算公式: 由上述图示可知,IoU 的计算综合考虑了交集和并集,如何使得 IoU 最大,需要满足,更大的重叠区域,更小的不重叠的区域. 两个矩形窗格分别表示: 左上点.右下点 ...

  9. RCNN系列论文学习:RCNN、FastRCNN、FaterRCNN、MaskRCNN(包含IOU、NMS介绍)

    最近在看图像分割方面的东西,发现MaskRCNN里面有好多东西不是很理解,于是就打算简单梳理一下.找了很多博客,还有视频.这里简单记录一下. RCNN RCNN的英文是 Region based CN ...

最新文章

  1. 使用WC“.NET研究”F实现SOA面向服务编程——简单的WCF开发实例
  2. python 笔记:argparse
  3. 【Linux】gcc和g++的区别
  4. 数据结构与算法之KMP算法
  5. MySQL中concat函数(连接字符串)
  6. java如何取到配置文件中值,从配置文件中获取配置信息的几种方法
  7. android 代码循环,Android – 每5秒循环一部分代码
  8. mysql存储过程详解实例
  9. java cmyk和rgb的转换_如何在ColdFusion(Java)中在CMYK和RGB之间转换图像?
  10. 任务管理器已被管理员停用 解决方法
  11. MacBook 安装固态硬盘
  12. c 语言len函数,巧妙利用LEN、SUBSTITUTE函数,计算EXCEL单元格内某重复字符个数
  13. python + 余 +=加号与 加等的区别
  14. CF卡转模式(本地)
  15. android百度天气预报接口,用百度天气接口的实现安卓天气预报(json数据)
  16. 报表工具和BI商业智能的区别,你真的弄清楚了吗?
  17. 【NetTopologySuite类库】NTS与JTS一些问题整理
  18. java毕业生设计养老机构服务信息管理计算机源码+系统+mysql+调试部署+lw
  19. android录制语音,Android语音录制的代码
  20. 桌面管理,Windows自带工具!很强!

热门文章

  1. 北京联合大学计算机科学与技术分数线,北京联合大学录取分数线2021是多少分(附历年录取分数线)...
  2. 2021年塔式起重机司机考试及塔式起重机司机复审考试
  3. [转]Git详解之四 服务器上的Git
  4. SpringBoot物流管理项目,拿去学习吧(源码)
  5. [F2F] Java基础 (JDK特性/集合/IO/锁)
  6. 6、GitHub 操作
  7. 微信浏览器页面默认背景色的问题
  8. 活动策划书用什么计算机软件,各行业主流设计软件有哪些?(设计人员请进)...
  9. JVM_12 垃圾回收3-垃圾回收器
  10. 小白学习老九君C++笔记(10) 使用类创建对象