Efficient Belief Propagation for Early Vision
对于早期视觉问题的高效信念传播
(一些数学符号不标准,需要对照原论文阅读)

摘要
马尔可夫随机场模型为立体、光流和图像恢复等早期视觉问题提供了一个强大而统一的框架。基于图割和信念传播的推理算法可以得到准确的结果,尽管最近取得了一些进展,但对于实际应用来说,通常仍然过于缓慢。在本文中,我们提出了新的算法技术,大大提高了信念传播方法的运行时间。我们的一种技术将推理算法的复杂性降低为线性,而不是每个像素的可能标签数量的平方,这对于诸如光流或具有大标签集的图像恢复等问题很重要。第二种技术使通过少量固定数量的消息传递迭代次数来获得良好的结果成为可能,与输入图像的大小无关。综合这些技术,标准算法的速度提高了几个数量级。在实践中,我们获得了立体、光流和图像恢复算法,这些算法与其他全局方法一样精确,同时也与局部方法一样快速。

1 引言

在过去的几年里,在利用马尔可夫随机场模型解决早期视觉问题(如立体、光流和图像恢复)的算法的发展方面取得了令人振奋的进展。虽然这些问题的MRF公式产生了一个NP难的能量最小化问题,但对于立体和图像恢复问题,已经开发并演示了基于图割和信念传播的良好近似算法。这两种方法都是很好的,因为它们发现的局部极小值在大的邻域里也是极小值,并且在实践中产生了非常精确的结果。在[9]中描述了两种不同的立体方法之间的比较。

尽管有了这些实质性的进步,但是图割和信念传播方法仍然需要在当今最快的台式计算机上花费几分钟的处理时间来解决立体问题,而且在解决光流和图像恢复问题时,速度太慢,无法实际使用。因此,人们面临着在这些方法中进行抉择,这些方法产生好的结果但速度慢,以及局部方法产生的结果明显较差但速度快。在本文中,我们提出了三种新的算法技术,这三种算法技术大大提高了解决早期视觉问题的信念传播的运行时间。综合这些技术,将标准算法加速了几个数量级,使其运行时间与局部方法比具有竞争力。对于立体问题,我们获得的结果与标准BP或图割算法的精度相同,每对图像大约一秒钟。这种差异在视觉运动估计和图像恢复方面更为明显。例如,对于光流,我们的方法在速度上与简单的局部基于窗口的技术比具有竞争力,但在质量上提供更好的结果,类似于鲁棒的正则化公式(如[1])。

我们考虑的问题的一般框架可以定义如下。假设P是图像中的一组像素,L是一组标签。标签对应于我们要在每个像素上估计的量,例如视差、亮度或流向量。标签 f 为每个像素p∈P分配一个标签fp∈L。我们假设标签在任何地方都应该平滑变化,但在某些地方(如对象边界)可能会发生显著变化。标签的质量由能量函数给出,

其中N是四邻域图像网格图中的边。V(fp,fq)是将标签fp和fq分配给两个相邻像素的代价,通常称为不连续代价。Dp(fp)是将标签fp分配给像素p的代价,称为数据代价。找到一个最小能量的标签对应于一个适当定义的MRF的最大后验概率估计问题。

2.循环信念传播
首先我们简要回顾对马尔可夫随机场进行推理的BP方法(如[10])。特别是,最大积算法可以用方程(1)的形式找到能量函数的近似最小代价标签。通常,该算法是根据概率分布来定义的,但是可以用负对数概率来进行等效计算,其中最大积成为最小和。我们使用这个方法是因为它对人工数值不太敏感,而且它更直接地使用能量函数定义。

最大积BP算法通过在由四邻域的图像网格定义的图周围传递消息来工作。每条消息都是维度为可能的标签数的向量。设mtpq为结点p在 t 时发送给相邻结点q的消息,当使用负对数概率时,m0pq中的所有条目都初始化为零,每次迭代时,新消息的计算方法如下:

其中n(p)\q表示p的邻域除了q。在 t 次迭代之后,计算每个结点的信念向量,

最后,选择在每个结点上单独最小化bq(fq) 的标签f*q。该消息传递算法在网格图上的标准实现在O(nk2T)时间内运行,其中n是图像中的像素数,k是每个像素的可能标签数,T是迭代次数。基本上,计算每个消息需要O(k2)时间,每次迭代都有O(n)消息。

