文  | 陈十三
公众号首发 | 一只在路上的哈士奇
公众号ID  | super_Mrchen
关注可了解更多。问题或建议,请公众号留言

0x00 补充知识

1.视差:左右双目图像中,两个匹配块中心像素的水平距离。视差图如下图例1所示,相同视差(即相同颜色)代表物体离摄像头位置相同(个人理解)。视差越大越靠近摄像头,颜色越亮越靠近摄像头.

图1 视差图实例 2. 立体匹配的四个最基本的步骤:

  • 匹配代价计算(Matching Cost Computation:CC)
  • 代价聚合(Cost Aggregation:CA)
  • 视差计算(Disparity Computation )
  • 视差精化(Disparity Refinement ):对上一步得到的粗估计的视差图进行精确计算,策略有很多,例如plane fitting,BP,动态规划等。这里不再熬述。

3.本文提到的相关网络结构

DispNet
Make3D
Deep3D 生成相对应的右视角

4.本文的一些总结(建议通篇读完之后进食)
  本文采用无监督学习(没有ground truth)的方法来估计深度,基本思路是匹配好左右视图的像素,得到disparity map。根据得到的视差disparity,由d = bf/disparity,算出depth map。本文能实现在35ms内恢复一张图512×256的图只需要25ms(GPU)。
  利用图像重建误差(image reconstruction loss)来最小化光度误差(类似于SLAM中的直接法)虽可以得到很好地图像重建结果(disparity),但得到深度预测结果非常差。
  为了优化这个结果,作者采用Left-Right Consitency来优化。也就是以左视图为输入,以右视图为training中的监督真值,生成右侧对应的视图;然后又以左视图为监督真值,根据右视图生成左视图。最小化这两个过程的联合loss则可以一个很好的左右视图对应关系。
最终网络得到一个四个scale大小的输出(disp1-disp4)。
  Left-Right Consistency Check

0x01 摘要

==
  使用基于学习的方法(Learning based methods)在单目深度估计上已经有较好的结果了。然而大部分现有的方法将深度估计问题看作有监督的回归问题,因此需要大量相应的ground truth深度数据进行训练。在各种场景中记录有质量的深度数据是一个有挑战性的问题。在本文中,我们创新超越现有方法,在训练期间用更容易获得的双目立体素材取代显式深度数据的使用。
  本文提出了一种新的训练目标,使得尽管没有ground truth深度数据,我们也能够利用卷积神经网络学习从单张图片获取深度信息。利用极坐标几何约束,我们可以用图像重建损失训练我们的神经网络,从而生成视差图。我们还发现只用图像重建求深度图,会导致其质量较差。为了解决这一问题,本文提出了一种新的损失函数,它加强了左右视差图的一致性,与现有的方法相比,它提高了性能和鲁棒性。本文的方法在KITTI数据集的单目深度估计上达到了state-of-the-art,甚至超过用ground-truth深度训练的有监督方法。


Exploiting epipolar geometry constraints, we generate disparityimages by training our network with an image reconstruction loss.
利用极坐标几何约束,我们通过训练我们的网络产生图像重建损失来产生视差图像。

Q: 什么是极线几何约束?
A:对极几何基本概念 https://blog.csdn.net/tina_ttl/article/details/52749542
极线约束 https://blog.csdn.net/ccblogger/article/details/72900316
  简而言之, 在双目立体视觉测量中,立体匹配(对应点的匹配 )是一项关键技术,极线几何在其中起着重要作用。双目立体视觉系统中,有两个摄像机在不同角度拍摄物理空间中的一实体点,在两副图像上分别成有有两个成像点。立体匹配就是已知其中的一个成像点,在另一副图像上找出该成像点的对应点。极线几何约束是一种常用的匹配约束技术。
  极线约束是一种点对直线的约束,而不是点与点的约束,尽管如此,极线约束给出了对应点重要的约束条件,它将对应点匹配从整幅图像寻找压缩到在一条直线上寻找对应点。

0x02 介绍

