VIBE:一种通用的视频帧序列背景去除算法
论文:ViBe: A universal background subtraction algorithm for video sequences
作者:Olivier Barnich and Marc Van Droogenbroeck

摘要—本文介绍了一种结合了多种创新机制的运动检测技术。例如,我们提出的技术为每个像素存储一组过去在同一位置及其邻居位置的值。然后将这个集合中的像素值与当前像素值进行比较,以确定该像素是否属于背景,并通过随机选择从背景模型中替换哪些值来适应模型。这种方法不同于以往经典方法即首先替换最旧值。最后,当发现某个像素是背景的一部分时,它的值会被传播到相邻像素的背景模型中。

我们详细描述了我们的方法(包括伪代码和使用的参数值),并将其与其他背景减除技术进行比较。数据有效表明,我们的方法在计算速度和检测率方面都优于最近和经过验证的最先进的方法。我们还分析了我们算法的缩小版本的性能,以绝对最小值进行一次比较和每像素一个字节的内存。看起来即使我们算法的这种简化版本也比主流技术表现更好。 http://www.motiondetection.org 提供了 ViBe 的实现。

一、简介

在过去十年中,全球正在使用的相机数量急剧增加。这种增长导致了数据的大量增加,意味着数据无法存储或手动处理。为了在视频中自动检测、分割和跟踪对象,有以下几种可能的方法。简单的运动检测算法将视频场景的当前帧与静态背景帧逐个像素地进行比较。这是背景减除的基本原理,可以将其表述为一种构建背景模型,并将当前帧与该模型进行比较以检测具有显着差异区域的技术。因此,背景减除算法的目的是将移动对象(以下称为前景)与静态场景或缓慢移动的区域(称为背景)区分开来。然而,当静态对象开始移动,背景去除算法检测运动对象的同时会在背景中留下运动对象的空洞(称为鬼影)。显然,鬼影与运动无关,必须丢弃。背景的另一种定义是它对应于一个像素值大部分时间可见的参考框架,即该像素值出现概率最高,但这种框架在实践中并不直接使用。

虽然静态背景模型可能适用于在受限的室内环境中分析短视频序列,但该模型在大多数实际情况下是无效的; 因此需要一个更复杂的模型。 此外,运动检测通常只是理解场景过程的第一步。 例如,在检测无人看管的行李、步态识别、面部检测、人数统计、交通监控等方面,检测到的运动区域可能会被过滤和表征。场景背景和应用程序的多样性解释了为什么无数论文讨论与背景减除相关的问题。

在本文中,我们提出了一种通用的背景减除方法。该方法已在 [1] 和专利 [2] 中进行了简要描述。在第二节中,我们广泛回顾了背景减除算法的文献。本综述介绍了背景减除的主要框架,并突出了它们各自的优势。我们已经实现了其中一些算法,以便将它们与我们的方法进行比较。第三节描述了我们的技术并详细介绍了我们的主要创新:背景模型、初始化过程和更新机制。第四部分讨论了实验结果,包括与其他最先进算法和计算性能的比较。我们还提出了我们算法的简化版本,它只需要一个比较和一个像素的内存字节;这是任何背景减除技术在比较和内存占用方面的绝对最小值。我们表明,即使在其简化形式中,我们的算法也比更复杂的技术表现更好。第五节总结了论文。

二、背景减除算法综述

文献综述,略 。

本文针对背景中新的或逐渐消失的对象提出一种不需要明确考虑该问题的处理方法。除了速度更快之外,我们的方法还表现出有趣的不对称性,因为与停止移动的对象相比,鬼影(在静态对象开始移动时发现的背景区域)添加到背景模型的速度更快。本文的另一个主要贡献时提出一种更新策略。基本思想是从过去的视频帧中收集样本并通过忽略它们何时添加到模型来更新样本值。该策略确保像素模型的样本值具有平滑的指数衰减寿命,并允许我们的技术使用每个像素合理大小的独特模型来处理以各种速度演变的伴随事件。

三、一种通用的背景减除技术