在本文中,我们展示了三种不同的技术,可以大大减少(2)中计算消息更新所需的时间。首先,我们展示了传统上用于早期视觉问题的代价函数V(fp,fq)能够在O(k)时间内计算出新的信息,通常通过使用距离变换技术。我们的第二个结果表明,对于网格图(和任何二部图),仅使用一半的消息更新就可以获得与上面定义的那些基本相同的信念。除了产生一个加速,这项技术还使“就地”计算消息成为可能,使用的内存是普通算法的一半。这一点很重要,因为BP的内存需求很高,在每个像素上存储多个分布。最后提出了一种从粗到细的多尺度BP算法。在我们的多尺度方法中,消息传递迭代次数T可能是一个小常数,因为在粗尺度图中,长距离交互是由短路径捕获的。相比之下,对于大多数问题,普通算法要求T很大,因为它限制了信息在图像中传播的距离。这意味着在标准算法中,T需要像n1/2那样增长,以允许来自图像一部分的信息传播到其他地方。

结合我们所有的技术,我们得到了一个O(nk)算法,在实践中非常快。此外,我们的结果与使用标准的最大积BP或图割算法来最小化方程式(1)中形式的能量函数时获得的结果一样准确。对于立体问题,我们使用[7]中的基准对其进行量化。

3 计算消息
本节介绍了我们三种技术中的第一种,对于大多数低级视觉应用程序,它把计算单个消息更新所需的时间从O(k2)减少到O(k)。我们可以把方程(2)改写为:

其中

计算消息的标准方法是对于每个可选的fq明确地最小化fp的消息。这需要O(k2)时间,其中k是标签数。然而,在低级视觉问题中,代价V(fp,fq)通常是基于对标签fp和fq之间差异的某种测量,而不是基于特定的标签对。在这种情况下,消息通常可以在O(k)时间内使用类似于[5]中对于图形结构的技术和[6]中HMM的技术进行计算。这对于运动估计和图像恢复等问题尤其重要,因为标签k的数量可以是数百甚至数千个。这些大的标签集使得目前的算法对于这些问题不切实际。

我们首先考虑一个简单的案例。Potts模型[3]捕获了这样一个假设:标签应该是分段常量。这个模型只考虑标签的相等或不相等。对于相同的标签,代价为零,而对于不同的标签,代价为正常数,

利用这个代价函数方程(3)可以表示为:

在这种形式下,显然可以对fp执行一次最小化,而不受fq值的影响。因此,计算消息所需的总时间是O(k)。首先我们计算min fp h(fp),然后用它来计算恒定时间内每个fq的消息值。请注意,当图中的每个边都有一个常量dpq,而不是一个常量d时,这个想法仍然适用。当某些其他过程(如边缘检测或分割)的结果表明,不同像素对的不连续性应或多或少受到惩罚时,这是有用的。

另一类代价函数是基于标签之间的差异程度。例如,在立体和图像恢复中,标签{0,…,k−1}对应于不同的视差或亮度值。将一对标签分配给相邻像素的代价通常基于这些量之间的差异量。为了考虑不连续性,因为值不会在任何地方都平滑变化,代价函数应该是鲁棒的,随着差异变大,代价函数会变得稳定。一个常见的函数是截断线性模型,其中代价根据标签fp和fq之间的距离线性增加到某一水平,

其中s是代价的增长率,d控制代价何时停止增长。一个类似的代价函数被用于一个立体问题里的BP方法[8],虽然不是截断的线性代价,但他们有一个函数,从几乎是线性接近原点,平滑地变为一个不变的值,随着代价的增加。

我们首先考虑由V(fp,fq)=s ||fp-fq||给出的不带截断的纯线性代价的简单问题。代入式(3)得:

人们可以想象标签嵌入到网格中。请注意,这是一个标签网格,与图像网格无关。标签网格在立体或图像恢复的情况下是一维的,在运动的情况下是二维的。然后(5)的最小化可以看作是根植于(fp,h(fp))的斜坡s的k的向上锥体的下包络。一维情况如图1所示。这个下包络线计算与计算距离变换(例如[2])时执行的计算类似。对于距离变换,圆锥体放置在高度0处,并且仅出现在选定值处,而不是每个网格点处。尽管存在这些差异,但是可以修改来自[2]的标准距离转换算法,以计算具有线性代价的消息。

很容易验证以下简单的两次传递算法是否正确计算了一维情况下方程式(5)中的消息。二维情况类似。首先,我们用h值初始化消息向量,然后按顺序更新其条目。这是“就地”完成的,以便更新互相影响,


后向传递是类似的,