==
  从图像做深度估计有很长的历史。现在成果比较多的方法是依赖于structure from motionshape-from-X,binocular,multi-view stereo.然而,大多数的技术都是假设一个场景有多个观察点能用。这些可以用多个视点或者多个光照条件下做。为了克服这个限制,现在有很多工作把把单目深度估计作为一个有监督学习的问题。这些方法尝试直接在图像中预测每个像素的深度。他们用收集的大量的ground truth深度数据离线训练。这些方法也有些成功,但是它们会被限制在一些大量图片和对应像素级的深度能够收集的场景中。
  从一张图中理解一个场景的形状(独立于它的表面independent of its apprearance)是机器感知中一个基础的问题。有很多的应用像synthetic object insertion in computer graphics, synthetic depth of field in computational photography, grasping in robotics , using depth as a cue in human body pose estimation, robot assisted surgery , automatic 2D to 3D conversion in film.从一个或者多个相机中得到精确的深度信息对于自动驾驶来说很重要,而现在laser-based的系统成本很高,但是普遍应用。
  人类可以在单目深度估计上做的很好,通过利用线索:比如透视,相对熟悉物体的尺度,光与阴影的现象和遮挡。通过结合top-down和bottom-up线索可以把整个场景的理解与自己的理解联系起来产生准确的深度估计。这篇用了一个替代的方法,在训练时把自动深度看成一个图像重建的问题。作者用的全卷积网络不需要深度数据,而是用合成深度作为一个中间产物。网络学习预测像素级的相关(校正之后的双目图像之间有一个baseline)。也有相似的工作,但是有一些限制。比如说,它们不是完全的可以微分的,使得训练不是最优的。或者有不能图像构成模型不能放大到大的输出分辨率。作者在这些方法上面做了提升,用了一个新颖的训练目标并且增强了架构,提升了最后输出结果的质量。作者方法更加快,在512 * 256的图上估计一个稠密的深度图只用35ms在GPU上。

作者的贡献:
  本文介绍由 Godard 等发表在2017 CVPR上的一篇关于无监督单目图像深度。该文章与我上篇博客所介绍的Unsupervised CNN for Single View Depth Estimation: Geometry to the Rescue的基本原理相同,都利用了图像深度与视差之间的关系(即视差是按比例缩小的逆深度,disparity=fb/depth),但作者也提出了,该篇文章的图像形成是不完全可微的,这导致训练的结果是次优的。相比于采用Taylor公式对图像进行线性化,本文利用的是双线性插值。本文对之前的研究进行改进,其贡献主要有以下几点:

  1. 提出了一种端到端无监督的单目深度估计网络架构,采用一种可以增强左右深度一致性的损失函数。
  2. 评估了多种损失函数和成像模型(image formation models),强调了方法的有效性。
  3. 除了在一个具有挑战性的行车数据集上展示优越的(state of the art)结果,还展示了模型推广到三个不同的数据集,其中包括一个作者自己收集的室外城市数据集,并将数据集公开了。

0x02 相关工作

==
  有好多工作都在图像深度估计上,有用图像对,一些不同视角采集的有重叠的图像,时间序列,或者假设固定相机。这些方法都是当有多个输入图片能用的时候。这里作者关注单目深度估计,不假设场景几何或者目标类型。

Learning-Based Stereo

==
  绝大多数立体声估计算法具有数据项,该数据项计算第一图像中的每个像素与第二图像中的每个其他像素之间的相似性。一般立体双目立体里面的图像对都是被校正过的,所以视差图(或者说缩放后的深度图的倒数)的问题可以看成对每个像素的训练维搜索问题。 最近,已经表明,不是使用手工定义的相似性度量,而是将匹配视为监督学习问题并训练预测对应关系的函数,从而产生更好的结果。可以把双目相关搜索看作是多分类问题。这样在质量和速度上有优势。Mayer用了一个全卷积网络叫做DispNet可以直接计算两张图之间的视差。训练的时候他们直接预测每个像素的视差图,通过最小化回归损失。DispNet与之前的end-to-end deep optical flow network很像。
  这些方法基于大量精准的ground truth disparity和stereo image pair。这些数据难以获取,所以这些方法一般用合成数据。虽然合成数据越来越真实,但是需要为每个应用人工创建新内容。

Supervised Single Image Depth Estimation

==
  单个视角,或者单目深度估计在测试时候只能用一个图。Saxena用了基于patch方法,也叫Make3D,首先过分割输入图像到一个个patch。然后估计这些3D位置和局部平面的方向来解释每个patch。这些平面参数的预测用一个线性模型在一个Laser扫描的数据上面离线训练。然后用MRF做后处理。但是有个问题就是预测细小的形状时候有问题。因为预测是局部的,缺少全局内容生成现实的结果。还有好几个人用了其他方法做,但是有个缺点是测试时候整个训练数据是都要用的。
  Eigen用了两个尺度的网络预测每个像素的深度。这个方法不需手动调特征或初始过分割。其他方法有用CRF提高精度,把损失从回归变成分类,引入很强的场景的先验在表面法向量估计上。这些方法需要高质量,像素对齐的ground truth。