为了在实际应用中取得成功,背景减除技术必须至少处理三个因素:(1)什么是模型以及它如何起作用?(2)模型是如何初始化的?以及(3)模型是如何随时间更新的?这些问题的答案在本节的三个小节中给出。大多数论文描述了固有模型和更新机制,只有少数论文讨论了初始化,这在需要快速响应时至关重要,例如在数码相机内部。此外,模型和更新机制之间往往缺乏一致性。例如,一些技术将像素p的当前值与具有给定tolerance—T的模型b的当前值进行比较。如果p和b之间的绝对差小于T,则他们认为存在良好匹配。为了随时间自适应,T根据p的统计方差进行调整。因此,调整速度取决于采集帧率和背景像素数。这在某些情况下是不合适的,例如帧速率由可用带宽决定的远程IP摄像机。我们在下面详细介绍了一种称为“ViBe”(用于“VIsual BackgroundExtractor”)的背景减除技术。为方便起见,我们在附录 A 中用类似C的代码展示了我们算法的完整版本。

A.像素模型和分类过程

在某种程度上,对于给定的颜色空间,无法确定每个背景像素的概率密度函数 (pdf) 或至少确定统计参数,例如均值或方差。请注意,对于高斯模型,没有区别,因为均值和方差足以确定pdf。虽然背景减法的经典方法和大多数主流技术依赖于pdf或统计参数,但它们的统计显著性问题很少被讨论。事实上,只要达到达到相关背景分割的目标,就没有必要计算pdf。另一种方法是考虑随着时间的推移应该增强统计显着性,一种方式是利用真实观测到的像素值建立模型。潜在的假设是,从随机的角度来看这更有意义,因为与尚未遇到的值相比,已经观察到的值再次被观察到的概率应该更高。

与[65]的作者一样,我们不为pdf选择特定形式,因为与假设的pdf模型的偏差无处不在。 此外,pdf的评估是一个全局过程,pdf的形状对异常值很敏感。此外,pdf的估计提出了一个不明显的问题,即要考虑的样本数量;选择具有代表性数量的样本的问题是所有估计过程的固有问题。

如果我们将背景减除问题视为分类问题,我们希望根据所选颜色空间中的相邻像素对新像素值进行分类,以避免任何异常值的影响。这促使我们使用一组样本而不是显式像素模型对每个背景像素进行建模。因此,不执行背景像素的pdf估计,而是将像素的当前值与其在样本集合中最接近的样本进行比较。与现有算法相比,尤其是与基于共识的技术相比,这是一个重要的区别。新值与背景样本进行比较,并且应该接近某些样本值而不是所有值的大部分。其基本思想是,与大量样本相比,使用少量邻居像素值来估计背景像素的统计分布更可靠。这有点类似于忽略pdf的四肢,或通过阈值处理只考虑基础pdf的中心部分。另一方面,如果人们信任模型的值,则仔细选择背景像素样本至关重要。因此,背景中像素的分类需要保守,因为只有背景像素应该填充背景模型。

使用v(x)表示欧式空间中位于x处的像素值,vi表示该像素的第i个背景采样像素值。每个背景像素x的背景模型通过上一帧获取的N个背景样本值进行建模。即:

当前我们先忽略时间上的概念,后续再进行讨论。

将像素值与二维欧几里得颜色空间 (C 1 , C 2 ) 中的一组样本进行比较。 为了对 v(x) 进行分类,我们计算与以 v(x) 为中心的半径为 R 的球面相交的 M(x) 的样本数。

对于图像中的某个像素值v(x),为了利用该像素的背景模型对其进行分类(是背景还是运动目标),我们与该像素临近的一个采样球体空间S_R (v(x))中的像素值进行比较,该采样空间以v(x)为中心,阈值R为半径。如果该球体中的采样值与v(x)背景模型中的像素值交集的个数大于或等于给定阈值#min,则像素值v(x)被归类为背景。更确切的说,我们将#min与下式的结果进行比较:

根据等式 2,像素值 v(x) 的分类涉及计算 v(x) 和N个模型样本之间的欧式距离,以及这N个距离与阈值R的比较。此过程如图 1 所示。注意 因为我们只对找到几个匹配感兴趣,一旦找到 ♯ min 匹配,就可以停止像素的分割过程。