考虑图1中的示例。m的初始值是(3,1,4,2)。在向前传递之后我们有(3,1,2,2),在向后传递之后我们得到(2,1,2,2)。允许我们使用该算法的关键特性是标签嵌入到网格中,不连续代价是网格中距离的线性函数。

方程(4)中具有截断线性模型的消息现在可以很容易地用O(k)时间计算。首先,我们用线性模型计算出消息是什么,然后计算线性代价消息的元素最小值和用于Potts计算的值,

另一个可以用类似方式计算的有用的代价函数是截断二次函数,它与||fp-fq||2成比例地增长到某一水平,然后成为常数。但是,这里不讨论截断二次型的算法。

4 网格图上的BP

在这一部分中,我们表明,对于二部图,BP可以更有效地执行,同时获得与标准算法基本相同的结果。回想一下,二部图是一个结点可以拆分为两个集合的图,这样每个边都可以连接不同集合中的结点对。如果我们用棋盘图案给网格图上色,我们会发现每一条边都连接着不同颜色的结点,所以网格图是二分的。

主要观察到,对于具有结点AUB的二部图,当计算方程式(2)中定义的消息时,从A中的结点发送的消息仅取决于从B中的结点发送的消息,反之亦然。特别是,如果我们知道在迭代 t 时A中结点发送的消息,我们可以计算在迭代t+1时从B中的结点发送的消息。此时,我们可以计算在迭代t+2时A中结点发送的消息。因此,可以计算迭代t+2时A中结点发送的消息,而不必计算迭代t+1时这些结点发送的消息。这促使对二部图的标准BP算法进行以下修改。

在新方案中,消息以标准方式初始化,但我们在更新来自A的消息和来自B的消息之间交替进行。具体来说,让mtpq成为在这个新的消息传递方案下,在时间t从结点P发送到结点Q的消息。当t为奇数时,我们更新A中结点发送的消息,并保留B中结点发送的消息的旧值。当t为偶数时,我们更新B中发送的消息,但不更新A中发送的消息。因此,我们只计算每个迭代中的一半消息。此外,我们可以将新消息存储在旧消息所在的内存空间中。这是因为在每次迭代中,被更新的消息并不相互依赖。利用最后一段的观点,通过归纳可以很容易地表明,对于所有t>0的情况,如果t是奇数(偶数),那么

也就是说,在新方案下发送的消息m与在标准方案下发送的消息m几乎相同。注意,当BP收敛时,这个交替的消息传递方案收敛到相同的固定点。这是因为在收敛后,mt−1pq=mtpq。

5 多尺度BP

对于许多早期视觉问题,BP的一个问题是消息是并行更新的(至少在概念上是这样的,尽管实现通常是连续的)。这意味着在网格图中,信息需要多次迭代才能长距离流动。在本节中,我们将描述一种多尺度技术来规避这个问题。在[9]中讨论了解决此问题的另一种方法,但该方法仍然需要多次迭代才能产生良好的结果。相反,我们的技术使用少量固定的迭代生成高质量的结果。

其基本思想是从粗到细地执行BP,这样粗图中的短路径就可以捕获像素之间的长距离交互。虽然层次BP方法已用于其他工作,如[11],但我们的方法不同之处在于,我们只使用层次来减少消息传递迭代次数,而不更改正在最小化的函数。例如,在[11]中,图像网格中相邻像素之间的边被四叉树结构中像素与其父像素之间的边替换。这具有从图中删除循环的良好特性,但与非层次情况相比,它也大大改变了最小化问题。特别是,四叉树结构由于空间变化的邻域结构而创建了工件。

回想一下,BP通过查找消息更新规则的固定点来工作。通常消息初始化为零(在对数概率空间中)。如果我们能够以某种方式初始化接近固定点的消息,我们将期望更快地收敛。我们的分层方法正好做到了这一点;我们在一个分辨率级别上运行BP,以便在下一个更精细的级别上获取消息的估计值。因此,在不改变图的结构或能量函数最小化的情况下,我们仅使用从粗到细的计算来加速网格图上原始BP问题的收敛。

更详细地说,我们定义了一组由粗到细的方式排列的问题。第零级对应于我们想要解决的原始标签问题。第 i 级对应于一个问题,即2i×2i 像素的块被组合在一起,并且生成的块以网格结构连接。直观地说,i-th级别可以表示标签,其中一个块中的所有像素都被指定为相同的标签。这种结构的一个关键特性是,由于路径是通过块而不是像素,因此可以通过粗级别中的短路径捕获长距离交互。图2说明了结构的两个层次。