Unsupervised Depth Estimation

==
  最近,有一些无监督方法出来(在训练的时候不需要ground truth depth)。Flynn等介绍了一个图像合成网络叫做DeepStereo,通过选择邻近的像素生成新的视角。训练时候,多个相机的相对位置用来预测邻近图像的appearance。然后最合适的深度选来从邻近图像里面采样颜色,基于平面延伸量。测试的时候图像合成在小的重叠patch上。所以DeepStereo不适合在单目上。
  Deep3D也通过新视角生成解决这个问题。他们目标是生成相对应的右视角。也用了图像重建损失,他们的方法产生了对每个像素的所有可能的视差的分布。合成的右图从左图中的同个扫描线像素的结合,通过每个视差加权得到。这个方法的缺点是增加候选视差值,增加了存储消耗。这样会让它们不能输出更高像素的图。
  与作者更像的是Garg的方法。他们用重建损失训练单目深度估计。然而他们的图像组成模型是不可微的。为了解决这个问题,他们用Taylor近似去线性化他们的损失函数。作者的方法用了双线性采样生成图像,结果是全可微的训练损失。
  作者的方法是全卷积方法,是受DispNet启发的。通过把单目深度估计看作重建问题不需要标签。但是只最小化一个光度photometric loss,对于图像重建很好,但是可能生成很差的深度图。所以作者还加了左右一致性检查consistency check是通常用来做多目方法的后处理的。


作者在这段介绍了三种大的方式,1. Learning-Based Stereo ; 2.Supervised Single Image Depth Estimation;3.Unsupervised Depth Estimation。也是慢慢从有监督介绍到无监督的过程。
  先是介绍了DispNet,训练的时候他们通过最小化回归损失直接预测每个像素的视差图,缺点是需要大量的精准的ground truth disparitystereo image pair,难以获取。
  接着是Make3D有监督的基于patch方法,分割输入图像到一个个patch。然后估计这些3D位置和局部平面的方向来解释每个patch。这些平面参数的预测用一个线性模型在一个Laser扫描的数据上面离线训练。然后用MRF做后处理。缺点是预测是局部的,缺少全局内容生成现实的结果。还有一个缺点是需要高质量,像素对齐的ground truth
  然后是无监督DeepStereoDeep3D。前者通过选择邻近的像素生成新的视角。不适合在弹幕深度估计上。后者生成相对应的右视角,也用了图像重建损失。缺点是增加候选视差值,增加了存储消耗,不能输出更高像素的图。
  最后是无监督Garg方法,他们用重建损失训练单目深度估计。但是缺点是图像建模不可微。作者采用双线性采样,训练损失结果可微。
  作者的方法是全卷机,启发于DispNet。把单目深度估计看作重建问题,这样就不需要标签。图像重建基于photometric loss,深度图基于左右一致性。

0x03 方法

Depth Estimation as Image Reconstruction

详见 读Unsupervised Monocular Depth Estimation with Left-Right Consistency

Depth Estimation Network

==
  在高的层次来说,作者的网络通过推测视差将左图弯曲来匹配右图。主要的insight可以只用左图同时预测两个视差(左边到右边,右边到左边),用左右一致性来增强它。作者的网络通过双目反向匹配生成了预测图像,是一个完全可微的图像形成网络。如图三所示,naive一些的做法是从左图采样,生成与目标右图对齐的视差图。然而作者想要从右图采样输出与左图对齐的视差图。这样就是NoLR的方法。只是这么做的话,被推断出来的视差图表现出“纹理拷贝”人工合成和深度图连续性上面误差。作者通过从相反的输入图像采样训练网络预测两个视角的视差图的方法解决这个问题。这样做也只需要单个左图作为卷积神经网络的输入,右图只在训练时候使用。用左右图一致性损失增强左右视差图的一致性可以让结果更准确。
  作者的全卷积架构是被DipsNet启发的,几个重要的修正让作者不需要ground truth 深度图训练。作者的网络主要由两个部分组成:
  编码器:从第一层卷积到第七层卷积b
  解码器:从反卷积7
  解码器是从编码器的激活块做skip connections的,这样可以让它能够分解更高的分辨细节。作者输出视差预测在不同的尺度(从disp4到disp1),这样可以在不同字序列尺度上的空间分辨率上加倍。虽然只用单张图作为输入,网络在每个输出尺度预测两张视差图:左到右,右到左。

