精华内容
下载资源
问答
  • 复杂系统突现论》读后

    千次阅读 2018-08-29 07:00:00
    应石头兄弟之邀,想从复杂性的视角看一下从微服务到service mesh 的演进,没想到复杂性本身就是一个难点,于是找来了一本关于复杂性的书,希望从中能够对复杂性有一些进一步的认识。   (来自百度百科) 复杂...

    应石头兄弟之邀,想从复杂性的视角看一下从微服务到service mesh 的演进,没想到复杂性本身就是一个难点,于是找来了一本关于复杂性的书,希望从中能够对复杂性有一些进一步的认识。

     

    640?wx_fmt=jpeg

    (来自百度百科)

    复杂性是当代科学的一个前沿和热点,具有跨学科综合性的趋势。不幸的是,复杂系统理论仍在等待它的牛顿。复杂性实际上就是一门关于突现的科学,而系统思想主要有三组概念:突现与等级,通讯与控制,进化与自组织, 这可能就是所谓的动力学机理。软件领域的复杂性不应该局限在计算复杂度上,是否可以从更宽的维度和视角看待软件产品的复杂性呢?

     

    突现论可以追溯到“整体不等于部分之和”或“整体大于部分之和”。这个整体具有的一些性质是所有组成部分所不具有的,这时可以称为整体大于部分之和。合成效应可以逻辑地从部分的效应中推出,是可预测的,而异质效应是不可预测的。突现性是宏观层次所拥有的一种不可还原的根本性质。

    640?wx_fmt=jpeg

    插件化,微服务,service mesh 是否是突现的一种结果呢?

     

    一般系统理论强调和突显了四个观点:整体性、有机性、动态性和有序性。子系统的系统作用形成序参量,是决定系统特征和系统演化的主要参量,是微观子系统相互作用在临界条件下形成的,它们在微观层次上完全不能被理解。

    640?wx_fmt=jpeg

    系统向临界点方向组织其本身,在临界点,单个的事件具有了最为广泛的可能效应范围,也就是说,系统向最优地敏感于外部输入的方向调节其自身。软件系统包括整体开发流程的序参量是怎样的呢?

     

    复杂自然现象是在层级中被组织起来的,其中每一个层次都是由若干个整合系统构建起来的。软件系统不同层次的演进是怎样的呢?

    640?wx_fmt=jpeg

     

    从控制论的视角看,突现(创新)是由于高层次的行为控制了低层次的基准信息的结果,就是产生高层控制系统的“元系统跃迁”。

     

    640?wx_fmt=jpeg

    一个元系统跃迁是新控制层级的突现,常常伴随着先前存在的许多系统的磨合,是一个创造新行动者的特殊类型的活动,一个行动导致了新行动者的突现。人类认知的11个控制层级包括:

    • 强度 intensities

    • 感觉 sensation

    • 构型 configuration

    • 转换 Transitions

    • 事件 Events

    • 关系 relationship

    • 范畴 category

    • 序列 sequence

    • 程序 program

    • 原理 principle

    • 系统概念  system concepts

    无独有偶,宇宙的维度好像也是11维,是与人的认知相吻合吗?

     

    科学没有哲学是盲目的,哲学没有科学是无效的。计算机模拟是研究复杂系统突现的一种重要方法。根据复杂性对系统的分类为:

    1. 静态结构

    2. 简单动力系统或平衡有序结构系统

    3. 开放系统

    4. 控制系统

    5. 自组织系统

    6. 复杂适应系统

     

    复杂系统突现的4个特征:全局模式的整体序或宏观序,从简单生成复杂的新颖性,非迭代模拟的不可推导性和不可预测性,层次之间的不可还原性。

     

    自组织是高层次结构或功能模式的自发形成,它是通过低层次客体之间的相互作用而产生的突现,由于局域相互作用而导致的一个全局相干模式的自发创生和自发突现。自组织机理侧重于揭示系统的组分之间的内部关系,以及由此突现的动力学行为,而适应性造就了复杂性的动力学模型。

    640?wx_fmt=jpeg

    那么,软件系统的适应性呢?

     

    自组织系统主要是一种分布式系统,分布式控制的优势在于强健性、弹性和自主性。元素之间相互作用的状态,对元素起到了一种限制和约束的作用。它限制了系统的变化,限制了元素的自由度和随机性,把它们约束在一定的时间、空间和形态范围里,从而形成了某种稳定的结构模式和构型,并与其它系统或环境区分开来。

    640?wx_fmt=jpeg

    开发团队的自组织性 还是 软件系统自身的自组织性呢?

     

    突现是指在复杂系统的自组织过程中出现的、新颖的和连贯的结构、模式和性质,相对于它们所出现的微观层次的组成部分和过程,突现现象是在宏观层次上出现的现象,是一种动态的结构,一种动力学秩序(过程的结构)。

     

    突现都是正向的吗?会产生负创新么?

    软件系统演进的下一个突现会是什么呢?

    会出现在哪个层级上呢?

    ......

     

    就象波普尔知识进化图示中所描述的那样,从一个问题到另一个问题。

     

    640?wx_fmt=jpeg

     

    展开全文
  • 由于各种现实问题,例如遮挡,大的无纹理区域(例如天空,墙壁等),反射表面(例如窗户),薄结构和重复纹理,这是具有挑战的。本文主要对基于深度学习的双目匹配与视差估计方法进行调研。 2 方法 对于一对...

     

    1 现状

    从立体图像中估计深度信息对于计算机视觉的应用至关重要,包括车辆的自动驾驶,3D模型重建和物体的检测与识别。由于各种现实问题,例如遮挡,大的无纹理区域(例如天空,墙壁等),反射表面(例如窗户),薄结构和重复纹理,这是具有挑战性的。本文主要对基于深度学习的双目匹配与视差估计方法进行调研。

    2 方法

        对于一对矫正过的立体图像,深度信息估计的目标就是计算参考图像上每一个像素点的视差值d。视差值就是左右两幅图像上对应点之间在水平方向上的位置差。对于左图中的像素点(x,y),它在右图中对应点的坐标为(x-d,y),这个点的深度值可以通过fB/d来计算,其中f是摄像机的焦距,B是两个相机中心之间的距离。因此,深度精度随着视差预测的精度而提高。

        传统的立体匹配流程通常包括以下四个步骤的全部或部分,匹配代价计算,代价聚合,视差优化和后处理。 匹配代价计算为左图像块和可能的对应右图像块提供初始相似性度量,这是立体匹配的关键步骤。 一些常见的匹配代价包括绝对差值(SAD),平方差和(SSD)和归一化互相关(NCC)。 代价聚合和优化步骤结合了上下文匹配代价和正则化项,以获得更强大的视差预测。

        当前最前沿的研究聚焦于如何利用CNNs准确的计算匹配代价和如何利用半全局匹配(SGM)去优化视差图。例如利用网络学习预测图块之间的相似性,并采用经典的立体匹配流程,包括代价聚合,SGM和其他视差优化方法来提高匹配结果。还有一些研究聚焦于视差图的后处理方面。近期,用于预测整个视差图并不用后处理的端到端的网络得到极大发展。

    3.1 传统方法

        双目立体匹配可划分为四个步骤:匹配代价计算、代价聚合、视差计算和视差优化。

    Step1 匹配代价计算

        匹配代价计算的目的是衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。

      每个像素在搜索同名点之前,往往会指定一个视差搜索范围D(Dmin ~ Dmax),视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。

        匹配代价计算的方法有很多,传统的摄影测量中,使用灰度绝对值差(AD,Absolute Differences)、灰度绝对值差之和(SAD,Sum of Absolute Differences)、归一化相关系数(NCC,Normalized Cross-correlation)等方法来计算两个像素的匹配代价;计算机视觉中,多使用互信息(MI,Mutual Information)法、Census变换(CT,Census Transform)法、Rank变换(RT, Rank Transform)法、BT(Birchfield and Tomasi)法等作为匹配代价的计算方法。不同的代价计算算法都有各自的特点,对各类数据的表现也不尽相同,选择合适的匹配代价计算函数是立体匹配中不可忽视的关键步骤。

        下图为DSI示意图(C(x,y,d)代表像素(x,y)在视差为d时的匹配代价):

    Step2 代价聚合

       代价聚合的根本目的是让代价值能够准确的反映像素之间的相关性。上一步匹配代价的计算往往只会考虑局部信息,通过两个像素邻域内一定大小的窗口内的像素信息来计算代价值,这很容易受到影像噪声的影响,而且当影像处于弱纹理或重复纹理区域,这个代价值极有可能无法准确的反映像素之间的相关性,直接表现就是真实同名点的代价值非最小。

        而代价聚合则是建立邻接像素之间的联系,以一定的准则,如相邻像素应该具有连续的视差值,来对代价矩阵进行优化,这种优化往往是全局的,每个像素在某个视差下的新代价值都会根据其相邻像素在同一视差值或者附近视差值下的代价值来重新计算,得到新的DSI,用矩阵S来表示。

        实际上代价聚合类似于一种视差传播步骤,信噪比高的区域匹配效果好,初始代价能够很好的反映相关性,可以更准确的得到最优视差值,通过代价聚合传播至信噪比低、匹配效果不好的区域,最终使所有影像的代价值都能够准确反映真实相关性。常用的代价聚合方法有扫描线法、动态规划法、SGM算法中的路径聚合法等。

        下图为代价聚合前后视差图示意图:

    Step3 视差计算

        视差计算即通过代价聚合之后的代价矩阵S来确定每个像素的最优视差值,通常使用赢家通吃算法(WTA,Winner-Takes-All)来计算,如下图所示,即某个像素的所有视差下的代价值中,选择最小代价值所对应的视差作为最优视差。这一步非常简单,这意味着聚合代价矩阵S的值必须能够准确的反映像素之间的相关性,也表明上一步代价聚合步骤是立体匹配中极为关键的步骤,直接决定了算法的准确性。

    Step4 视差优化

        视差优化的目的是对上一步得到的视差图进行进一步优化,改善视差图的质量,包括剔除错误视差、适当平滑以及子像素精度优化等步骤,一般采用左右一致性检查(Left-Right Check)算法剔除因为遮挡和噪声而导致的错误视差;采用剔除小连通区域算法来剔除孤立异常点;采用中值滤波(Median Filter)、双边滤波(Bilateral Filter)等平滑算法对视差图进行平滑;另外还有一些有效提高视差图质量的方法如鲁棒平面拟合(Robust Plane Fitting)、亮度一致性约束(Intensity Consistent)、局部一致性约束(Locally Consistent)等也常被使用。

        由于WTA算法所得到的视差值是整像素精度,为了获得更高的子像素精度,需要对视差值进行进一步的子像素细化,常用的子像素细化方法是一元二次曲线拟合法,通过最优视差下的代价值以及左右两个视差下的代价值拟合一条一元二次曲线,取二次曲线的极小值点所代表的视差值为子像素视差值。如下图所示。

        局部匹配算法的步骤一般包括匹配代价计算、代价聚合和视差计算三个步骤,全局算法则包括匹配代价计算,视差计算与视差优化三个步骤,半全局算法SGM则四个步骤都有。

    3.2 深度学习方法

    1. GC-Net(iccv2017)

        本文使用了3D卷积的概念去获得更多的上下文信息,并采用回归的方法去预测视差值,不再使用传统的成本聚合,视差计算,视差优化的方法,利用一个端到端的网络直接生成最终的视差图。这一思路无疑比传统的图块匹配的方法更加先进,而且不用再给图块设置标签,直接将预测结果与真实视差图进行比对,再将误差反向传播即可,后来的许多网络都采用了这一思路。

        下图是定义的GC-Net网络框图,上下文在3D卷积中体现,而几何特性在左右图像合并在成本容积(cost volume)时候引入。

    匹配代价卷(Cost Volume)

        对于每一幅立体图像,我们都构建了一个四维的匹配代价卷(高度、宽度、最大视差+1(0~maxdisp)、特征图数目)。我们将左图的每一个一元特征和右图每一个视差下的特征图级联起来,并封装成一个四维的代价卷。(对于某一个特征,匹配代价卷就是一个三维的方块,第一层是视差为0时的特征图,第二层是视差为1时的特征图,以此类推共有最大视差+1层,长和宽分别是特征图的尺寸,假设一共提取了10个特征,则有10个这样的三维方块)。

    可微分的Argmin

        我们定义了一种柔性Argmin方法,它既是完全可微的,又能回归得到一个光滑的视差估计值。首先,我们通过将匹配代价值Cd(对于每个视差d)取负数,把匹配代价卷转换为可能性卷(匹配代价越高,可能性越低),我们利用softmax操作σ(⋅)对可能性卷在视差维度上进行正则化。然后对每个视差值d进行加权求和,权重就是他对应的可能性。数学定义如下: 

    实验结果

    Kitti2015 test results

    代码链接:https://github.com/LinHungShi/GCNetworktensorflow

    1. PSM-Net(cvpr2018)

        本文提出了PSMNet,一个金字塔立体匹配网络,它主要由两个模块组成:金字塔池化和3D卷积神经网络。金字塔池化模块通过聚合不同尺度和不同位置的环境信息构建匹配代价卷(cost volume)来充分利用全局环境信息。3D CNN通过将多个堆叠的沙漏网络(hourglass network)与中间监督(intermediate supervision)结合起来,去调整匹配代价卷。模型框架如图所示。

    估算视差图的方式同GC-Net的可微分的Argmin

    实验结果

    代码链接:https://github.com/JiaRenChang/PSMNetpytorch

    1. SegStereo(eccv2018)

       本文将语义特征嵌入特征图中,并将规则化的语义信息作为损失项来改善视差学习效果。

    SegStereo架构如下图:我们从输入的立体图像中提取中间特征Fl和Fr。通过correlation算子计算匹配代价卷Fc。左分割特征图Fls整合到视差分支中作为嵌入的语义特征。右分割特征图warp到左图视角,以实现每个像素的语义预测。所有的步骤都是为了结合语义信息来改善视差估计效果。

        SegStereo网络能够实现无监督或有监督学习,通过光度损失Lp或视差回归损失Lr。

        目标函数分为无监督模式和有监督模式两种。无监督系统的整体损失函数Lunsup包括光度损失Lp,平滑损失Ls和语义信息损失Lseg。其中平滑损失是对视差图的梯度采用L1惩罚项。要说明的是在损失计算中没有用到真实的视差值因此视差估计被认为是无监督学习过程(语义损失计算需要真实标签值);有监督系统的整体损失函数Lsup包括视差图回归损失Lr,平滑损失Ls和语义信息损失Lseg。

    实验结果

        SegStereo模型可以获得更加可靠的结果,尤其是在模糊的区域。

    代码链接:https://github.com/yangguorun/SegStereo  (only tested with caffe)

    1. DeepPruner(iccv2019)

        本文的目标是大大加快当前最先进的立体匹配算法的运行速度,以实现实时推理。文章提出可区分的Patch Match模块,该模块能够丢弃大部分disparity,而无需进行全面的成本量评估。然后,利用此表示,来了解每个像素的修剪范围。通过逐步减少搜索空间并有效地传播此类信息,能够针对高可能性假设有效地计算成本量,并节省内存和计算量。最后,利用图像引导的优化模块来进一步提高性能。实验表明,此方法在KITTI和SceneFlow数据集上以62ms的速度实时运行时取得了竞争性结果。其网络结构如图所示:

    概述:给定一对立体图像,首先提取深度多尺度特征。 然后,利用可微的Patch Match估计每个像素的一小部分视差,并利用置信度范围预测因子进一步修剪解决方案空间。

    Differentiable PatchMatch

    1.粒子采样层:对于每个像素i,我们根据预测/预定义搜索空间上的均匀分布,随机生成k个视差值;

    2.传播层:来自相邻像素的粒子,通过卷积与预定义的,单热滤镜模式一起传播(见图3),该模式编码了一个事实,即我们允许每个像素将粒子传播到其4邻域。

    3.评估层:对于每个像素i,通过获取左特征和右特征之间的内积来计算匹配分数:Si,j=(f0(i),f1(i+di,j)),对于所有候选项j。每个像素的最佳k视差值将进行下一次迭代。

    图2描绘了一个递归步骤的计算图,该步骤结合了传播和评估:

    实验结果

       本文方法可以快速地为每个像素修剪成本体积的一部分,而不需要充分评估其匹配分数。实验表明,我们的模型在实时方法中取得了最好的性能,并与性能最好的方法进行了比较,同时保持了几倍的速度。

    代码链接:https://github.com/uber-research/DeepPruner/tree/master/deeppruner(pytorch)

    1. GwcNet(cvpr2019)(值得一读)

        立体匹配估计矫正过的图像对之间的视差,这对深度感测,自动驾驶和其他相关任务非常重要。先前的工作建立了在所有视差水平上具有交叉相关或串联左右特征的代价量,然后利用2D或3D卷积神经网络来回归视差图。在本文中,我们建议通过分组相关来构建代价量。左边特征和右边特征沿着通道维度被分成组,并且在每个组之间计算相关图以获得多个匹配代价提议,然后将其打包到代价量中。分组相关为测量特征相似性提供了有效的表示,并且不会丢失过多的信息(如完全相关)。与以前的方法相比,它在减少参数时也能保持更好的性能。在先前的工作中提出的3D堆叠沙漏网络被改进以提高性能并降低推理计算成本。

        GwcNet扩展了PSMNet,具有分组相关代价量和改进的3D堆叠沙漏网络。在PSMNet中,必须通过3D聚合网络从头开始学习级联特征的匹配代价,这通常需要更多的参数和计算成本。 相比之下,完全相关(DispNetC)提供了一种通过点积测量特征相似性的有效方法,但它丢失了很多信息。我们提出的分组相关性克服了这两个缺点,并为相似性度量提供了良好的特征。

    实验结果

    代码链接:https://github.com/xy-guo/GwcNet(pytorch)

    1. GA-Net(cvpr2019)

        传统的半全局匹配(SGM)和代价过滤都是强大而有效的代价聚合方法,但是它们不是可微的,不能以端到端的方式轻松训练。本文提出了两种新的神经网络层:第一种是半全局聚合层,它是半全局匹配的可微近似(在整个图像上聚合不同方向的匹配代价,这使得能够在遮挡区域或大的无纹理/反射区域中进行精确估计);第二种是局部引导聚合层(处理薄结构和对象边缘,以便恢复由下采样和上采样层引起的细节损失),它遵循传统的成本过滤策略来精炼细结构。这两个层可用于代替广泛使用的3D卷积层(其具有立方计算/存储器复杂性,因此计算成本高并且消耗存储器)。实验表明,具有双层引导聚合块的网络容易胜过具有19个3D卷积层的最先进的GC-Net。

    实验结果

    代码链接:https://github.com/feihuzhang/GANet(pytorch

     

    小结:

    速度+精度-:DeepPruner(0.182s)

    速度-精度+:GwcNet(0.32s)

    4 数据集

    SceneFlow:是合成立体数据集的数据集集合,由Flyingthings3D,Driving和Monkaa组成。包含35454个训练和4370个测试立体对的ground truth视差图(H=540,W=960)。通常使用端点误差(EPE)作为SceneFlow数据集的评估指标。

    FlyingThings3D:是用于场景匹配的虚拟数据集,包括光流估计和视差预测。该数据集由具有背景对象和3D模型的计算机图形技术提供。它提供22,390张用于训练的图像,4,370张用于测试的图像。

    KITTI 2012包括从测试车辆收集的具有挑战性且变化多样的道路场景图像,为训练图像提供稀疏的LIDAR ground truth视差图。包括194个训练图像对和195个测试图像对。

    KITTI 2015包括200个训练图像对和200个测试图像对(H=376,W=1240)。ground truth视差图是通过使用Velodyne HDL-64E激光扫描仪收集的激光雷达点获得的。与KITTI 2012不同,动态场景存在密集的真实视差。

    CityScapes城市场景图,它提供了校正后的立体图像对和由SGM算法预先计算的相应视差图。它包含用于左视图的5,000个高质量像素级精细map注释。包括2975、500和1525的数量进行训练,验证和测试。 此外,该数据集在额外的训练集中提供了19997个立体图像及其SGM标签。

    Middlebury具有多个手工布局的室内场景。与KITTI数据集相比,视差图由结构光捕获,具有更高密度和精度。

    附:

    相关代价量的计算

    1.在DispNetC之后,有很多工作直接从相关代价量中回归差异图。 给定左和右特征图fl和fr,计算每个视差水平d的相关代价量,

    是两个特征向量的内积,Nc表示通道数。

    2.最近的工作采用了基于串联的特征量和3D聚合网络,以实现更好的上下文聚合。 肯德尔等人提出了GC-Net并且是第一个使用3D卷积网络来汇总代价量的人。 左侧和右侧特征fl,fr不是直接给出代价量,而是连接在一起形成4D特征量,

    度量标准

    EPE终点误差,即以像素为单位的平均视差误差。

    D1:异常值被定义为其视差误差大于max(3px,0.05d*)的像素,其中d*表示ground truth。

    损失函数

    一般采用平滑的L1损失函数来训练模型。 与L2损失相比,平滑L1在视差不连续处是鲁棒的并且对异常值或噪声具有低灵敏度。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    无监督/自监督:

        有监督方法基于大量精准的ground truth disparity和stereo image pairs。这些数据难以获取,所以这些方法一般用合成数据。虽然合成数据越来越真实,但是需要为每个应用人工创建新内容。接下来介绍不需要用到真实视差图的无监督/自监督的深度学习方法。

     

    (单目)

    1. Unsupervised Monocular Depth Estimation with Left-Right Consistency(cvpr2017)

        网络通过推测视差将左图warp来匹配右图。可以只用左图同时预测两个视差,用左右一致性来增强它。通过采用双线性采样(Spatial Transform Networks)来生成图像,整个网络完全可微

        如下图所示:

     

    Naïve:从左图采样,生成与目标右图对齐的视差图。

    NO LR:从右图采样输出与左图对齐的视差图。这么做的话,被推断出来的视差图表现出“纹理拷贝”人工合成和深度图连续性上面误差。

    Ours: 单个左图作为卷积神经网络的输入,同时推断出左图视差和右图视差,右图只在训练时候使用。用左右图一致性损失增强左右视差图的一致性可以让结果更准确。

    Loss

        由外观匹配loss,视差平滑loss以及左右一致性loss组成.

        Appearance Matching Loss:

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

        Disparity Smoothness Loss:

        Left-Right Disparity Consistency Loss:

    最后的训练损失:

    其中每一项都包换左右视图,但是只有左图会喂到卷积层中。s代表尺度,本文选取4个尺度,组成总体损失:

        在测试的时候,网络在最好的尺度层预测左图视差图,它的分辨率和输入图像一样。

    后处理

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

    注:单目深度估计,实验与双目视差估计有出入,实验结果不再贴出。

    代码链接:https://github.com/mrharicot/monodepth(tensorflow)

    1. Dual CNN(cvpr2018)

        文章提出多loss网络结构,包括6个loss(DNM6)和扩展的12个loss(DNM12)。

    DNM6

    Loss

        由外观匹配loss,视差平滑loss以及左右一致性loss组成,每个loss包括左和右网络,所以可细分为6个loss。

        Appearance Matching loss:

             Disparity Smoothness Loss:

        Left Right Consistency Loss:

        为了使损失函数更具鲁棒性,文中采用了左右两个网络的四个输出尺度:

     

     

    DNM12

        DNM6的左右视差图由左右网络分为独立生成,而DNM12提出了左右交叉视差图:

    Loss

        外观匹配loss,视差平滑loss以及左右一致性loss分别扩展为4个loss,所以可细分为12个loss。

        Appearance Matching loss:

        Disparity Smoothness Loss:

        Left Right Consistency Loss:

    代码链接:https://github.com/ishmav16/Dual-CNN-Models-for-Unsupervised-Monocular-Depth-Estimation (tensorflow with only tested

     

    (被动双目)

    1. SsSMnet(cvpr2017)

        网络以自我学习的方式端到端训练,只需一对立体图像对作为输入,无需ground truth视差图或其他标签。网络可以以两种不同的模式应用:一种是传统模式,其中训练阶段和测试阶段明显分开,并且在测试阶段,网络的所有参数都被固定。 另一种模式是我们所谓的“自我改进”模式,该模式允许网络在新的立体声图像上进行测试时,不断调整其参数。后一种模式有效地使我们的网络能够适应新的前所未有的场景图。

    对于给定的左图以及右图视差,warp的右图为:

     

    Loss:

        其中Lm对处理无纹理区域提供了强大的正则化。各项具体定义见paper。

    实验结果

        小结:精度比传统方法有很大的提升,并且与先进的监督学习方法比较接近。

     

    (主动双目)

    1. ActiveStereoNet(eccv2018)

        本文首次提出了第一个主动双目视觉系统的深度学习解决方案 ActiveStereoNet。由于缺乏 ground truth,本文采用了完全自监督的方法,即使如此,本方法克服了过度平滑的问题,保留了边缘,并且能有效处理遮挡。

    深度传感器

     

    TOF系统受运动伪影和多路径干扰的影响。

    结构光容易受到环境光和多设备干扰的影响。

    在需要昂贵的全局优化技术的无纹理区域,尤其是在传统的基于非学习的方法中,被动式立体斗争尤为突出。

    还有一种深度传感器类型提供了潜在的解决方案,那就是主动立体系统。使用红外立体摄像机对,伪随机模式通过模式化的IR光源将场景投射到纹理上。 通过适当选择波长感应,摄像机对可捕获主动照明和被动光的组合,从而改善结构光的质量,可同时在室内和室外场景中提供强大的解决方案。

    网络结构

        ActiveStereoNet的输入是具有主动照明的经过校正的同步图像对,输出是原始分辨率下的一对视差图。

        算法采用两阶段模型, 首先建立一个低分辨率的成本项并进行的第一次视差估计。然后进行双线性采样,其后跟一个残差网络来预测最终的误差。 还对“失效网络”(底部)进行了端到端培训,以预测置信度图。

        最后的残差细化检索高频细节(即边缘)。 ActiveStereoNet还可以同时估算一个失效掩码,以去除最终结果中的不确定区域。

    Loss

        作者声称,尽管loss的一个可行选择是光度误差,但由于强度和视差之间的相关性很高(明亮的像素比暗点的像素更容易产生较大的残差),因此它不适用于active的情况。 

        提出了一种局部对比度归一化(LCN)方案,该方案不仅消除了强度和视差之间的依赖性,而且在被遮挡区域中提供了更好的残差:

    计算围绕每个像素的9×9小块中的局部均值µ和标准偏差σ,其中η是一个小常数,防止除零

     

    现在将左图像I上原始像素与重建的左图像I^之间的光度损失重新计算如下:

    重新对光度损失进行加权,以使标准偏差σ接近零的低纹理区域不会放大任何残差以及两个匹配像素之间的噪声。

    窗口优化

       传统的立体匹配使用自适应的支持窗口(ASW),进行成本聚合,这虽然有效但是却非常慢,本文提议在训练过程中使用 ASW 方案,因此他不影响运行时的成本。使用一个2Kx2K窗口大小的聚合成本:

    失效网络

        到目前为止,提出的loss还没有解决被遮挡的区域和错误的匹配(即无纹理的区域)的问题。 遮挡区域并不能在成本项中提供任何有效的信息。

        为了解决遮挡问题,ActiveStereoNet使用了传统立体声匹配方法(称为左右一致性检查)的改进版本。 从左和右视点(分别为d_1和d_r)计算出的视差用于定义像素p(i,j)的mask:

    m_ij = 0的那些像素在loss计算中被忽略,作为失效网络的副产品,ActiveStereoNet获得深度估计的置信度图。

    展开全文
  • 笔记:复杂网络的关键技术及应用

    千次阅读 2016-12-05 12:41:34
    1.复杂网络与图 复杂网络与图是同一种事物,由节点和连边构成。图是数学领域的研究...2. 复杂性 哲学思想还原论认为万事万物都有更基本的元素构成,通过研究更基本的元素可以理解复杂的整体,这个思想已经取得了许多

    点击查看原网页,下面写的是个人总结

    1.复杂网络与图

    复杂网络与图是同一种事物,由节点和连边构成。图是数学领域的研究内容,“图论”的算法是普适性的,侧重于理论。复杂网络侧重于工程,是将“图论”的理论带入到现实的生活生产中,结合图算法理论、应用场景以及科学技术等方面能力,帮助观察和理解真实的客观世界。

    2. 复杂性

    哲学思想还原论认为万事万物都有更基本的元素构成,通过研究更基本的元素可以理解复杂的整体,这个思想已经取得了许多成果,比较突出的有基因工程等。
    不过,有时从简单的元素入手却不能理解复杂的整体,比如一只蚂蚁与蚁群的行为,说明现实世界系统具有“复杂性”,而复杂性背后是网络关联。

    具有自组织、自相似、吸引子、小世界、无标度中部分或全部性质的网络称为复杂网络。(钱学森)

    复杂网络主要有以下几个特点:
      第1,结构复杂,不用解释太多,自然界就是复杂的,抽象出来的网络也是复杂的。
      第2,网络进化,世界在发展,代表它的网络也是在变化,网络中会不断地产生新的节点,也会产生新的关系,同样,也会在消失着一些节点和关系。今天我们是朋友,明天你们和他们也会成为朋友。
      第3,连接多样,连接边不是只代表一种类别的关系,只要能代表事物和事物之间关系的都可以描述成边,只要是属于我们所要研究范畴的。你和她是朋友关系,也可能还存在着同事关系。
      第4,动力学复杂性,它代表一种动态的特性,事物之间的影响是可以传播的,一个事物发生了改变,可能会影响与它有关联的其它事物的改变,并将这种改变传播出去,把这种传播变成可计算化,正是动力学所要研究的方向。
      第5,多重复杂性结合,正是多种事物相互关联和互相影响,体现出它的变化复杂性和未知性,未来发展趋势,并非一个简单的线性公式所能解释的。
      第6,节点的多样性,和连接多样性一样,网络中的节点可以代表任何事物,只要是属于我们所要研究的范畴。


    3. 实现技术

    数据结构:矩阵结构与关系型数据库结构,矩阵结构效率更高(NoSQL数据库),关系型结构信息更完善。Neo4j图查询数据库,适合中小规模的图。

    大数据:分布式存储与分布式处理。为实现分布式需切分网络,常用切分有三种:

    按点切,切度值大的节点;

    按边切,切弱连接;

    随机切,结构不明显的网络可用,不太实用。

    可行方案:基于Hadoop+Spark技术,把算法转换为分布式计算,在集群上运行。

    大规模图查询展现:InfiniteGraph、OrientDB、InfoGrid和HypergraphDB等

    4. 应用

    社团检测:潜在客户挖掘、关联群体风险分析等;

    网络中心性分析:网页排名(PageRank),供应链核心企业识别,信息传播枢纽节点识别等;

    网络传播预测:流行病传播,金融风险传播,舆论传播;

    网络关系渗透:节点之间的关系(三度影响);

    关联交易分析及投融资黑洞:虚假交易,担保圈分析等。




    展开全文
  • 工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的抽象工厂方法的示例;java.net.URLStreamHandlerFactory 的 ...
            工厂方法模式的定义
            工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的工厂方法模式的示例;java.net.URLStreamHandlerFactory 的 createURLStreamHandler(String protocol)  也是工厂方法模式的一个很经典的应用,URLStreamHandlerFactory 定义了一个用来创建 URLStreamHandler 实例的 createURLStreamHandler 方法,具体怎么创建?具体实现类说了算;此外,Java API 中工厂方法模式应用例子还有 java.net.ContentHandlerFactory、java.net.URL 的 openConnection 方法……。
            Gof 把工厂方法模式归类到对象创建型模式,《设计模式:可复用面向对象软件的基础》对工厂方法模式做出了明确的定义:"Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses." 翻译过来就是:"为创建一个对象定义一个接口,但把具体创建哪个类的实例留给子类决定。工厂方法允许将一个类的初始化延迟到自己的子类。"
            Why 工厂方法模式?
            通过使用工厂方法创建对象,我们可以避免客户端代码依赖于它所使用的接口的具体实现。客户端不再需要把对象创建的构造方法注入到自己的代码中去,客户端只需要调用工厂,由工厂来决定符合要求的子类的创建过程。此外,工厂方法还可以满足每次构造不同对象、对象的构造很复杂、对象的构造依赖具体环境等等需求。
            工厂方法模式的使用场合
    • 客户端不知道它要创建的具体是哪一个子类。
    • 一个类想要由自己的子类来定义某对象的创建过程。
    • 类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。
            工厂方法模式 VS 简单工厂模式
    • 简单工厂又称"静态工厂",顾名思义,这是工厂方法和简单工厂最大的不同,这也是最容易区分开这两种模式的特征。
    • 虽然两者都志在对象创建的局部封装,但简单工厂侧重于创建对象的代码复用,或者已创建实例的复用,或者创建实例的统一性;而工厂方法侧重于子类自己特定创建逻辑的实现。
    • 简单工厂模式中的工厂类是为产品类实例化的核心,而工厂方法模式把初始化工作交给子类实现。换句话讲,如果有新产品添加,简单工厂需要修改自己的工厂类,而工厂方法只需增加新工厂子类 - 简单工厂对 OCP 原则的支持力度不如工厂方法。
            《Java Web 应用调用 C++ 加解密方法》需求
            众所周知,Java 对文件的加解密效能不如底层的 C/C++。为了提高程序性能,我们要用 Java 进行 JNI 调用底层的加解密方法。
            《Java Web 应用调用 C++ 加解密方法》分析
            既然牵涉底层调用,就应该考虑到程序跨平台的问题。另外,应用至少要能支持 Linux 和 Windows,以后还可能会部署在 mac。而且这些平台还分为 64 位和 32 位。因此我们要为每个平台都要准备一个加解密底层库,因为底层库位数不同并不兼容,所以每个平台下又要有两个库:32 位一个,64 位一个。
            每个库都应该有相应的类进行加载,比如本文工厂方法模式示例中的具体产品类之一的 com.defonds.cloud.tool.config.encrypt.EncryptorLinuxAmd64.java,也就是我们的加解密类,这个类写完并编译好之后,使用 shell 生成 com_defonds_cloud_tool_config_encrypt_EncryptorLinuxAmd64.h 头文件,C/C++ 程序员根据每个平台的头文件封装加解密库。
            加解密类的实例化,我们就用工厂方法模式管理起来。
            《Java Web 应用调用 C++ 加解密方法》类设计
    加解密需求类图
            《Java Web 应用调用 C++ 加解密方法》源码
            客户端类 EncryptorUtil 源码:
    package com.defonds.cloud.tool.config.util;
    
    
    import com.defonds.cloud.tool.config.encrypt.Encryptor;
    import com.defonds.cloud.tool.config.encrypt.factory.EncryptorFactory;
    import com.defonds.cloud.tool.config.encrypt.factory.EncryptorFactoryLinux;
    import com.defonds.cloud.tool.config.encrypt.factory.EncryptorFactoryMac;
    import com.defonds.cloud.tool.config.encrypt.factory.EncryptorFactoryWindows;
    
    
    public class EncryptorUtil {
    	private static String osName = System.getProperties().getProperty("os.name");
    	private static Encryptor encryptor;
    	static {
    		EncryptorFactory encryptorFactory;
    		if (osName.equals("Linux")) { // os is linux
    			encryptorFactory = new EncryptorFactoryLinux();
    		} else if (osName.contains("Windows")) { // os is windows
    			encryptorFactory = new EncryptorFactoryWindows();
    		} else { // os is mac
    			encryptorFactory = new EncryptorFactoryMac();
    		}
    		encryptor = encryptorFactory.getEncryptor();
    	}
    	
    	/**
    	 * 
    	 * @param content - the string to be encrypt or decrypt
    	 * @param flag - encrypt flag, true is encrypt, false is decrypt
    	 * @return - string after encrypt or decrypt
    	 */
    	public static String encryptorStr(String content, boolean flag) {
    		return EncryptorUtil.encryptor.encrypt(content, flag);
    	}
    	
    }

            产品 Encryptor 接口:
    package com.defonds.cloud.tool.config.encrypt;
    
    
    public interface Encryptor {
    	/**
    	 * @param content str to be encrypted
    	 * @param flag true:encrypt false:decrypt
    	 * @return
    	 */
    	public String encrypt(String content, boolean flag);
    }

            具体产品类之一 EncryptorLinuxAmd64 源码(根据 EncryptorLinuxAmd64 写好的 libaesjni.so 库已放在 classpath 下的 /com/defonds/cloud/tool/config/encrypt/native/linux/amd64 目录中):
    package com.defonds.cloud.tool.config.encrypt;
    
    
    import java.io.IOException;
    
    
    import com.defonds.cloud.tool.config.util.NativeUtils;
    
    
    public class EncryptorLinuxAmd64 implements Encryptor {
    	// Native method declaration
        // use the keyword "native" indicate this is an 'unsafe' mtehod for java
        native String encryptStr(String content, boolean flag);
        
        // Load the library
        static {
            try {
        		System.loadLibrary("libaesjni");
        	}catch (UnsatisfiedLinkError e) {
                try {
    				NativeUtils.loadLibraryFromJar("/com/defonds/cloud/tool/config/encrypt/native/linux/amd64/libaesjni.so");
    			} catch (IOException e1) {
    				throw new RuntimeException(e1);
    			} // during runtime. .DLL within .JAR
        	}
        }
    
    
    	@Override
    	public String encrypt(String content, boolean flag) {
    		// TODO Auto-generated method stub
    		return this.encryptStr(content, flag);
    	}
    }

            工厂接口 EncryptorFactory:
    package com.defonds.cloud.tool.config.encrypt.factory;
    
    
    import com.defonds.cloud.tool.config.encrypt.Encryptor;
    
    
    public interface EncryptorFactory {
    	public Encryptor getEncryptor();
    }

            具体工厂类之一 EncryptorFactoryLinux 源码:
    package com.defonds.cloud.tool.config.encrypt.factory;
    
    
    import com.defonds.cloud.tool.config.encrypt.Encryptor;
    import com.defonds.cloud.tool.config.encrypt.EncryptorLinuxAmd64;
    import com.defonds.cloud.tool.config.encrypt.EncryptorLinuxI386;
    
    
    public class EncryptorFactoryLinux implements EncryptorFactory {
    	private static String osArch = System.getProperties().getProperty("os.arch");
    	
    	@Override
    	public Encryptor getEncryptor() {
    		if (osArch.equals("amd64")) { // os is linux amd64
    			return new EncryptorLinuxAmd64();
    		} else { // os is linux i386
    			return new EncryptorLinuxI386();
    		}
    	}
    
    
    }

            《Java Web 应用调用 C++ 加解密方法》测试
            测试代码如下:
    		String abc = "abc";
    		System.out.println("before encrypt:" + abc);
    		String abcEncrypted = EncryptorUtil.encryptorStr(abc, true);
    		System.out.println("after encrypt:" + abcEncrypted);
    		String abc2 = EncryptorUtil.encryptorStr(abcEncrypted, false);
    		System.out.println("after decrypt:" + abc2);

            运行结果:
    before encrypt:abc
    after encrypt:3a5dd7db74fdab404e980805b1998e81
    after decrypt:abc

            后记 1
            读者也许会发现,《Java Web 应用调用 C++ 加解密方法》用简单工厂模式也完全可以实现,甚至可能效果会更好(因为不用每次都 new 工厂对象了):
    public class EncryptorFactory {
    	private static Properties sp = System.getProperties(); 
    	private static String osName = sp.getProperty("os.name");
    	private static String osArch = sp.getProperty("os.arch");
    	private static int index2 = osName.indexOf("indows");
    	private static boolean isWindows = false;
    	static {
    		if (index2 != -1) {
    			isWindows = true;
    		} 
        }
    	
    	public static Encryptor getEncryptor() {
    		if (isWindows) { // os is windows
    			if (osArch.equals("amd64")) { // os is windows amd64
    				return new EncryptorWindowsAmd64();
    			} else { // os is windows x86
    				return new EncryptorWindowsX86();
    			}
    		} else { // os is linux
    			if (osArch.equals("amd64")) { // os is linux amd64
    				return new EncryptorLinuxAmd64();
    			} else { // os is linux i386
    				return new EncryptorLinuxI386();
    			}
    		}
    	}
    }

            本来嘛,简单工厂就是一个工厂方法的特例,GOF 甚至在 23 种设计模式里面就没有对其进行说明,而且很多文献里面也没有简单工厂的概念。那么到底什么时候用简单工厂呢?笔者建议,如果你能预测到所有产品类的情况,就用简单工厂,否则就工厂方法
            后记 2
            运行 jni 时,如果遇到类似于 java.lang.UnsatisfiedLinkError: /tmp/libaesjni_linux6345613888084265218.so: /tmp/libaesjni_linux6345613888084265218.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch) 的错误:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: /tmp/libaesjni_linux6345613888084265218.so: /tmp/libaesjni_linux6345613888084265218.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1747)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1643)
            at java.lang.Runtime.load0(Runtime.java:787)
            at java.lang.System.load(System.java:1022)
            at com.defonds.cloud.tool.config.util.NativeUtils.loadLibraryFromJar(NativeUtils.java:91)
            at com.defonds.cloud.tool.config.encrypt.EncryptorLinux.<clinit>(EncryptorLinux.java:20)
            at com.defonds.cloud.tool.config.util.EncryptorFactory.getEncryptor(EncryptorFactory.java:24)
            at com.defonds.cloud.tool.config.ConfigUtil.<clinit>(ConfigUtil.java:7)
            at TestTime.main(TestTime.java:26)

            解决办法:分别提供 64 位和 32 位库。
            后记 3
            如果 jni 时遇到以下错误:
    java: symbol lookup error: /tmp/libaesjni4570314921835538044.so: undefined symbol: aesrun
    java: symbol lookup error: /tmp/libaesjni8667398299924347273.so: undefined symbol: GetStringUTFChars

            解决办法:这是 C++ 调用了 C 的函数,编译规则不一样造成,把 C++ 代码 (cpp 后缀) 全部换成 C 代码,重新编译就好了。
            参考资料
    展开全文
  • 关于深度学习主要介绍以下几点:激活函数、防止过拟合方法、加速训练的方法 激活函数 深度学习中的激活函数主要有sigmoid、tanh、ReLu、Maxout函数等。 Sigmoid Tanh ReLu Maxout 防止过拟合 防止过拟合...
  • GPU优化方法

    千次阅读 2010-01-23 23:09:00
    在这里,“最短的时间”是指整个程序运行的时间,更侧重于计算的吞吐量,而不是单个数据的延迟。在开始考虑使用GPU和CPU协同计算之前,应该先粗略的评估使用CUDA是否能达到预想的效果,包括以下几个方面:精度:目前...
  • 关于举办“分子动力学模拟及第一原理计算方法与应用”系列培训班的通知 各有关单位: 分子动力学模拟、第一原理计算被广泛用于生命科学、化学工程、物理、医药、材料科学、电子学等领域。由于传统实验需要大量...
  • 复杂网络入门读物

    千次阅读 2015-11-22 10:09:18
    综合类专著中目前最全面的当属Newman的《网络引论》[1],最简洁的则是Dorogovtsev的《复杂网络讲义》[2]。2006年普林斯顿大学出过一本三巨头的专著,名字也很大气,叫做《网络结构与动力学》[3],但是不要有太高期望...
  • 流式数据分析处理的常规方法

    万次阅读 2018-04-16 20:56:43
    此书是分布式系统架构必读书,出版2017年,中文版目前还没有面世。我找了其中比较吸引我的那几章,阅读的同时,顺手翻译并记录了下来。这边是其中一章。当然前面也有几篇翻译加整理的文章,比如流量那几篇。 流式...
  • 产品读书《用户故事与敏捷方法

    千次阅读 2018-12-12 11:10:11
     前段时间连着看了许多有关提高工作效率的书籍(我管它叫工具书),比如说《金字塔原理》《刻意练习》《番茄工作法图解》《麦肯锡方法》《麦肯锡工作法:麦肯锡精英的39个工作习惯》《麦肯锡工作法:个人竞争力提升...
  • 本文是11月17日大数据杂谈群分享的内容。...大家好,我来自天云大数据公司,我叫马敬涛,主要从事数据科学应用方面的工作。今天我给大家分享的主题是...复杂网络概念及价值在开始之前,我先澄清一个概念,那就是“复杂网络
  • 软件界面设计思想方法

    万次阅读 2015-03-04 10:16:28
    15.1什么是好的软件界面 ...易用是指用户使用软件的容易程度。计算机软件诞生之初,主要用途是科学计算,那个时期几乎没有界面,只有计算机专业人员才能使用命令行来操作软件。之后出现了图形用户界面,例如Windo
  • 数据块一致检查的4种方法

    千次阅读 2012-12-08 11:10:00
    ㈠ 什么是数据块一致? 每一个数据块头部都有一个“校验和”字段 当数据块被写回磁盘前,Oracle会重新计算这个校验和 并记录到这个字段,最终写回磁盘 下次数据块被读入内存时,Oracle会重新计算数据块的校验和 并...
  • 请求优化方案(侧重HTTP优化)

    千次阅读 2019-01-14 17:29:33
    现在我把自己在项目中用过的方法再结合网上分享的方法综合的说一下可用的优化请求方案,希望可以帮到大家。 一.HTTP请求优化 1.静态资源优化 1.1 html结构优化 保证简洁、清晰的html结构,减少或避免多余的html标签...
  • 用于特征点描述符判别学习的 DeepDesc【19】:Simo-Serra 等人提出,该方法采用 Siamese 网络侧重训练难以区分 类别的样本,输入图像块对,将 CNN 输出的非线性 映射作为描述符,采用欧氏距离计算相似并最小 ...
  • 模型选择的一些基本思想和方法

    千次阅读 2017-05-20 11:51:47
    关于统计学习与机器学习的区别已经有不少讨论,不少人认为机器学习侧重于目标预测,而统计学习侧重于机制理解和建模。个人更加直观的理解是,统计学习侧重于从概率分布来描述数据生成机制,除了预测之外,还关心结果...
  • 目录1 统计模型(经验模型)1.1 模型分类(1)按衰落分类(2)按路径损耗和延迟拓展分类1.2 建模方法(1)方法一分类(2)方法二分类2 确定模型2.1 建模方法3 半确定模型3.1 建模方法4 思维导图PDF、xmind格式下载...
  • 1、 两者基本思想的比较 1.1结构化方法的基本思想 结构化方法是一种传统的软件开发方法,它是由结构化分析、结构化设计和结构...它的要点是是把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层...
  • 软件测试的基本方法

    千次阅读 2008-08-22 14:19:00
    软件测试方法在不同的书籍中可能有不同的分类,不同的叫法和不同的解释。...这里要讨论的基本软件测试方法主要侧重于软件功能的黑箱测试方法: 功能测试(Functionality Test),可接受测试(Acceptance T
  • 其实风险评估就是在充分掌握资料的基础之上,采用合适的方法对已识别风险进行系统分析和研究,评估风险发生的可能(概率)、造成损失的范围和严重程度(强度),为接下来选择适当的风险处理方法提供依据。...
  • 10个统计分析方法

    万次阅读 2018-06-01 15:42:14
    要想掌握更精巧复杂方法,你必须先理解较简单的方法;其次,当你想准确地评估一种分析方法的效果时,你得知道其运行的多好或者多么不好;第三,这是一个令人兴奋的研究领域,在科学、业界和金融领域有重要的应用。...
  • 微服务构建思路与方法

    千次阅读 多人点赞 2018-12-15 18:13:13
    微服务设计和构建则需要相应的理论功底,比如比较流行的DDD领域驱动设计方法,但领域驱动设计侧重业务领域,而且整个体系复杂,业务领域专家所设计的领域模型并不一定适合技术实现,需要技术人员的二次建模,最重要...
  • 结构化方法、面向对象方法的区别

    千次阅读 2016-06-22 09:32:16
    结构化方法、面向对象方法的区别 1.结构化方法遵循的基本原则 结构化方法的基本思想就是将待解决的问题看作一个系统从而用系统科学的思想方法来分析和解决问题结构化方法遵循以下基本原则 (1)抽象...
  • 不管是工业界还是学术界,机器学习都是一个炙手可热的方向,但是学术界和工业界对机器学习的研究各有侧重,学术界侧重于对机器学习理论的研究,工业界侧重于如何用机器学习来解决实际问题。我们结合美团在机器学习上
  • 渗透测试方法

    千次阅读 多人点赞 2021-03-28 10:00:47
    文章目录渗透测试方法论2.1 渗透测试的种类2.1.1 黑盒测试2.1.2 白盒测试2.2 脆弱评估与渗透测试2.3 安全测试方法论2.3.1 开源安全测试方法论(OSSTMM)2.3.2 信息系统安全评估框架2.3.3 开放式Web应用程序安全...
  • 「产品读书」俞军产品方法

    千次阅读 2017-05-31 19:36:22
    欲望的满足程度,我们能提供用户需要的东西 欲望来自心理感觉(来自马斯洛金字塔,有好奇,审美,名誉,权利,友谊,爱,闲暇…)、信念、情绪、认知(人们需要调节失调)、自尊取向(需要保持自我正确)、...
  • 复杂网络表示的原理,算法和应用

    千次阅读 2020-06-04 14:52:51
    图表示的挑战主要在于图数据规模的大幅度增长(如搜索引擎背后的知识图谱、大规模电商知识图谱可以达到 TB 甚至 PB 规模)以及图数据的复杂性(结点和边的相互作用,结点属性,图的高阶特征如子图等)。本文介绍清华...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,290
精华内容 15,316
关键字:

复杂性方法侧重于