较粗级别的数据代价是根据原始问题的数据代价定义的。将标签fb分配给b区的代价是,

其中和是块中像素的和。实际上,i 级的块代价可以通过将 i-1级的四个区块代价相加来计算。负对数代价的总和对应于概率的乘积,因此对Db的解释是观察给定特定标签的相应像素集的概率。重要的是要注意,即使是一个块中的像素,它们实际上更喜欢不同的标签,这是由几个值具有相对较低的代价这一事实所捕获的。例如,如果一半像素更喜欢选择标签α,一半更喜欢选择标签β,那么每个标签的代价较低,而其他标签的代价较高。

我们的多尺度算法首先在层次结构最粗的级别上运行BP,消息初始化为零。在T迭代之后,结果消息用于在第二个最粗级别初始化消息。在该级别的T迭代之后,结果消息将用于初始化下一个更精细的级别,依此类推。在四邻接的网格图中,每个结点都发送与方向(右、左、上和下)相对应的消息。让rtp是结点p在迭代 t 时发送到右边的消息,同样让ltp、utp和dtp分别是它发送到左边、上面和下面的消息。注意,这只是一种不同的消息命名方法,例如,如果结点p是结点q的左邻点,那么rtp=mtpq和ltq=mtqp。同样,对于向上和向下,要特别注意边界结点,因为它们在所有方向上都没有邻点。i-1级消息通过以下方式从 i 级消息初始化。我们让一个结点发送到右侧的初始消息成为其块在较粗级别中发送到右侧的最终消息。其他方向也一样。
准确地说,

其中,i 级结点p′是包含 i-1级结点p的块。在更新每个级别的消息时,数据代价如上文所定义,并且所有级别的不连续代价与原始问题的不连续代价相同。我们可以想象基于上述级别在层次结构的某一级别初始化消息的其他方案,但是这种简单的方法在实践中产生了良好的结果。

我们发现,使用这种从粗到细的初始化消息的方法,足够在每个级别(5到10之间)运行BP进行少量迭代。请注意,四叉树中的结点总数仅为最佳级别结点数的4/3。因此,对于给定的迭代次数,分层方法中的消息更新总数仅比标准单级方法中的更新总数多1/3。在下一节中,我们将展示我们的方法在立体、运动估计和图像恢复中的一些应用结果。这种多尺度算法产生的结果有时似乎比我们在数百次迭代中以最好的水平运行标准BP得到的结果要好。我们认为,在这种情况下,粗到细的加工过程将引导BP找到一个更好的局部最小解,该解总体上趋于平滑,但仍然保留真正的不连续性。

我们的分层方法与计算机视觉中常用的其他技术,如高斯金字塔(如[4])有细微但重要的不同。通常使用分层技术,以便在图像对之间存在较大位移时应用差分方法。这些技术是基于降低图像数据的分辨率,而我们的技术是基于仅降低估计标签的分辨率。例如,考虑立体的问题。降低图像分辨率可减少可分辨的视差数。在这样一个等级的第四级,0到16之间的所有视差都是不可区分的。相比之下,我们的方法,如方程(6)所定义的,并没有降低图像分辨率,而是在更大的空间邻域上聚集数据代价。因此,即使是在一个非常高的层次上,小的视差仍然是清楚的,如果他们存在于一个大的空间区域。这种差异对于解决手头的问题至关重要,因为我们希望能够在少量的消息传递迭代中传播有关量例如图像大区域上的视差的信息。一般来说,我们需要一些与log2图像直径成比例的级别。相比之下,高斯金字塔在高于log2最大位移量的级别上没有关于位移的有用信息(并且该值通常比图像直径小得多)。

6 实验
对于这里所示的所有实验,我们使用截断线性模型计算不连续代价,V(fp,fq)=min(s ||fp−fq||,d)。在所有情况下,我们在每个尺度上运行五个消息更新迭代,总共有六个尺度。注意,在每次迭代中,我们只更新了一半的消息,使用了第4节中描述的技术。报告的运行时间是在一台2GHz的奔腾4计算机上获得的。

在立体中,标签对应不同的视差。使用亮度恒定假设,我们期望左右图像之间对应的像素具有相似的亮度。因此,我们对像素p=(x,y)使用以下数据代价,