Training Loss

详见 读Unsupervised Monocular Depth Estimation with Left-Right Consistency
  作者的损失主要由三个部分组成:

  其中 C_{ap} 激励重建图像表现的像对应的训练输入, C_{ds} 增强视差的平滑性, C_{lr} 是与预测的左右视差图一致性相关。每一项都包换左右图变量,但是只有左图会喂到卷积层中。

Appearance Matching Loss:

在训练的时候,网络学习通过采样对立的图像像素生成图像。作者的图像构成模型用了STN(spatial transformer network)采样输入图像。STN用了双线性采样,它的输出像素是4个输入像素的加权求和。与其他替代方法相反,双线性采样是局部完全可微的,可以无间隙地整合到全卷积网络架构里面。这意味着不需要任何的简化或者近似损失函数。作者用了 L1 和单尺度的 SSIM 项结合作为光度图像重建损失 C_{ap} , N 是像素个数。

这里作者用了简化的SSIM, 3*3 块作为滤波器,而不是用高斯,设置 alpha=0.85 。

Left-Right Disparity Consistency Loss

==
  为了生成更加准确的视差图,作者训练网络预测左右视差图。只用左视角作为卷积网络的输入。为了保证一致性,作者用了一个L1左右视差图的一致性惩罚作为模型的一部分。这个损失试图让左视差图等于被投影的右视差图。


  跟其他项一样,这个损失是左右视差图镜像的,可以在所有输出尺度上估计。
  在测试的时候,网络在最好的尺度层预测左图视差图 d^l ,它的分辨率和输入图像一样。
  用训练集里面已知相机的基线和焦距,可以从视差图算出深度图。作者训练时也估计了右视差图 d^r ,在测试的时候不使用。

作者先根据左视图L1预测得到右视图R1,然后根据生成的右视图再预测的到左视图L2,此时要求L1与L2一致,即所谓(从)左(到有边,从)右(到左边)一致性。


作者所用到的方法和损失函数:

1. 将单目图像深度估计视作图像重构。

2. 三个损失函数:

  • 左右视图的灰度匹配部分
  • 视差平滑部分(让disparity的分布更加平滑)
  • 左右视图的一致性部分(促使左视图中的disparity分布和右视图的disparity图严格相同) 解决生成很差效果的视差图

0x04. 结果

==
  作者与现在的有监督和无监督的单目深度估计方法比较了自己的方法。在校正之后的双目图像对上训练,不需要ground truth深度的监督。已知的单目图像数据集缺少立体对,对于评估不适用。作者用KITTI2015作为评估方法。作者用Deep3D方法的变体和修正版本Deep3Ds (加入 平滑约束)。作者也用加和不加左右一致性约束作对比。

4.1Implementation Details

==
  网络用tensorflow实现,有3100万可以训练的参数,用TitanX训练了25小时,训练了3万张图,走了50个epoch。Inference很快,低于35ms,28FPS以上,对于 的图。
  在优化的时候,调了不同损失项参数到 \alpha_{ap}=1 和 \alpha_{lr}=1 。可能的输出视差图用缩放的sigmoid单元限制在0到 d_{max} 之间。而 d_{max}=0.3\times 给定输出尺寸的 宽度。作为多尺度输出的结果,典型的邻域视差被用一个每个像素之间的因子差分(像用两个因子上采用上采样输出)。为了校正这个,作者用 r 缩放了视差平滑项 \alpha_{ds}。 这样在每个尺度层都有一样的平滑性。这样 \alpha_{ds}=\frac{0.1}{r} ,其中 r 是这一层相对于输入图像的分辨率的下采样因子。对于非线性,作者用了指数线性单元而不是常用的Relu。作者发现Relu倾向在中间尺度过早固定预测视差到一个值,这样子序列提升困难。作者换了反卷积层,用了最近邻采样在卷积层之后上采样。作者从随机初始化到训练50epoch。Batch大小是8,用了Adam优化器。 \beta_1=0.9,\beta_2=0.999,\epsilon=10^{-8} 。初始化学习率是 \lambda=10^{-4} ,前30次保持常数。作者初始实验用progressive update schedules,低分辨率的图像先被优化。然而作者发现一起优化四个尺度更加稳定收敛。相似的,作者对每个尺度用了一样的权值,不同时不能收敛。作者用了batch normalization实验,但是没有发现有很好提升。