很容易看出,我们模型的准确性仅由两个参数决定:球体的半径 R 和最小基数 ♯ min 。 实验表明,唯一半径 R 为 20(对于单色图像,单色图像中每个像素点仅占一位,其值只有0或1,0 代表黑1代表白或相反。因为图像中的每个像素仅需1位信息,常把单色图像称为是1位图像 。单色图像具有比较简单,一般由黑色区域和白色区域组成。)和基数为 2 是合适的(有关参数值的详细讨论,请参阅第 IV-A 部分)。 在背景减法过程中无需调整这些参数,也无需针对图像内的不同像素位置更改它们。 请注意,由于选择的样本数N ♯ min是固定的,并且由于它们影响同一决策,因此可以使用以下比率 ♯min/N 调整模型的灵敏度,但在我们所有的比较测试中,我们采用了同一个值。 到目前为止,我们已经详细介绍了模型的性质。 在接下来的部分中,我们将解释如何从单个帧初始化模型以及如何随时间更新它。

B. 单帧背景模型初始化

文献中描述的许多流行技术,如 [53]、[62] 和 [65],需要几十个帧的序列来初始化它们的模型。从统计的角度来看,这种方法是有意义的,因为为了估计背景像素的时间分布似乎必须收集大量数据。但是人们可能希望分割比某些背景减法算法所需的典型初始化序列更短的序列的前景。此外,许多应用程序需要能够提供不间断的前景检测,即使存在突然的光线变化,算法的定期更新机制无法正确处理这种情况。这两个问题的一个可能解决方案是提供一个特定的模型更新过程,将像素模型调整到新的光照条件。但是这种专用更新过程的使用充其量是微妙的,因为突然的照明可能会完全改变背景的色彩特性。

更方便的解决方案是提供一种技术,可以从单个帧初始化背景模型。有了这样的技术,对突然的光照变化的响应很简单:现有的背景模型被丢弃,新模型立即初始化。此外,能够早在序列的第二帧时提供可靠的前景分割对于视频监控中的短序列或嵌入运动检测算法的设备具有明显的好处。

随机选取每个像素的8邻域像素值填充每个像素的空间背景模型。
由于在单个帧中没有时间信息,我们使用与 [66]的作者相同的假设,即相邻像素共享相似的时间分布。这证明了我们使用在每个像素的空间邻域中找到的值填充像素模型的事实。更准确地说,我们使用第一帧中在每个像素值邻域中随机取的值填充它们。需要选择邻域的大小以便于其足够大来包含足够数量的不同样本,同时记住不同位置的值之间的统计相关性随着邻域大小的增加而降低。从我们的实验中,在每个像素的8连通邻域中随机选择样本已证明对于640×480像素的图像是令人满意的。

我们假设第一帧的索引时t=0,且NG(x)是像素位置x的空间邻域。则:

其中,其中位置y是根据统一规律随机选择的。请注意,给定的 v 0 (y) 可能被多次选择(例如,如果邻域的大小小于 M0 (x) 的基数)或根本不被选择。 然而,如果人们承认邻域中的值是优秀的样本候选者,这不是问题。
即还是在8领域中随机选择20次,每一次各个像素值被选中的概率是相等的。

这一策略已被证明是成功的。唯一的缺点是第一帧中移动物体的存在会引入通常称为鬼影的伪影。根据[24],鬼影是“一组连接点,被检测为运动但不对应于任何真实的运动物体”。 在这种特殊情况下,重影是由像素模型的不幸初始化引起的,样本来自移动对象。 在随后的帧中,对象移动并揭示真实背景,这将通过常规模型更新过程逐步学习,使鬼影随着时间的推移逐渐消失。 幸运的是,如第 IV-C 节所示,我们的更新过程确保了在存在鬼影的情况下模型的快速恢复以及将真实移动的物体缓慢地合并到背景模型中。

C. 随着时间的推移更新背景模型

在本节中,我们将描述如何使用每个新帧不断更新背景模型。 如果我们想随着时间的推移获得准确的结果,这是至关重要的一步:更新过程必须能够适应光照变化并处理场景中出现的新对象。