其中 τ 表示截断值。截断是必要的,以使数据代价对遮挡和伪影鲁棒,违反亮度恒定性假设(如镜面反射)。图4显示了Tsukuba图像对的立体结果。我们的算法对这对立体对的运行时间大约是一秒钟。相比之下,标准BP算法需要几分钟的时间来生成类似的(但不完整的)解决方案,如[9]和[8]所述。图3显示了我们正在最小化的能量值,它是我们的多尺度BP方法与标准算法的消息更新迭代次数的函数。请注意,我们的方法是如何在每个级别的几次迭代中计算出一个低能量的解决方案,而标准算法需要数百次迭代才能获得类似的结果。

表1显示了我们的立体声算法在Middlebury立体基准上的评估结果[7]。对于所有的立体实验,我们使用一组固定的参数s=10,d=20和t=20。在计算数据代价之前,使用v=0.7的高斯滤波器对输入图像进行平滑处理。

总体而言,我们的方法在Middlebury评估中排名第五,与其他全局技术相比具有可比性。但这些其他技术的运行速度都比我们的方法慢数百倍。值得注意的是,我们的结果仅基于上述定义的简单不连续性和数据代价,而其他方法则使用有关亮度度边界和遮挡以及更复杂数据代价的附加信息。我们使用简单的代价函数,因为我们在这里的重点是算法技术,并证明它们能更快地产生类似的质量结果。我们的技术也可以用于其他代价。



Table 1: Evaluation of the stereo algorithm on the Middlebury Stereo benchmark. The error measures the percentage of
pixels with wrong disparities. Our method ranks in fifth place in the overall evaluation.

在运动估计中,标签对应于不同的位移矢量。数据代价可以定义为在立体情况下使用亮度恒定假设,

图5显示了一对简单图像的光流结果,该图像具有一个人行走和静态背景。注意,运动不连续性相当尖锐。我们的算法在这对图像上的运行时间大约是4秒。标准图像对的结果如图6所示。运动估计问题的能量最小化公式产生了正则化但保留不连续性的解。特别是我们得到了平滑的场和尖锐的边界。在运动实验中,我们使用s=50,d=150,τ=50。在计算数据代价之前,使用σ=1.5的高斯滤波器对输入图像进行平滑处理。
图7中的最后一个实验说明了图像恢复结果。这里的标签对应于亮度值。为像素指定特定亮度的代价是基于该亮度与观测值之间的差异,

图像复原问题是其中的距离变换技术尤为重要的问题。对于这个问题,有256个标签,标签集中的平方算法需要很长时间才能运行。我们的算法的运行时间大约为3秒。对于这个实验,我们使用s=1,d=20,τ=100。在原始输入的每个像素上加上独立的高斯噪声(σ=30),得到噪声图像。


7 总结与讨论

我们提出了一种基于最大积信念传播技术的能量最小化方法来解决早期视觉中出现的MRF问题。我们的方法得到的结果与其他算法的精度相当,但运行速度快了数百倍。对于立体问题,我们使用Middlebury基准量化精度。该方法实现起来相当简单,在许多情况下,应该不需要在精度相对较低的快速局部方法和精度较高的慢速全局方法之间进行选择。

我们的方法基于三种算法技术。第一种技术使用距离变换算法的变体来减少计算单个消息更新所需的时间从O(k2)到O(k),其中k是标签的数量。第二种技术利用网格图是二部图的事实,将存储需求和运行时间减少了2倍。这一点尤其重要,因为信念传播方法的内存需求相对较高。第三种技术使用层次结构将消息传递迭代次数减少到一个小常量,而不是与图像网格图的直径成比例。这种层次技术不同于基于抽取的层次结构,如计算机视觉中常用的高斯金字塔。它用于减少消息的传播时间,而不是解决较低分辨率的估计问题。

这里报告的技术有许多可能的扩展。如实验部分所述,这里只使用最简单的代价函数,但该方法适用于更复杂的广泛代价函数,包括使用基于边界或遮挡证据而变化的不连续代价。另一个扩展将是获得亚像素精度估计的视差或运动。如[9]所示,和积信念传播方法(与此处使用的最大积相反)可用于获得立体视差的亚像素估计。我们的三种算法技术中有两种可直接应用于和积方法,即二分网格技术和分层消息传播技术。距离变换技术不再适用,但是有一种基于卷积的相关技术可以使用(并已应用于[5]中的图形结构和[6]中的hmms)。