Post-processing

==
  为了减少立体遮挡的影响(为在视差图上产生坡,在图左侧和它的遮挡者),作者做了个后处理。对于测试时候的输入图片 I ,作者计算了它镜面翻转之后的图 I’ 的视差图 d_l’ 。通过把这个图翻转回去,得到一个视差图 d_l’’ 。这个图和 d^l 对齐,而且视差坡是在遮挡的右边。作者结合了两个视差图组成最后的结果(用 d_l’’ 的左边5%和 d_l 的右边5%)。中间是最后视差图是 d_l和d_l’'之间的平均。这一步后处理提升了准确度并且减少了人工合成的感觉。但是代价是测试时间加倍了。这一个结果叫做pp.

我们知道,相对于右视图,左视图能看见场景左侧更多的内容,但无法看见一个物体右侧部分信息,即产生occluder。为了在物体右侧也能产生更好的效果,作者对测试方式进行了改进。作者不仅对输入的图像I计算深度图d,也对I的水平翻转(即左右互换)图像计算深度图d’,然后将d’水平翻转回来形成d”.虽然d与d”基本是对齐的,但disparity ramps方向是相反的。

4.2 KITTI

主要讲了KITTI数据。包含了42382个校正之后的立体对。有61个场景,图像是 1242\times375 。然后讲了怎么分开KITTI数据集。

Eigen

怎么跟Eigen的方法对比。
下面是一些对比。

Generalizing to Other Datasets

只在Cityspaces上面训练,在Camvid上面测试。

Limitations

==
  虽然左右一致性检查和后处理提升了结果的质量,但是在遮挡边界因为遮挡区域的像素在途中不可见,所以存在一些人工制造感觉(artifacts)。在训练时候考虑遮挡可以提升这个情况。这个方法要取决于相机之间的基线,而监督方法不用这步就可以有正确的深度值了。
  这个方法在训练的时候仍然需要校正和时间轴对齐,这意味着不能用已有的单目数据集。然而可以通过fine-tune模型,应用于特定ground truth的时候。
  最后,这个方法主要依赖图像重建项,意味着镜面和透明面不能产生一致的深度。这可以用更加精致复杂的相似度衡量方法提升。

0x05.总结

==
  作者展示了一个无监督深度神经网络用以单张图片深度估计。作者不用对齐的ground truth这种稀少而且消耗资源的方法,用了采集的双目立体数据。作者新颖的损失函数增强了各个视角的预测深度图的一致性。这个方法比现在的有监督的baseline要好,这激励了之后的研究不用需要这么消耗资源来获取ground truth。并且作者展示了这个模型能够泛化到未见过的数据上面,并且能够生成视觉上真实的深度图。
  之后的工作,作者将自己的模型延伸到视频上。现在的深度估计每一帧都是独立的,加入时间连贯性之后,可能能提升结果。有趣的是去检查稀疏输入作为替代的训练信号。最后,现在的模型是每个像素一个深度,如果也预测场景的occupancy会很有意思。

参考资料:

  • 双目视觉之视差图 https://blog.csdn.net/kissgoodbye2012/article/details/79432771
  • StereoVision–立体视觉(3)https://zhuanlan.zhihu.com/p/30754263
  • OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算 https://blog.csdn.net/chenyusiyuan/article/details/5967291
  • 深度学习在深度(视差)估计中的应用(2) https://www.vincentqin.tech/posts/depth-estimation-using-deeplearning-2/
  • 论文笔记:Unsupervised Monocular Depth Estimation with Left-Right Consistency http://www.yyliu.cn/post/c68cf6db.html
  • 读Unsupervised Monocular Depth Estimation with Left-Right Consistency https://zhuanlan.zhihu.com/p/29528596
  • 论文笔记-深度估计(5)Unsupervised Monocular Depth Estimation with Left-Right Consistency https://blog.csdn.net/Kevin_cc98/article/details/78945802