关于更新机制的一般讨论:我们算法的分类步骤将当前像素值v^t (x)直接与前一帧的背景模型中包含的样本进行比较,M^(t-1) (x)为在t-1时刻、位置x处像素的背景模型。因此,关于背景模型必须记忆哪些样本以及记忆多长时间的问题至关重要。正如文献中经常提到的那样,人们可以将模型视为背景记忆或背景历史。 更新背景历史的经典方法是在若干帧或给定时间(通常大约几秒钟)之后丢弃和替换旧值; 最旧的值被新的值取代。 尽管背后有其基本原理,但这种替换原则并不那么明显,因为如果有效值对应于背景值,则没有理由删除它。
模型中包含或不包含前景像素值的问题是基于样本的背景减除方法中老生常谈的问题;否则模型将无法适应不断变化的条件,对应于保守更新方案和盲更新方案之间的选择。 请注意,基于内核的 pdf 估计技术具有更柔和的更新方法,该方法可以通过在包含前景像素值之前给定一个权重来平滑新的像素值。

像素样本只有被分类为背景样本时,才能被包含在背景模型中,而前景点永远不能被用于填充背景模型。乍一看,这样的政策似乎是显而易见的选择。该方法保证了对移动对象的精确检测,前提是它们与背景颜色不相似。缺点是会导致死锁情况和Ghost。不幸的是,许多实际场景会导致这种情况。
盲更新对死锁不敏感:无论是否将样本归类为背景,都会将样本添加到背景模型中。 这种方法的主要缺点是对缓慢移动目标的检测效果不佳,这些目标逐渐包含在背景模型中。 一个可能的解决方案包括使用大尺寸的像素模型,它涵盖了很长的时间窗口。 但这是以增加内存使用和更高的计算成本为代价的。 此外,使用先进先出模型更新策略(例如 [53] 或 [65] 中采用的那些),300 个样本覆盖仅 10 秒(每秒 30 帧)的时间窗口。 被缓慢移动的物体覆盖超过 10 秒的像素仍将包含在背景模型中。

严格来说,当背景被屏蔽时,时间信息是不可用的。 但是背景减法是一个时空过程。 为了改进该技术,我们可以假设,正如我们在第 III-B 节中提出的那样,相邻像素预计具有相似的时间分布。根据这个假设,因此最好的策略是采用保守的更新方案并利用空间信息,以便将有关背景演变的信息注入到被前景局部掩盖的背景像素模型中。 这个过程在修复中很常见,其中对象被移除并在邻域中取值来填充孔 [67]。 在第 III-C4 节中,我们提供了一种简单而有效的利用空间信息的方法,这使我们能够克服纯粹保守更新方案的大多数缺点。

我们的更新方法包含三个重要组成部分:
(1)无记忆更新策略,确保存储在背景像素模型中的样本的寿命平滑衰减
每次确定需要更新像素点的背景模型时,以新的像素值随机取代该像素点样本集的一个样本值。
(2)随机时间子采样以扩展背景像素模型覆盖的时间窗口
并不是每处理一帧数据,都需要更新处理,而是按一定的更新率更新背景模型。当一个像素点被判定为背景时,它有1/rate的概率更新背景模型。rate是时间采样因子,一般取值为16。
(3)空间邻域更新策略
针对需要更新像素点,随机的选择一个该像素点邻域的背景模型,以新的像素点更新被选中的背景模型。

—>无记忆更新策略:许多基于样本的方法使用先进先出策略来更新它们的模型。 为了妥善处理场景背景中的大范围事件,Wang 等人。 [65] 建议在像素模型中包含大量样本。 但如前所述,这对于高帧率可能仍然不够。 其他作者 [53]、[58] 结合了两个时间子模型来处理快速和慢速修改。 这种方法被证明是有效的。 然而,它增加了参数化问题,因为为了实现实际实现需要确定更多的参数值。
从理论的角度来看,我们认为确保样本值留在样本集合内的概率单调衰减更合适。 像素模型应该包含像素最近过去的样本,但不一定要丢弃较旧的样本。
我们提出了一种为样本的剩余寿命提供指数单调衰减的方法。 该方法通过允许一些旧样本保留在像素模型中来提高估计的时间相关性。 请记住,此方法与保守的更新策略相结合,因此模型中不应包含前景值。