Efficient Belief Propagation for Early Vision 论文翻译 对于早期视觉问题的高效信念传播相关推荐

  1. 【剪枝算法】通过网络瘦身学习高效的卷积网络Learning Efficient Convolutional Networks through Network Slimming论文翻译

    此论文翻译仅仅用于自己方便学习.译文来自其他处. 在许多实际应用中部署深度卷积神经网络(CNN)很大程度上受到其计算成本高的限制.在本文中,我们提出了一种新的CNNs学习方案,能同时1)减小模型大小; ...

  2. Max-Product Loopy Belief Propagation

    Max-Product Loopy Belief Propagation 关于belief propagation.这是machine learning的泰斗J. Pearl的最重要的贡献.对于统计学 ...

  3. Max-Product Loopy Belief Propagation for Solving MRF's energy function minimization

    本文转自http://blog.sina.com.cn/s/blog_4dfdfdc30100q2el.html 关于belief propagation.这是machine learning的泰斗J ...

  4. 【论文翻译】Accurate and Efficient Stereo Matching via Attention Concatenation Volume(CVPR 2022)

    一.论文简述 1. 第一作者:Gangwei Xu 2. 发表年份:2022 3. 发表期刊:arXiv 4. 关键词:立体匹配,代价体构建,注意力相关体,注意力过滤 5. 探索动机:现有的方法要不是 ...

  5. 论文翻译:2020_TinyLSTMs: Efficient Neural Speech Enhancement for Hearing Aids

    论文地址:TinyLSTMs:助听器的高效神经语音增强 音频地址:https://github.com/Bose/efficient-neural-speech-enhancement 引用格式:Fe ...

  6. Transformers in Vision: A Survey论文翻译

    Transformers in Vision: A Survey 论文翻译 原文 翻译链接 摘要 摘要--Transformer模型在自然语言任务上的惊人结果引起了视觉界的兴趣,而致力于研究它们在计算 ...

  7. Ground Segmentation based on Loopy Belief Propagation for Sparse 3D Point Clouds (论文速读)

    欢迎访问我的个人博客:zengzeyu.com Abstract 在使用3D激光雷达进行局部环境感知任务中,地面点分割是中重要的预处理任务,并且在起伏不平和倾斜的非结构化环境中非常具有挑战性.为了解决 ...

  8. AlexNet论文翻译(中英文对照版)-ImageNet Classification with Deep Convolutional Neural Networks

    图像分类经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为中英文对照版,纯中文版请稳步:[AlexNet纯中文版] ImageNet Classification with De ...

  9. MultiNet:自主驾驶中的实时联合语义推理 论文翻译

    MultiNet论文相关 论文下载地址:原文地址.免翻墙地址 论文Github地址:KittiSeg 论文翻译参考:csdn MultiNet: Real-time Joint Semantic Re ...

最新文章

  1. TensorFlow损失函数(loss function) 2017-08-14 11:32 125人阅读 评论(0) 收藏 举报 分类: 深度学习及TensorFlow实现(10) 版权声明:
  2. Java中的读/写锁
  3. windows下快速启动或关闭系统服务方法
  4. 友盟消息推送UPush
  5. mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
  6. 世界是平的,这本书主要是写给美国人看的
  7. NHibernate初学者指南(3):创建Model
  8. mybatis自动生成代码
  9. 一个js内存泄露的好例子
  10. 脑电EEG代码开源分享 【5.特征选择】
  11. 风控教父谈模型风险管理(中文版)
  12. solidworks2021安装教程,solidworks2021安装步骤
  13. Java邮箱验证码注册
  14. 【IoT】电子产品如何做防静电 ESD 设计
  15. Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
  16. python_爬虫_豆瓣TOP250_url
  17. 借华为鸿蒙系统发布,谈谈操作系统的爱恨情仇发展史
  18. 百度富文本编辑器(ueditor)样式错误,回显出现#39、quot
  19. PowerMock 入门
  20. STM32F407学习笔记——MG90S舵机模块(基本控制)

热门文章

  1. Flutter 多版本管理FVM安装与使用
  2. 汇编语言中RET指令的功能
  3. 京东APP技术解密:移动端秒级配置触达平台-Switchquery
  4. 最近看的演唱会总结,张信哲,周杰伦,梁静茹
  5. 一份好的pitch是你成功吸引投资者的关键 | 双语
  6. 编写一个程序,打印所有的“水仙花数”“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身
  7. ElasticSearch7.6.x 学习笔记
  8. c 语言字体怎么改,VC++中的字体设置方法详解
  9. 接近开关和欧姆龙的PLC怎么接线?
  10. python设计程序输出一个带文本框和图像的窗体_设计一个文本框 用户在文本框中输入什么 窗体标题就同步显示什么 怎么设计啊...