Unsupervised Monocular Depth Estimation With Left-Right Consistency 论文笔记相关推荐

  1. 无监督单目深度估计 Unsupervised Monocular Depth Estimation with Left-Right Consistency 论文方法分析

    最近在做深度估计相关的毕业设计,一般的基于深度学习单目深度估计算法都是基于监督学习的方法,也就是说我希望输入一张拍摄到的单目照片,将它通过卷积神经网络后生成一张深度图.在这个过程中我们就要求需要有大量 ...

  2. Unsupervised Monocular Depth Estimation From Light Field Image

    ** Unsupervised Monocular Depth Estimation From Light Field Image ** Network Architecture 在深入研究前人工作的 ...

  3. Deep Ordinal Regression Network for Monocular Depth Estimation 单目深度估计,论文阅读,DORN;视频笔记

    tags: 单目深度估计,论文阅读,DORN 原始论文是: Deep Ordinal Regression Network for Monocular Depth Estimation Huan Fu ...

  4. 3D Packing for Self-Supervised Monocular Depth Estimation

    动机: propose a novel self-supervised monocular depth estimation method combining geometry with a new ...

  5. 论文笔记-Towards Scene Understanding-Unsupervised Monocular Depth Estimation

    论文信息 标题: Towards Scene Understanding: Unsupervised Monocular Depth Estimation with Semantic-aware Re ...

  6. 单目深度估计(Monocular Depth Estimation)论文阅读 2021-01-15

    单目深度估计 问题公式化:求非线性映射函数 一.数据集: NYU Depth:视频序列和dense depth map通过RGB-D采集的,但是不是每一种图像都有深度图,因为映射是离散的. KITTI ...

  7. Unsupervised Monocular Depth and Ego-motion Learning with Structure and Semantics 之论文详解

    Unsupervised Monocular Depth and Ego-motion Learning with Structure and Semantics 1.论文详解 2.问题 1.如何理解 ...

  8. 单目深度估计 | Real-Time Monocular Depth Estimation using Synthetic Data 学习笔记

    文章目录 1. 摘要 2. 创新点和局限性 3 研究 3.1 阶段1-单目深度估计模型. 3.1.1 损失函数 3.1.2 训练细节 3.2 阶段2-通过风格迁移的域自适应 3.2.1 损失函数 3. ...

  9. Towards Robust Monocular Depth Estimation:Mixing Datasets for Zero-shot Cross-dataset Transfer——阅读阶段

    相关申明 项目地址 @article{Ranftl2020,author = {Ren\'{e} Ranftl and Katrin Lasinger and David Hafner and Kon ...

最新文章

  1. win2000.win2003关闭端口详解--防黑必备
  2. 夏瑞、陈程杰报告—科研神器TBtools 从“结识”到“结伴”(下午3点腾讯会议)...
  3. python平稳性检验_Python数据分析0.3 用statsmodels进行ADF平稳性检验
  4. 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局
  5. php通过实现excel导入,php实现excel导入数据
  6. C# base和this
  7. mysql数据库主从同步的原理_mysql数据库主从同步复制原理
  8. java scheduler_RxJava Scheduler介绍
  9. 管理感悟:主管加班,员工才会加班
  10. 数字孪生管理系统,智慧校园建设规划方案
  11. 秋招历险记-计算机网络篇
  12. JS_综合,全面性增删改查,多条件查询,排序,点击发货
  13. java正则表达式多行匹配,正则表达式多行匹配 - Wangle_OP的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. 临近下班又开会,熬夜加班写纪要,语音转写还收费……
  15. 计算机软件工具有哪些,电脑绘画的软件工具有哪些?
  16. 石英晶体谐振器的应用指南
  17. HIS各模块业务操作流程明白纸
  18. 高精度仿凡客VANCL 商品属性代码
  19. JavaScript基础三部曲(一):JavaScript简介及ECMAScript部分
  20. 微信小程序+java后台实现openid获取

热门文章

  1. Windows Mobile SDK例子浅析
  2. 指望国内应用商店发财是痴人说梦
  3. python编译器是用来干嘛的-python编译器和解释器的区别是什么
  4. 电赛笔记——风力摆 硬件篇
  5. android studio环境配置
  6. 前端面试题(附答案)持续更新中……
  7. 白帽SEO,黑帽SEO,灰帽SEO是什么
  8. 畅游C++ Boost Serialization 序列化
  9. Docker - 镜像的分层 - busybox镜像制作
  10. ts10_2Univariate TS模型_pAcf_bokeh_AIC_BIC_combine seasonal_decompose twinx ylabel_bold partial title