如图 2 所示,该技术简单但有效:我们不是从像素模型中系统地删除最旧的样本,而是根据统一的概率密度函数随机选择要丢弃的样本。
然后新值替换选定的样本。这种随机策略与应该首先替换旧值的想法相矛盾,这对于保守的更新策略而言并非如此。 为了过程的稳定性,还需要一个保守的更新策略。 事实上,随机更新策略产生了一个非确定性的背景减法算法(据我们所知,这是第一个具有该属性的背景减法算法)。 只有保守的更新策略才能确保模型不会随着时间的推移而发散。 尽管如此,我们的背景减法算法在不同时间处理的同一序列的结果之间可能存在细微的差异,在我们的经验中是察觉不到的。
从数学上讲,在更新像素模型后保留时间 t 时模型中存在的样本的概率由 N-1/N 给出。 假设时间连续性和选择过程中没有记忆,我们可以得出类似的概率,在下文中表示为 P(t,t +dt),对于任何进一步的时间 t + dt。 这个概率等于

该表达式表明模型的任何样本值的预期剩余寿命呈指数衰减。 假设样本在时间 t 之前包含在模型中,则样本在区间 (t, t + dt) 内保留的概率似乎与 t 无关。 换句话说,过去对未来没有影响。 这个特性称为无记忆特性,已知适用于指数密度(见 [68])。 据我们所知,这是背景减法领域的一个显着且独特的特性。 它让我们完全自由地定义一个时间段来将样本保留在像素的历史记录中,并且在某种程度上允许更新机制适应任意帧速率。

**—>时间子采样:**我们已经展示了如何使用随机替换策略使我们的像素模型能够以有限数量的样本覆盖大的(理论上无限的)时间窗口。为了进一步扩展固定大小的像素模型所覆盖的时间窗口的大小,我们采用随机时间子采样。这个想法是在许多实际情况下,没有必要为每个新帧更新每个背景像素模型。通过降低背景更新的频率,我们人为地延长了背景样本的预期寿命。但是在存在周期性或伪周期性背景运动的情况下,固定子采样间隔的使用可能会阻止背景模型正确适应这些运动。这促使我们使用随机子采样策略。在实践中,当一个像素值被归类为属于背景时,一个随机过程会确定这个值是否用于更新相应的像素模型。
在我们所有的测试中,我们采用了一个时间子采样因子φ=16:背景像素值有16分之一的机会被选中来更新其像素模型。但是我们可能希望调整这个参数来调整像素模型覆盖的时间窗口的长度。

**—>通过背景样本传播的空间一致性:**由于我们使用保守的更新方案,我们必须提供一种更新被前景隐藏的背景像素模型的方法。一种流行的方法是使用 W4 算法 [33] 称为“检测支持图”,它计算像素被分类为前景的连续次数。如果该数字达到特定像素位置的给定阈值,则将该位置的当前像素值插入到背景模型中。一个变体包括在背景中包括已被发现很长时间静态的一组连接的前景像素,如 [69] 中所示。一些作者,如W4算法和SACON模型[64]、[65]的作者,使用像素级和对象级背景更新的组合。

使用保守更新的优势在于,归类为前景的像素值永远不会包含在任何背景像素模型中。 虽然方便,但支持地图相关方法只是延迟了前景像素的包含。此外,由于这些方法依赖于二元决策,因此需要时间从背景模型中不正确地包含真实前景对象中恢复过来。 在背景像素模型中逐步包含前景样本更合适。

我们认为相邻的背景像素共享相似的时间分布,并且像素的新背景样本也应该更新相邻像素的模型。(加入该背景样本在此像素的背景模型中进行更新则也应在此像素的邻居像素的背景模型中进行更新) 根据此策略,被前景隐藏的背景模型将不时使用来自相邻像素位置的背景样本进行更新。 这允许关于背景演变的信息的空间扩散,这依赖于专门归类为背景的样本。 因此,我们的背景模型能够适应不断变化的光照和结构演变(添加或删除背景对象),同时依赖于严格的保守更新方案。

更准确地说,让我们考虑像素x的4或8连通空间邻域,即NG (x),并假设已决定通过插入v(x) 来更新样本集 M(x) . 然后,我们还使用这个值v(x)来更新来自邻域中一个像素的样本集 M(y ∈ N G (x)),N G (x)这个领域被更新的像素点时随机选择的。
由于像素模型包含许多样本,因此可能会意外插入邻域模型的无关信息不会影响检测的准确性。 此外,不相关信息的错误传播因需要匹配观测值才能进一步传播而被阻止。 这种自然限制抑制了错误的扩散。

请注意,选择策略和空间传播方法都不是确定性的。 如前所述,如果算法再次在同一视频序列上运行,结果总是会略有不同(见图 2)。 尽管不寻常,但允许随机过程来确定要丢弃哪些样本的策略被证明是非常强大的。 这与引入衰落因子或使用长期和短期价值历史的已知策略不同。 我们的算法的描述到此结束。 ViBe不对视频流帧率或色彩空间、场景内容、背景本身或其随时间的变化做出任何假设。 因此,我们将其称为通用方法。

VIBE算法(一)——论文翻译相关推荐

  1. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(五)- 立体匹配经典算法PatchMatch论文翻译及要点解读 声明 问题提出 问题建模 通过PatchMatch获取平面参数--Inference via Patc ...

  2. 谷歌13年提出来的类似于lr的算法 - ftrl论文翻译(七)

    论文链接:https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/41159.pdf 概要 ...

  3. 分布式一致性算法:Raft 算法(论文翻译)

    Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的 ...

  4. 滑动窗加速方法——程明明bing算法【论文翻译】

    BING: Binarized Normed Gradients for Objectness Estimation at 300fps Ming-Ming Cheng, Ziming Zhang, ...

  5. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译

  6. 论文翻译:ViBe+算法(ViBe算法的改进版本)

    论文翻译:ViBe+算法(ViBe算法的改进版本) 原文地址: <Background Subtraction: Experiments and Improvements for ViBe> ...

  7. 【转】分布式一致性算法:Raft 算法(Raft 论文翻译)

    编者按:这篇文章来自简书的一个位博主Jeffbond,读了好几遍,翻译的质量比较高,原文链接:分布式一致性算法:Raft 算法(Raft 论文翻译),版权一切归原译者. 同时,第6部分的集群成员变更读 ...

  8. 巩膜:论文翻译《一种改进的眼角检测算法》An Improved Algorithm for Eye Corner Detection

    1509.04887.pdf论文翻译 An Improved Algorithm for Eye Corner Detection Anirban Dasgupta, Anshit Mandloi, ...

  9. 【论文翻译】聚类算法研究

    论文题目:聚类算法研究 论文来源:聚类算法研究 翻译人:BDML@CQUT实验室 聚类算法研究 孙吉贵 , 刘 杰 , 赵连宇 Clustering Algorithms Research SUN J ...

  10. 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...

最新文章

  1. 解决请求中400的问题
  2. 重磅,Intel考虑收购博通
  3. make: *** [out/target/common/obj/APPS/Phone_intermediates/classes-full-debug.jar] 错误 41
  4. ActivityManagerService简要分析
  5. 2006年清华大学计算机研究生机试真题
  6. vba转换为vbs的方法_vba代码改成vbs,该怎么解决(4)
  7. 2021牛年春节海报PSD分层模板,简单一点就好!
  8. vue中dom元素和组件的获取
  9. Eclipse的两个hibernate plugin
  10. java 中 class 对象_java中Class对象详解
  11. 11. 文件上传漏洞
  12. 肌电信号 聚类 Matlab
  13. 通俗理解三维向量的点乘与叉乘
  14. jquery html() 获取自己
  15. Unity3d 真实的植物渲染
  16. Visual C++黑白棋游戏项目开发一:需求分析、系统架构设计(附源码和资源 可用于大作业)
  17. 面试题6:从尾到头打印链表
  18. 计算机网络常见的协议之ARP协议
  19. Java用“埃氏筛法”求素数
  20. [Verilog硬件描述语言]程序设计语句

热门文章

  1. python微博接口_Python使用新浪微博API发送微博的例子
  2. java基础知识总结
  3. python下载bt文件_Python实现解析Bit Torrent种子文件内容的方法
  4. 二.公共建筑安全防范系统配置
  5. 你专属的程序员春节“大礼包”
  6. 赛门铁克NBU备份oracle慢的问题
  7. C语言易错知识点总结
  8. 毕设查重,避免雷区【划重点!!!】
  9. Maven安装与配置,Idea配置Maven
  10. 实战揭秘地方性社区门户站运营大法